当两个列都在同一个工作表中时,我只能设法完成它。
我想做什么: 比较两个不同工作表中的两列(工作表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
答案 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 sheet或VBA - Getting a runtime error '1004' when running this code
如果您错过了三个时间推荐,则上述范围中的Cells
和Rows
会自动转介到ActiveSheet
。这可能并不总是理想的情况。