Excel VBA - 日期过滤器和空白

时间:2016-08-22 14:27:35

标签: excel vba excel-vba date filter

我正在使用VBA制作日期过滤器。此过滤器将采用我在工作表1中指定的日期并过滤我此时选择的列。理想情况下,我希望所有值都在该范围内的日期加上所有空白(没有定义日期)。

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

我得到了应用程序定义或对象定义错误。

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:3)

您不能同时执行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

答案 1 :(得分:1)

首先,您的错误是由于尝试提供Autofilter 3个条件引起的 - 它只能处理2个,并且它不知道如何处理您传递的额外参数。

现在,这不是你正在尝试的唯一问题。请注意,如果您尝试通过UI手动过滤两个日期,则可以执行此操作,但不能也添加空白。这是一种单一或另一种情况。我最初也尝试过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会识别并接受它。

答案 2 :(得分: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