使用Excel VBA中的自动过滤器从Excel工作表中剪切粘贴数据

时间:2011-08-19 04:42:50

标签: excel excel-vba excel-2007 vba

目前我拥有大约200,000多条记录的Excel,我需要根据列过滤数据。该列有大约5个值,我需要在一个工作表中过滤掉2个值,其余3个保留在同一个工作表中。

现在,不是使用逐个单元格比较来检查单元格的值是否落在上述任何值中,然后将该行粘贴到另一个工作表中。这不适用于200k +记录而只是挂起,。

而是计划采用自动过滤方法。我尝试使用'记录宏'功能,但问题是它给我一些错误,如

“Excel无法创建或使用数据范围引用,因为它过于复杂。请尝试以下方法之一 使用可在矩形中选择的数据 使用同一张“

中的数据

此外,如何将仅过滤后的值粘贴到另一张纸上?如果我尝试直接复制粘贴或特殊粘贴为'值',那么即使隐藏的行也会被复制粘贴。

下面是我一直在篡改

的宏代码
    Sub Macro34()
    '
    ' Macro34 Macro
    '

    '
        Rows("1:1").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$T$81335").AutoFilter Field:=6, Criteria1:="=242", _
            Operator:=xlOr, Criteria2:="=244"
        Cells.Select
        Selection.Copy
        ActiveWindow.SmallScroll Down:=21
        Sheets("Sheet2").Select
        ActiveWindow.SmallScroll Down:=-18
        Range("A1").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Selection.ClearContents
        Range("A1").Select
        Sheets("Sheet1").Select
        Selection.Copy
        Sheets("Sheet2").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Sheets("Sheet2").Select
        ActiveWindow.SmallScroll Down:=93
        Sheets("Sheet1").Select
        ActiveWindow.SmallScroll Down:=-9
        ActiveWindow.ScrollRow = 1
        Rows("1:1").Select
        Application.CutCopyMode = False
        Selection.AutoFilter
    End Sub

使用“记录宏”功能生成的代码可能会有一些垃圾代码。

有人可以帮助我。问题是excel中存在的数据量。不能在VBA中处理这么多数据吗?我使用Excel 2007

2 个答案:

答案 0 :(得分:1)

这是你的代码清理完毕:

Sub Macro34()

    ' Turn off autofiltering
    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False

    ' Turn it back on
    Rows(1).AutoFilter

    ' Set the autofiltering conditions
    Rows(1).AutoFilter Field:=6, _
        Criteria1:="=242", _
        Operator:=xlOr, _
        Criteria2:="=244"

    ' Copy only the relevant range
    Range("A1", _
          Cells(65536, Cells(1, 256).End(xlToLeft).Column).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy

    ' Paste the data into Sheet2 (assuming that it exists)
    Sheets("Sheet2").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
    Application.CutCopyMode = False

End Sub

关键是SpecialCells的一部分。

现在,尽管我喜欢一个好的自动过滤器复制/粘贴,当你处理那么多数据时,你可能想要使用ADO,这将允许你使用SQL查询你的Excel工作表。

此处提供了VBA中ADO的概述:http://www.xtremevbtalk.com/showthread.php?t=217783

答案 1 :(得分:0)

在数据右侧的第一个空列中插入一个测试您的标准的公式:例如

=if(or(a2=242,a2-244),"Move","Keep")

然后在您的宏中,在尝试过滤并剪切answer1中描述的可见代码之前,对该列设置的整个200,000行数据进行排序。

这将使数据块被切割粘贴到一个连续的范围。这应该绕过“数据范围太复杂”的错误。