2016-08-22 75 views
1

我使用VBA進行日期過濾器。此過濾器將採用我在表1中指定的日期並過濾我此刻選擇的列。理想情況下,我希望將該範圍中的日期的所有值加上所有空格(未定義日期)。Excel的VBA - 日期過濾器和空白

Set rep= ActiveWorkbook.Sheets("sheet2") 
Set sh1 = ActiveWorkbook.Sheets("Sheet1") 

Dim anf As String 
Dim ende As String 
Dim count As Integer 

anf = ">=" + sh1.Range("J2") 
ende = "<=" + sh1.Range("J3") 
rep.Select 
count = Range(Selection, Selection.End(xlToLeft)).Columns.count 

rep.Range("$A$4:$GD$11668").AutoFilter Field:=count, Criteria1:=anf, Operator:=xlAnd, Criteria2:=ende, Operator _ 
     :=xlFilterValues 

此代碼功能非常好。但是,它只會過濾日期。我也嘗試添加空白(除此之外)都失敗了。

例如,增加對坯件的第三準則:

rep.Range("$A$4:$GD$11668").AutoFilter Field:=count, Criteria1:=anf, Operator:=xlAnd, Criteria2:=ende, Operator:=xlAnd, Criteria3:="=", Operator _ 
     :=xlFilterValues 

我得到一個應用程序中定義或對象定義錯誤。

任何想法?謝謝!

+0

嘗試這種解決方案http://stackoverflow.com/questions/21834701/use-autofilter-on-more-than-2-criteria – Siva

回答

2

你不能在同一時間做3個以上標準的方式 - 如果你在用戶界面中看到你只能得到2「和」或在同一時間的任何條件。

enter image description here

但是,你可以做一個陣列,並設置爲標準。請參閱this example

試試下面的例子 enter image description here

Sub Sample() 
Dim SampleRange As Range 
Dim ArrayDates(2) As Date 
ArrayDates(0) = "1-1-2017" 
ArrayDates(1) = "1-2-2017" 
ArrayDates(2) = Now() 
'1st approach, add the array directly in the criteria 
Set SampleRange = Range("A1:A31") 
    SampleRange.AutoFilter Field:=1, Operator:= _ 
     xlFilterValues, Criteria1:=Array(2, "1/1/2017", 2, "1/2/2017", 2, "1/3/2017") 
'2nd approach: define an array and just start to call it as needed 
     SampleRange.AutoFilter Field:=1, Operator:= _ 
     xlFilterValues, Criteria1:=Array(ArrayDates(1)) 

End Sub 
0

我跟不上你想幹什麼,但也許是這樣的:

Sub test1() 

Dim rep As Worksheet 
Dim sh1 As Worksheet 

Set rep = ActiveWorkbook.Sheets("sheet4") 
Set sh1 = ActiveWorkbook.Sheets("Sheet3") 

Dim i As Long 
Dim count As Integer 
Dim arr As Variant 

arr = Array("=" & """""", ">=" & sh1.Range("J2"), "<=" & sh1.Range("J3")) 

rep.Select 
count = Range(Selection, Selection.End(xlToLeft)).Columns.count 
For i = 0 To UBound(arr) 
    rep.Range("$A$4:$GD$11668").AutoFilter Field:=count, Criteria1:=arr(i) 
Next i 

End Sub 
1

首先,你的錯誤是因爲試圖給出3個標準 - 它只能處理2個標準,並且它不知道如何處理通過它的額外參數。

現在,這不是你想要什麼的唯一問題。請注意,如果您嘗試通過用戶界面手動在兩個日期之間進行過濾,則可以這樣做,但不能也會添加空白。這是一種單一或其他情況。起初我也嘗試過Brian的解決方案,但是Excel只是不能這樣工作。至少,我不能把它變成這樣工作。

這給我們留下了兩個非常難看的解決方案。你可以修改你正在過濾的表格(在這些行中添加一個帶有公式的附加列或者其他東西)給Autofilter以外的其他東西進行過濾,或者手動設置所有有效的標準。這裏是你如何做到後者:

Private Sub setFilter() 
    Set rep = ActiveWorkbook.Sheets("sheet2") 
    Set sh1 = ActiveWorkbook.Sheets("Sheet1") 

    Dim anf As String 
    Dim ende As String 
    Dim count As Integer 

    anf = sh1.Range("J2") 
    ende = sh1.Range("J3") 
    rep.Select 
    count = Range(Selection, Selection.End(xlToLeft)).Columns.count 

    rep.Range("$A$4:$GD$11668").AutoFilter Field:=count, Criteria1:=GetValidDates(CDate(anf), CDate(ende)), Operator:=xlFilterValues 
End Sub 

Private Function GetValidDates(ByVal startD As Date, ByVal endD As Date) As String() 
    Dim numDays As Integer: numDays = endD - startD + 1 
    Dim dateArray() As String 
    ReDim dateArray(numDays) ' (numDays + 1) entries 

    Dim i As Integer 
    For i = 0 To numDays - 1 
     dateArray(i) = CStr(startD + i) 
    Next 
    dateArray(i) = "" 

    GetValidDates = dateArray 
End Function 

這將構建之間的所有日期的數組,其中包括起始和結束(以及額外的空「」條目,以便允許空白)。這很醜陋,我不確定它能夠在很大的日期範圍內工作(可能會很慢),但至少Excel能夠識別並接受它。