VBA:如何比较两个不同的工作表中的两列

我只设法做到这两个列在同一个工作表中。

我想要做的是:比较两个不同工作表(工作表A和B)中的两列。 只存在于工作表A中但不在工作表B中的单元格应粘贴在工作表B中。对于只存在于工作表B中但不在工作表A中的单元格也适用。我也希望第一行为类别为空。 所以它应该从第二行开始计算。

谁能帮忙?

Sub test() Dim d1 As Object, d2 As Object, d3 As Object, e Set d1 = CreateObject("scripting.dictionary") Set d2 = CreateObject("scripting.dictionary") Set d3 = CreateObject("scripting.dictionary") For Each e In Cells(1).Resize(Cells(Rows.Count, 1).End(3).Row).Value d1(e) = True d2(e) = True Next e For Each e In Cells(2).Resize(Cells(Rows.Count, 2).End(3).Row).Value If (d2(e)) * (d1.exists(e)) Then d1.Remove e If Not d2(e) Then d3(e) = True Next e On Error Resume Next Range("J1").Resize(d1.Count) = Application.Transpose(d1.keys) Range("K1").Resize(d3.Count) = Application.Transpose(d3.keys) On Error GoTo 0 End Sub 

您必须将单元格,行等引用到给定的工作表中。 如果你做得对,这不是一件困难的事情。

看看如何参考工作表:

 Sub TestMe() Dim shA As Worksheet Dim shB As Worksheet Dim e As Range Set shA = Worksheets(1) Set shB = Worksheets("Tabelle2") With shA For Each e In .Cells(1).Resize(.Cells(.Rows.Count, 1).End(3).Row) Debug.Print e.Address Next e End With End Sub 

正如你所看到的方法主要是2:

  • 按索引 – Set shA = Worksheets(1)
  • 按名称 – Set shB = Worksheets("Tabelle2")

还有第三种方法,由vba的对象名称,但你现在可能不需要它。 在上面的例子中,注意你在这一行中shA了三次父shA

 For Each e In .Cells(1).Resize(.Cells(.Rows.Count, 1).End(3).Row) 
  • .Cells(1)...
  • .(Cells(...
  • .Rows.Count,..

当处理工作表时,这是相当重要的,在使用VBA时,人们可能会用StackOverflow中的第一个错误。 例如在这里 – 试图访问表或VBA 范围时VBA运行时错误1004 – 运行此代码时得到运行时错误“1004”


如果你错过了三次引用,上述范围的Cells和行将被自动引用到ActiveSheet 。 这可能并不总是理想的情况。