带有组合框的VBA Excel中的高级过滤器

时间:2019-10-04 08:23:51

标签: excel vba

我有这个Excel表和组合框,里面有一些值。

这是一个例子

enter image description here

我想做的是:

在combobox1_change上使用vba进行高级过滤

到目前为止,这是我的代码:

Private Sub ComboBox1_Change()

Worksheets("Foglio1").Range("F1") = Me.ComboBox1.Value
a=Application.WorksheetFunction.CountA(Worksheets("Foglio1").Range("A1:B7"))
Worksheets("Foglio1").Range("A" & 1, "C" & a).AdvancedFilter xlFilterInPlace, Worksheets("Foglio1").Range("F1") 
End Sub

但是我无法使其正常工作 我应该发布预期的输出吗?

这是我的预期输出:

enter image description here

1 个答案:

答案 0 :(得分:1)

高级过滤器用于按一系列条件进行过滤,但是要获得基于组合框值获得的一个条件的结果,一个简单的自动过滤器将达到以下目的:

Private Sub ComboBox1_Change()
Dim lastr As Integer
lastr = Range("A" & Rows.Count).End(xlUp).Row
Sheets("Sheet1").Range("A1:C" & lastr).AutoFilter Field:=3, Criteria1:=ComboBox1.Value, Operator:=xlFilterValues
End Sub

说明:将最后一行调暗为整数(数字整数值)。然后用the most reliable lastrow method to date确定。 然后应用范围A1到C和您的最后一行(例如,实际上是A1:C7)和自动过滤器。该字段是您要过滤的范围内的列,在这种情况下3表示列C(如果您的范围是B:D,则3表示该范围内的第三列,因此D列)。条件是使用ComboBox1.value直接从组合框中获取的值。运算符xlFilterValues表示它将根据列中找到的值进行过滤,即使该列具有公式,该值也将起作用。

请注意:您可以直接从组合框获取值,无需先将其放在单元格中,但是可以根据需要这样做。同样,在这种情况下,也不是必须要查找数据的最后一行,只需像Range("A:C")那样放置范围。

编辑: 我还探索了.advancedfilter方法,即使我对此不太了解,这还是我的发现:

Private Sub ComboBox1_Change()
Dim sh As Worksheet: Set sh = ThisWorkbook.Sheets("Sheet1")
Dim lastr As Integer
If sh.FilterMode Then sh.ShowAllData
lastr = sh.Range("A" & Rows.Count).End(xlUp).Row
sh.Range("A1:C" & lastr).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=("Table1[#All]"), Unique:=False
End Sub

注意:有一个带有链接单元格F2的组合框,范围F1:F2在名为table1的表中。由于advancedfilter属性的缘故,我没有将AdvancedFilter放在表中就无法工作。表1的标题必须恰好是您要作为过滤依据的列的标题。如果将标题设置为与第1列相同,则会在第1列的表中搜索值。

说明:工作表暗淡将工作表设置为当前文件sheet1。这不是严格必要的,但以后会派上用场。 lastr与上次相同,请确定最后一行并将您的过滤器应用于此范围。再也不是必须的,但是在这种情况下,它可以使速度大大提高。

If sh.FilterMode Then sh.ShowAllData对于选择新值很重要。它基本上会重置过滤器,因此可以应用新的过滤器。它检测是否有一个筛选器应用于您的工作表,然后将其设置为显示所有数据。如果未应用任何过滤器,则不需要这样做,但是如果您省略测试并仅放入showalldata,则它将失败,因为没有其他东西可以显示并抛出错误,因此没有测试。如果在应用新过滤器时未重置过滤器,由于找不到数据(因为之前的过滤器已将其过滤掉了),它也会引发错误。

然后,将高级过滤器与您的数据一起应用到该范围。这里要注意的标准是:它占用了Table1的全部范围,在这种情况下,仅是标题下与表2相同的组合框值。然后,AdvancedFilter会隐藏所有与这些数据都不匹配的行。

注意:AdvancedFilter可以接受的条件不仅仅是一个组合框值。

对于表1中的每一行,它将作为OR语句处理它:因此,如果在表1中,我有一个类似于标头2的标头,其值A下方,而一个类似于标头3的标头,其值以下的两行B,它将在范围内搜索第2列为A或第3列为B,并隐藏所有不匹配的内容。

Header2 | Header3 'this will return rows with A under Header2 and rows with B under Header3
A       | 0
0       | B

同一行上的所有条件都用作AND语句。如果我具有上述两个标头,但A和B在同一行,则过滤器将搜索A和B在同一行的行。

Header2 | Header3 'this will return rows with both A under Header2 and B under Header3
A       | B

可以使用与数据一样多的列和值进行扩展。请注意,您的表不能有空值,因为它将与您的所有数据匹配。这就是为什么Advancedfilter如果使用得当的话,其功能要比.autofilter强得多,因为autofilter缺省情况下只会搜索一列,并且很难处理多个条件。