2016-05-04 27 views
0

任何人都可以幫助解決我的編碼問題嗎? If語句需要三個單獨的條件= true,或者它檢查下一個if語句並循環返回數組的所有單元格。沒有錯誤,所以很難確定問題,再加上我對VBA很陌生,所以可能有更好的方法來實現這一點。VBA如果和多個條件

注:數組中所需的單元格不是靜態的,因此Find。

Sub test() 
Dim i As Integer 
Dim col1 As Range, col2 As Range, col3 As Range, col4 As Range, col5 As Range, col6 As Range 
Dim c1arr, c2arr, c3arr, c4arr, c5arr, c6arr As Variant 

Set col1 = ActiveSheet.Cells.find("Reference", , xlValues, xlWhole) 
Set col2 = ActiveSheet.Cells.find("Amount", , xlValues, xlWhole) 
Set col3 = ActiveSheet.Cells.find("Action", , xlValues, xlWhole) 
Set col4 = ActiveSheet.Cells.find("Reference2", , xlValues, xlWhole) 
Set col5 = ActiveSheet.Cells.find("Amount2", , xlValues, xlWhole) 
Set col6 = ActiveSheet.Cells.find("Action2", , xlValues, xlWhole) 

lastrow = Cells(Rows.Count, col1.Column).End(xlUp).Row 

c1arr = Range(Cells(2, col1.Column), Cells(lastrow, col1.Column)).Value 
c2arr = Range(Cells(2, col2.Column), Cells(lastrow, col2.Column)).Value 
c3arr = Range(Cells(2, col3.Column), Cells(lastrow, col3.Column)).Value 
c4arr = Range(Cells(2, col4.Column), Cells(lastrow, col4.Column)).Value 
c5arr = Range(Cells(2, col5.Column), Cells(lastrow, col5.Column)).Value 
c6arr = Range(Cells(2, col6.Column), Cells(lastrow, col6.Column)).Value 

For i = 1 To UBound(c1arr) 
    If c2arr(i, 1) > 0 And c1arr(i, 1) = c4arr(i, 1) And c2arr(i, 1) = c5arr(i, 1) Then 
      c6arr(i, 1) = c3arr(i, 1) 
    ElseIf c2arr(i, 1) > 0 And c1arr(i, 1) <> c4arr(i, 1) And c2arr(i, 1) <> c5arr(i, 1) Then 
      c6arr(i, 1) = "Manual Review" 
    End If 
Next 

Range(Cells(2, col6.Column), Cells(lastrow, col6.Column)).Value = c6arr 
End Sub 

UPDATED IMAGE

+0

那麼一點點調試需要。將光標放在For i行並按F9。然後運行代碼。它會停在這條線上。在VB中,您可以在「本地」窗口中看到所有內容的值。您可以展開所有陣列並確保有數據。如果不檢查所有其他變量以確保它們返回正確的數字。然後如果一切順利,就按F8一步一步來驗證每一步。我也不相信你想在那裏出口。你也知道你是逐行比較而不是一個數組中的每個值與其他值中的所有值進行比較? –

+0

您從不將'c6arr'的內容寫回工作表。另外,在數據的第1行中,「c2arr」是負數,因此兩個測試都會失敗。另外,在你的代碼中,'c1arr'永遠不會等於'c4arr'和'c5arr',所以如果'c2arr'> 0,那麼「Manual Review」將始終是結果。正如Scott寫道,如果您通過第一個測試並停止處理其餘行,則「Exit For」將退出循環。您的預期結果似乎也存在錯誤,因爲您有一個result2既不是「手動審查」也不是c3arr的實例。 –

+0

所有數據均正確返回。我輸入Exit For,因爲我認爲第二個陳述可能會覆蓋第一個陳述。看起來問題如你所述:逐行比較每個數組的值與另一個數組的值。這是一個簡單的修復? –

回答

0

增加了額外的循環,並打破了,如果邏輯,以獲得正確的(?)的行爲。

我得到這些結果...

enter image description here

...從這個代碼...

Sub test() 
Dim i As Integer, j As Integer, lastrow As Long 
Dim col1 As Range, col2 As Range, col3 As Range, col4 As Range, col5 As Range, col6 As Range 
Dim c1arr, c2arr, c3arr, c4arr, c5arr, c6arr As Variant 

    Set col1 = ActiveSheet.Cells.Find("Reference", , xlValues, xlWhole) 
    Set col2 = ActiveSheet.Cells.Find("Amount", , xlValues, xlWhole) 
    Set col3 = ActiveSheet.Cells.Find("Action", , xlValues, xlWhole) 
    Set col4 = ActiveSheet.Cells.Find("Reference2", , xlValues, xlWhole) 
    Set col5 = ActiveSheet.Cells.Find("Amount2", , xlValues, xlWhole) 
    Set col6 = ActiveSheet.Cells.Find("Action2", , xlValues, xlWhole) 

    lastrow = Cells(Rows.Count, col1.Column).End(xlUp).Row 

    c1arr = Range(Cells(2, col1.Column), Cells(lastrow, col1.Column)).Value 
    c2arr = Range(Cells(2, col2.Column), Cells(lastrow, col2.Column)).Value 
    c3arr = Range(Cells(2, col3.Column), Cells(lastrow, col3.Column)).Value 

    lastrow = Cells(Rows.Count, col4.Column).End(xlUp).Row 

    c4arr = Range(Cells(2, col4.Column), Cells(lastrow, col4.Column)).Value 
    c5arr = Range(Cells(2, col5.Column), Cells(lastrow, col5.Column)).Value 
    c6arr = Range(Cells(2, col6.Column), Cells(lastrow, col6.Column)).Value 

    For i = 1 To UBound(c4arr) 
     If c6arr(i, 1) = "" Then ' if already determined an answer, don't try again 
      For j = 1 To UBound(c1arr) 
       If c1arr(j, 1) = c4arr(i, 1) Then ' found Reference2 within Reference 
        If c2arr(j, 1) = c5arr(i, 1) And c2arr(j, 1) > 0 Then 
         c6arr(i, 1) = c3arr(j, 1) 
        Else 
         c6arr(i, 1) = "Manual Review" 
        End If 
       End If 
      Next j 
     End If 
     If c6arr(i, 1) = "" Then ' if haven't found an answer yet, it needs review 
      c6arr(i, 1) = "Manual Review" 
     End If 
    Next i 

    Range(Cells(2, col6.Column), Cells(lastrow, col6.Column)).Value = c6arr 

End Sub 
0

這是我不太清楚,從你的代碼和你的榜樣,當你想在Action2中看到「Manual Review」時。顯然,如果引用匹配,但數量不匹配;但由於這並不包含所有可能性,所以這部分代碼有點「馬虎」。在下面的代碼中,沒有匹配的所有實例將被標記爲「手動審查」。如果情況確實如此,那麼代碼可以變得更清潔(並且更快)。

這是另一種方法,使用WorksheetFunction.Match

Option Explicit 
    Sub test() 
Dim i As Integer, lastrow As Long, J As Long 
Dim col1 As Range, col2 As Range, col3 As Range, col4 As Range, col5 As Range, col6 As Range 
Dim c1arr, c2arr, c3arr, c4arr, c5arr, c6arr As Variant 


Set col1 = ActiveSheet.Cells.Find("Reference", , xlValues, xlWhole) 
Set col2 = ActiveSheet.Cells.Find("Amount", , xlValues, xlWhole) 
Set col3 = ActiveSheet.Cells.Find("Action", , xlValues, xlWhole) 
Set col4 = ActiveSheet.Cells.Find("Reference2", , xlValues, xlWhole) 
Set col5 = ActiveSheet.Cells.Find("Amount2", , xlValues, xlWhole) 
Set col6 = ActiveSheet.Cells.Find("Action2", , xlValues, xlWhole) 

lastrow = Cells(Rows.Count, col1.Column).End(xlUp).Row 

c1arr = Range(Cells(2, col1.Column), Cells(lastrow, col1.Column)).Value 
c2arr = Range(Cells(2, col2.Column), Cells(lastrow, col2.Column)).Value 
c3arr = Range(Cells(2, col3.Column), Cells(lastrow, col3.Column)).Value 
c4arr = Range(Cells(2, col4.Column), Cells(lastrow, col4.Column)).Value 
c5arr = Range(Cells(2, col5.Column), Cells(lastrow, col5.Column)).Value 
c6arr = Range(Cells(2, col6.Column), Cells(lastrow, col6.Column)).Value 

'Clear c6arr 
ReDim c6arr(1 To UBound(c6arr, 1), 1 To 1) 

For i = 1 To UBound(c1arr) 
    If c2arr(i, 1) > 0 Then 
     On Error Resume Next 
      J = WorksheetFunction.Match(c1arr(i, 1), c4arr, 0) 
      If Err.Number = 0 Then 
       If c2arr(i, 1) = c5arr(J, 1) Then 
        c6arr(J, 1) = c3arr(i, 1) 
       Else 
        c6arr(J, 1) = "Manual Review" 
       End If 
      End If 
     On Error GoTo 0 
    End If 
Next i 

'Fill the blanks 
For i = 1 To UBound(c6arr, 1) 
    If c6arr(i, 1) = "" Then c6arr(i, 1) = "Manual Review" 
Next i 

Range(Cells(2, col6.Column), Cells(lastrow, col6.Column)).Value = c6arr 
End Sub 

這些是使用最近發佈的圖像結果:

enter image description here