【问题标题】:Cut Paste data from excel sheet using Autofilter in Excel VBA使用 Excel VBA 中的自动过滤器从 Excel 工作表中剪切粘贴数据
【发布时间】:2011-08-19 04:42:50
【问题描述】:

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

现在不再使用逐个单元格比较来检查单元格的值是否属于上述 2 个值中的任何一个,然后将该行剪切粘贴到另一个工作表中。这不适用于 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中存在的数据量。 excel不能在VBA中处理这么多数据吗?我正在使用 Excel 2007

【问题讨论】:

  • 请不要使用Select。只需在对象上使用方法,例如Rows("1:1").AutoFilter
  • 问题是excel由于未知原因抛出错误...... :(
  • 我明白我没有指出问题所在,这就是我留下评论而不是答案的原因。但是您会发现使用更简洁的代码(例如他的答案中使用的变体)更容易找出错误。
  • 是的,Lance,对不起,我是 excel VBA 的新手。实际上我使用了下面使用的代码变体,但它仍然抛出相同的错误:((

标签: excel excel-2007 vba


【解决方案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

【讨论】:

  • 没有工作伙伴。卡在这一行 'Cells.SpecialCells(xlCellTypeVisible).Copy' 给出了与我描述的相同的错误。即使你忽略这一点并继续前进。它抛出应用程序1004错误:(((((请帮助
  • 您不能只运行代码两次:一次用于值242,一次或值244?无论如何,这将等同于 xlOr 运算符。在第二次运行时,您需要使用 Sheets("Sheet2").UsedRange.Rows.Count 或等效项来确定粘贴结果的位置。你也会得到一组重复的标题,但这很容易处理
  • 看起来 Excel 与大型数据集有点混淆。我已经用一些适应更新了上面的代码。
【解决方案2】:

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

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

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

这将使数据块被剪切-粘贴到一个连续的范围内。这应该可以解决“数据范围太复杂”的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多