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

时间:2017-12-08 13:03:09

标签: excel vba excel-vba excel-formula

当两个列都在同一个工作表中时,我只能设法完成它。

我想做什么: 比较两个不同工作表中的两列(工作表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

1 个答案:

答案 0 :(得分:1)

您必须将单元格,行等引用到给定的工作表。如果你做得对,这不是一项艰巨的任务。

看看如何参考工作表:

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引用了三次:

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

这非常重要,当处理工作表时,可能是StackOverflow中的第一个错误,人们在使用VBA时会这样做。例如。在这里 - VBA Runtime error 1004 when trying to access range of sheetVBA - Getting a runtime error '1004' when running this code

如果您错过了三个时间推荐,则上述范围中的CellsRows会自动转介到ActiveSheet。这可能并不总是理想的情况。