2016-02-29 2 views
0

Кто-нибудь знает, как получить разницу между двумя ячейками с условием. Моя проблема в том, что если Column W содержит значение FAILED, тогда мне нужно получить разницу Column P и Column Q и положить разницу в Column Z. Затем я должен сделать это до последней строки, которая имеет данные в Column W. У меня есть этот код до сих пор:Получение разницы в ячейках

If ws.Range("W3") = "FAILED" Then 
    ws.Range("Z3") = ws.Range("P3") - ws.Range("Q3") 
Else 
    ws.Range("Z3") = "" 
End If 

ws.Range("Z3").Copy 
ws.Range("Z3:Z" & GetLastRow(ws)).PasteSpecial xlPasteValues 

Любая помощь? Благодаря!

+0

если вы хотите только разница между 2 колонками на основе третьего почему вы не используете формулу excel? и после копирования этой колонки с vba? –

+1

что именно не работает? –

+0

'IF' для проверки наличия данных' SUMIFS' для выполнения математики –

ответ

0
Sub GetDiff() 
Dim Ws As Worksheet, lRw As Long 

Set Ws = ActiveSheet 

Application.ScreenUpdating = False 

With Ws 
    lRw = .Range("W" & Rows.Count).End(xlUp).Row 
    With .Range("Z3:Z" & lRw) 
     .Formula = "=IF(W3=""Failed"",SUM(P3)-SUM(Q3),0)" 
     .Calculate 
     DoEvents 'This will let the formula to calculate before converting it to values 
     .Value = .Value 
    End With 
End With 

Application.ScreenUpdating = True 

End Sub 
+0

Это уже работает, но я хочу, чтобы значение '0' было просто пустым. У вас есть идеи, как это сделать? Благодаря! –

+1

Просто замените 0 на "" "" (Четыре двойных кавычки) – Sixthsense

0

Если вы действительно хотите сделать это в VBA, то вы можете изменить свой код:

Sub calc() 
    Dim ws As Object 
    Set ws = ActiveSheet 
    Row = 3 
    Do 
     If WorksheetFunction.CountA(ActiveSheet.Rows(Row)) = 0 Then Exit Do 'exit loop if row is empy 
     If ws.Cells(Row, 23).Text = "FAILED" Then 
      ws.Cells(Row, 26) = ws.Cells(Row, 16) - ws.Cells(Row, 17) 
     Else 
      ws.Cells(Row, 26) = "" 
     End If 
     Row = Row + 1 
    Loop 
End Sub 

Обратите внимание, я благоприятствуемой числовые ссылки на столбцы.

Но если вы не планируете перерасти в более сложном случае, я бы придерживаться формулы на колонке Z:

=IF(W1="FAILED",P1-Q1,"") 
+0

Прошу прощения, но если я отлаживаю код, я не вижу, что на самом деле происходит. Что, если я изменю это условие в 'Column X', которое имеет значение' FAILED'? и должен получить разницу «Столбец R» и «Столбец S» и поместить значение в «Column AA»? Любая помощь? Спасибо! –

+0

Возможно, вам сложно провести синтаксис '.Cells (RowNumber, ColumnNumber). Вы должны думать, что столбец 1 = 'A', столбец 2 = 'B' ... столбец 23 = 'W' ... столбец 26 = 'Z'. Поэтому 'ws.Cells (Row, 26)' относится к строке 'Row' и столбцу 'Z'. Чтобы изменить его на столбец «AA», вы вместо этого использовали бы «ws.Cells (Row, 27)». – dnep

+0

Если вы предпочитаете, вы можете использовать 'ws.Range (" Z "и Row) вместо' ws.Cells (Row, 26) '. – dnep