目前我拥有大约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
答案 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行数据进行排序。
这将使数据块被切割粘贴到一个连续的范围。这应该绕过“数据范围太复杂”的错误。