2016-08-22 73 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能够识别并接受它。