我有两组数据存储在两个不同的工作表中。我需要运行一个分析,打印出工作表中找到的非重复行(即行存在于一个而不是另一个中),然后将它们打印在新工作表中。
我可以很好地进行比较 - 使用范围和For Next
方法相对简单。我目前将非重复项存储在两个不同的集合中,每个集合代表每个表中的非重复项。但是,我无法决定如何在新工作表上粘贴重复的行。
我考虑过将整行存储到一个集合中,但是在新工作表中打印出该行的行似乎并不重要:我必须确定集合的大小,设置适当的范围然后迭代收集并打印出来。我还想截断这些数据,这会增加另一层复杂性。
我认为另一种方法只是存储行号并使用Range.Select.Copy
和PasteSpecial
。这样做的好处是我可以截断我想要的任何内容,但这对我来说似乎非常难看(主要是使用VBA来模拟用户输入)而且我不确定性能命中率。
有什么相对优点,还是有更好的方法?
答案 0 :(得分:1)
本周我一直在处理类似的问题。我提出了两种方法:
首先,您可以简单地一次遍历每个集合一行,并将值复制到新工作表中:
Function PasteRows1(ByRef srcRows As Collection, ByRef dst As Worksheet)
Dim row As Range
Dim curRow As Integer
curRow = 1
For Each row In srcRows
dst.rows(curRow).Value = row.Value
curRow = curRow + 1
Next
End Function
这样做的好处是不使用Range.Copy
方法,因此保留了用户的剪贴板。如果您没有复制整行,则必须创建一个从该行的第一个单元格开始的范围,然后使用Range.Resize
调整其大小。所以for
循环中的代码大致是:
Dim firstCellInRow as Range
Set firstCellInRow = dst.Cells(curRow,1)
firstCellInRow.Resize(1,Row.columns.Count).Value = row.Value
curRow = curRow + 1
我想到的第二种方法使用Range.Copy
。像这样:
Function PasteRows2(ByRef srcRows As Collection, ByRef dst As Worksheet)
Dim row As Range
Dim disjointRange As Range
For Each row In srcRows
If disjointRange is Nothing Then
Set disjointRange = row
Else
Set disjointRange = Union(disjointRange, row)
End If
Next
disjointRange.Copy
dst.Paste
End Function
虽然这确实使用.Copy
方法,但它也允许你一次性复制所有行,这很好,因为如果excel在宏的中间崩溃,你将避免部分拷贝。
如果这些方法中的任何一种满足您的需求,请告诉我们:)