Excel VBA – date筛选器和空白
我正在使用VBA来制作datefilter。 此filter将采用我在表1中指定的date,并过滤我此刻select的列。 理想情况下,我想拥有该范围内的date的所有值PLUS所有空白(没有date已定义)。
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
这个代码function很好。 但是,它只会过滤date。 我也试图添加空白(除此之外)都失败了。
例如,为空白添加第三条标准:
rep.Range("$A$4:$GD$11668").AutoFilter Field:=count, Criteria1:=anf, Operator:=xlAnd, Criteria2:=ende, Operator:=xlAnd, Criteria3:="=", Operator _ :=xlFilterValues
我得到一个应用程序定义或对象定义的错误。
有任何想法吗? 谢谢!
如果您在用户界面中注意到,您只能同时获得2个“和”或任何标准,您不能同时做超过3个标准。
但是,你可以做一个数组,并将其设置为条件。 参考这个例子
试试下面的例子
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
首先,你的错误是因为试图给出Autofilter
3的标准而引起的 – 它只能处理2,而不知道如何处理你传递的额外参数。
现在,这不是你尝试的唯一的问题。 请注意,如果您尝试通过用户界面手动在两个date之间过滤,则可以这样做,但不能同时添加空格。 这是一种单一或其他的情况。 一开始我也尝试过Brian的解决scheme,但是Excel只是不行。 至less,我不能哄这样做。
这给我们留下了两个非常难看的解决办法。 你可以修改你正在过滤的表格(在这些行上添加一个额外的公式或者其他东西),给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
这将build立一个包含开始和结束之间的所有date的数组(以及一个额外的空“”允许空白的条目)。 这是丑陋的,我不确定它会为真正的大date范围工作(可能会很慢),但至lessExcel能够识别并接受它。
我不能跟随你想做的事情,但也许是这样的:
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