2014-10-07 56 views
0

我正在使用以下代碼進行自動過濾。它的工作正常。問題是如果輸出值清空過濾器給出的所有值。我在尋找是否空出它將顯示空行。當輸出爲空時,它將自動過濾器失敗(當輸出爲空時它將全部顯示)

Sub filter() 
     Application.ScreenUpdating = False 
     Dim Location As String 
     Dim due As String 
     Sheets("sheet2").Activate 
     due = Range("b14").Value 
     Location = Range("a14").Value 
     Range("a16:j1000").ClearContents 
     Sheets("Sheet1").Select 
     Range("a1:j1000").Select 
     Selection.AutoFilter 
     ActiveSheet.Range("$A$1:$j$1000").AutoFilter Field:=1, Criteria1:=due 
     ActiveSheet.Range("$A$1:$j$1000").AutoFilter Field:=2, Criteria1:=Location 
     Range("c2:i1000").Select 
     Selection.Copy 
     Sheets("sheet2").Activate 
     Range("b16").Select 
     Selection.PasteSpecial 
     Sheets("sheet1").Select 
     Selection.AutoFilter 
     Sheets("sheet2").Select 
     Range("b16").Activate 
     Application.ScreenUpdating = True 
    End Sub 

回答

0

當過濾器顯示無結果時,複製過濾列表中的所有數據是已知錯誤。通常,我使用Application.Subtotal(103, ...)SUBTOTAL Function)在對已過濾列表執行任何操作之前檢查可見記錄。

Sub filter() 
    Application.ScreenUpdating = False 
    Dim Location As String, due As String 

    With Sheets("sheet2") 
     due = .Range("b14").Value 
     Location = .Range("a14").Value 
     .Range("a16:j1000").ClearContents 
    End With 

    With Sheets("sheet1").Range("a1:j1000") 
     .AutoFilter 
     .AutoFilter Field:=1, Criteria1:=due 
     .AutoFilter Field:=2, Criteria1:=Location 
     With .Offset(1, 2).resize(.rows.count - 1, 7) 
      If CBool(Application.Subtotal(103, .Cells)) Then _ 
       .Copy Destination:=Sheets("sheet2").Range("b16") 
     End With 
     .AutoFilter 
    End With 

    With Sheets("sheet2") 
     .Activate 
     Range("b16").Activate 
    End With 
    Application.ScreenUpdating = True 
End Sub 

我已經在樣本數據上成功測試了這個。比較日期時,請小心使用字符串(例如截止日期爲)。

當使用VBA過濾列表並隨後刪除可見記錄時,這一點尤其重要,因爲沒有可見記錄會導致您的整個數據矩陣被刪除。此外,從宏運行時不存在UnDo

+0

@ ser3766722 - 順便說一句,您可以在SUBTOTAL中使用* 3 *或* 103 *作爲* function_num *。兩者都只會計算可見值。我通常使用* 103 *,因爲它提醒我,我特別關心只計數可見值。 – Jeeped 2014-10-07 06:38:10

+0

我在哪裏設置過濾範圍?範圍(「c2:i1000」)。選擇 – user3766722 2014-10-07 17:44:18

+0

@ user3766722 - 當您使用'With ... End With'子句時,任何以句點爲前綴的內容都指您指定的範圍或工作表。在上面我用'With Sheet(「sheet1」)。Range(「a1:j1000」)'然後在其中使用'.AutoFilter',所以你可能想要使用'With Sheets(「sheet1」)。Range(「 AC1:I1000" )'。 [With ... End With Statement](http://msdn.microsoft.com/en-us/library/wc500chb.aspx) – Jeeped 2014-10-07 21:30:36

相關問題