我正在使用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
我得到了应用程序定义或对象定义错误。
有什么想法吗?谢谢!
答案 0 :(得分:3)
您不能同时执行3个以上的标准 - 如果您在用户界面中注意到,您只能同时获得2“和”或任何标准。
但是,您可以执行数组并将其设置为条件。请参阅this example
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