将行输出到另一个工作表

时间:2015-07-30 15:52:25

标签: excel vba excel-vba

我有两组数据存储在两个不同的工作表中。我需要运行一个分析,打印出工作表中找到的非重复行(即行存在于一个而不是另一个中),然后将它们打印在新工作表中。

我可以很好地进行比较 - 使用范围和For Next方法相对简单。我目前将非重复项存储在两个不同的集合中,每个集合代表每个表中的非重复项。但是,我无法决定如何在新工作表上粘贴重复的行。

我考虑过将整行存储到一个集合中,但是在新工作表中打印出该行的行似乎并不重要:我必须确定集合的大小,设置适当的范围然后迭代收集并打印出来。我还想截断这些数据,这会增加另一层复杂性。

我认为另一种方法只是存储行号并使用Range.Select.CopyPasteSpecial。这样做的好处是我可以截断我想要的任何内容,但这对我来说似乎非常难看(主要是使用VBA来模拟用户输入)而且我不确定性能命中率。

有什么相对优点,还是有更好的方法?

1 个答案:

答案 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在宏的中间崩溃,你将避免部分拷贝。

如果这些方法中的任何一种满足您的需求,请告诉我们:)