2017-06-12 281 views
1

我想通過兩個excel列循環並確定第一列中的值是否出現在第二列中。我在VBA編程方面相當新,而且還沒有編程。VBA循環遍歷兩個excel列中的值

我的代碼,當我通過F8運行它時,如果它找到一個值,它會寫入「Match」,但它會保持循環並最終將其重寫爲「No Match」。你能告訴我如何解決這個問題嗎?

謝謝

enter image description here

Sub loopDb() 

    Set dbsheet1 = ThisWorkbook.Sheets("Sheet1") 
    Set dbsheet2 = ThisWorkbook.Sheets("Sheet2") 

    lr1 = dbsheet1.Cells(Rows.Count, 1).End(xlUp).Row 
    lr2 = dbsheet2.Cells(Rows.Count, 1).End(xlUp).Row 

    For x = 2 To lr1 
     act1 = dbsheet1.Cells(x, 1) 

     For y = 2 To lr2 
      act2 = dbsheet2.Cells(y, 1) 

      If act2 = act1 Then 
       dbsheet2.Cells(y, 3).Value = "Match" 

      Else 
       dbsheet2.Cells(y, 3).Value = "No match" 
      End If 
     Next y 

    Next x 


End Sub 
+0

是否打算在兩張不同的工作表中比較A列? – Noceo

+0

你爲什麼不在C列中使用它? 'IF(ISNUMBER(MATCH(B2,$ A $ 2:$ A $ 16,0)),「Match」,「No match」) – Jordan

+0

是的,我在比較兩張不同工作表中的列 –

回答

1

試試這個: 修改的if-else如下

If Not dbsheet2.Cells(y, 3).Value = "Match" Then 
'Only compare if previoulsy not done or resulted in "No match" 
    If act2 = act1 Then 
     dbsheet2.Cells(y, 3).Value = "Match" 

    Else 
     dbsheet2.Cells(y, 3).Value = "No match" 
    End If 
End If 
1

只需添加Exit For一個匹配

像下面後:

If act2 = act1 Then 
    dbsheet2.Cells(y, 3).Value = "Match" 
    Exit For 
Else 
1

很好,你想出了一些代碼。有這樣做的更簡單的方法,如果你喜歡,你可以只使用,

方法1:

如果數據按列A and B,在Column C輸入下面的公式,並拖累,

=IF(IFERROR(MATCH(A1,B:B,0),FALSE),"Match","No Match") 

enter image description here

該公式基於真/假在列A到B列,並打印的值匹配。

方法2:

使用Match式VBA,而不是運行是否有更多的行數可能消耗更多的時間2個不同的循環。

下面的代碼也給你一個類似的輸出。

Sub match() 
Dim i As Long 
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row 
    If IsError(Application.match(Cells(i, 1), Range("B:B"), 0)) Then 
     Cells(i, 3) = "No Match" 
    Else 
     Cells(i, 3) = "Match" 
    End If 
Next i 
End Sub 
+0

您的代碼只是比較在同一行上的值,而不是如果左列中的值存在於右列中的任何位置....感謝無論如何,這將是有用的,以及:) –

+0

@ Mr.Riply匹配公式將比較值一個單元格到另一列中的所有值。可能你可以試試看 –