2015-10-26 54 views
2

我想運行一個宏,它應該得到最後一個活動行,將所有數據複製到新工作表,應用一個過濾器(K行> 15,9上的數字) ,將結果複製並粘貼到新工作表中。粘貼在新工作表後應用過濾器粘貼什麼都沒有

但是,在使用過濾器後,沒有任何東西粘貼在新的表格中。 任何想法爲什麼?

謝謝!

Sub Macro1() 

'Select and paste all data, couldn't work on a "last active line" in here.. 
Cells.Select 
Selection.Copy 
Sheets("Plan2").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("A1:O1").Select  
Application.CutCopyMode = False 

'Aplying the filter 
Selection.AutoFilter 
ActiveSheet.Range("$A$1:$O$1056").AutoFilter Field:=11, Criteria1:=">15,9" _ 
    , Operator:=xlAnd 

'Here I'm trying to past the filtered data in the new sheet, but the result appears in blank 
Cells.Select 
Selection.Copy 
Sheets("Plan3").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 

'Here i came back and turned the autofilter off, but it was useless 
Sheets("Plan2").Select 
Application.CutCopyMode = False 
ActiveSheet.Range("$A$1:$O$1056").AutoFilter Field:=11 
End Sub 
+2

你怎麼看這個標準是:「> 15,9」? –

+0

您是否可以不過濾第一張紙然後將過濾的數據粘貼到下一張? – Davesexcel

+1

問題可能是t他在VBA中使用'DecimalSeparator'屬性時可能需要使用US-EN風格的表示法:'> 15.9'而不是'> 15,9'。否則,根據Scott的回答,最有可能的錯誤來源是不合格的'Cells' /'Range'對象。 –

回答

4

你必須在代碼中的幾個問題:

  1. 使用Cells可以是非常棘手的,尤其是當你沒有定義它們非常
  2. 使用Select從來都不是一個很好的做法。只需堅持直接使用對象(表格,範圍,工作簿等)。
  3. 我不知道爲什麼你需要將整個數據集複製到一張新紙上,然後過濾它以複製到第三張紙上。可以過濾原始數據集並複製到最終表單。我沒有爲此調整代碼,因爲可能有一個原因需要執行此操作,但是您知道,只需處理原始數據,而不需要中間步驟複製到另一個工作表進行過濾。
  4. 即使逗號是小數點分隔符,您可能需要在15.9而不是15,9上進行過濾。 (這可能不是真的,但我加入它的情況下(我在Excel中沒有歐洲系統的工作經驗)。另外,請參閱以上David Zemens的評論。

在下面的代碼,我有資格的所有表和範圍,發現最後一行並提供在那裏我做了一些假設的意見。修改,以適合您的具體結構,並讓我知道,如果它的工作原理。

Sub Macro1() 

'Select and paste all data, couldn't work on a "last active line" in here.. 

Dim wsCopy As Worksheet, wsPlan2 As Worksheet, wsPlan3 As Worksheet 
Set wsCopy = Sheets("mySheet") ' replace with correct sheet name 
Set wsPlan2 = Sheets("Plan2") 
Set wsPlan3 = Sheets("Plan3") 

'this will copy only cells with data in (*note -> this could copy more than that, but I will not go into it, for now, it's sufficient to use this) 
With wsCopy 

    'find last row 
    Dim lRow As Long 
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row 

    .Range("A1:O" & lRow).Copy 'assume the data goes to column O, change if need be 

End With 

With wsPlan2 

    'paste to sheet Plan 2 
    .Range("A1").PasteSpecial xlPasteValues 

    'find last row 
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row 

    With .Range("A1:O" & lRow) 
     'Aplying the filter 
     .AutoFilter 11, ">15,9" 'you may need to use 15.9 here if you indeed mean 15 and 9/10ths. even if the comma separator is what you use to show decimals 
     .Copy 
    End With 

    wsPlan3.Range("A1").PasteSpecial xlPasteValues 'change range reference if you need it 

    .AutoFilterMode = False 

End With 

End Sub 
+0

嗨@ScottHoltzman,非常感謝你的回答! 它看起來方式比原來的更好,我想你的建議,但是當它運行時,你的代碼的第二行被突出顯示: 'wsCopy作爲工作表,wsPlan2作爲工作表,wsPlan3作爲Worksheet' 並出現此錯誤消息: '編譯錯誤:'非法指令輸出類型塊' 你知道這個問題可能是什麼嗎? –

+0

對不起,我忘了語法前面的'Dim'語句。我編輯了我的答案來反映這一點。請再試一次:) –

+0

驚人的,現在它完美的作品! 正如你所說,我只是必須將'15.9'改爲'15,9'。 非常感謝,你幫了我很多! =) –