2011-08-19 126 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中描述的可見代碼。

這會使數據塊被剪切粘貼一個連續的範圍。這應該解決'數據範圍太複雜'的錯誤。