2011-08-19 122 views
0

目前我有一个大约有200000+条记录的excel,我需要根据列过滤数据。该列有大约5个值,我需要在一张表中过滤出2个值,其余3个保留在同一张表中。在excel表格中使用Autofilter从Excel中剪切粘贴数据VBA

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

而是计划采用自动过滤器方法。我试着用“录制宏”功能,但问题是,它给了我像

“Excel无法创建或使用的数据范围内引用一些错误,因为以下 使用数据的其过于complex.Try一个可以在矩形中选择 使用来自同一工作表的数据“

此外如何将仅粘贴过滤值的粘贴复制到另一个工作表?如果我尝试直接复制粘贴或将特殊粘贴粘贴为“值”,那么即使隐藏的行也会被复制粘贴。

下面是宏代码我一直在玩弄周围

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中处理这么多的数据?我使用Excel 2007

+0

请不要使用'Select'。只需在对象上使用该方法,比如'Rows(“1:1”)。AutoFilter'。 –

+0

问题是excel抛出错误原因不明... :( –

+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

+0

Did not work mate。得到卡在这条线'Cells.SpecialCells(xlCellTypeVisible).Copy'给出了我所描述的相同的错误。即使你忽略了这一点,并继续前进。它抛出应用程序1004错误:(((((请帮助 –

+0

难道你不能只运行两次代码:一次为值'242'和一次或值为'244'?无论如何,这将相当于'xlOr'运算符。在第二次运行中,您需要使用'Sheets(“Sheet2”),UsedRange.Rows.Count'或等价物来计算粘贴结果的位置,最后还会有一个重复的标头集合,但这很容易处理与 – barrowc

+0

看起来像Excel与大型数据集有点混淆。我已经更新了上面的代码与一些适应。 – variant

0

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

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

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

这会使数据块被剪切粘贴一个连续的范围。这应该解决'数据范围太复杂'的错误。