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