2017-06-12 121 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匹配公式将比较值一个单元格到另一列中的所有值。可能你可以试试看 –