首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA Excel中带有组合框的高级过滤器

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

Stack Overflow用户
提问于 2019-10-04 08:23:51
回答 1查看 2K关注 0票数 0

我有这个Excel表和combobox,里面有一些值。

下面是一个例子

我想做的是:

在combobox1_change上用vba制作高级滤波器

到目前为止,我的代码如下:

代码语言:javascript
运行
复制
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

但是我不能让它工作,我应该发布一个预期的输出吗?

这是我的预期输出:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-04 09:11:39

高级过滤器用于根据一系列标准进行过滤,但是要根据组合框值获得的一个标准获得结果,一个简单的自动筛选器就可以这样做:

代码语言:javascript
运行
复制
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表示范围中的第3列,因此D列)。标准是直接从您的combobox和ComboBox1.value中获取的值。运算符xlFilterValues意味着它将根据列中找到的值进行筛选,即使列有公式,该值也会工作。

请注意:您可以直接从组合框中获得值,没有必要先将其放在单元格中,但如果需要,您可以这样做。此外,在这种情况下,查找数据的最后一行也不是绝对必要的,只需像Range("A:C")一样将范围放出来。

编辑:--我也探索了.advancedfilter方法,尽管我不太了解它,以下是我的发现:

代码语言:javascript
运行
复制
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的表中。由于高级过滤器的特性,如果不将其放入表中,就无法让高级过滤器工作。表1的标题需要恰好是要筛选的列的标题。如果将标头设置为与第1列相同,它将搜索列1中表中的值。

说明:工作表dim将工作表设置为当前文件sheet1。这并不是绝对必要的,但稍后会派上用场。lastr与上次相同,请确定最后一行并将筛选器应用于此范围。没有严格的必要,但在这种情况下,它的速度相当快。

当您选择一个新值时,If sh.FilterMode Then sh.ShowAllData非常重要。它基本上是重置过滤器,以便一个新的过滤器可以应用。它检测是否有应用于工作表的筛选器,然后将其设置为显示所有数据。如果没有应用筛选器,这是不需要的,但是如果您省略了测试并将其放入showalldata,那么它将失败,因为没有其他东西显示和抛出错误,因此测试。如果在应用新筛选器时没有重置过滤器,它也会抛出一个错误,因为没有找到数据(因为数据被前一个筛选掉了)。

然后,高级过滤器将应用到与您的数据,如先前的范围。这里需要注意的是:它接受整个范围的Table1,在本例中,与第2列相同的标题下的组合框值。然后高级过滤器隐藏不匹配这些数据的所有行。

注意:高级过滤器可能需要比一个组合框值更多的标准。

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

代码语言:javascript
运行
复制
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的行。

代码语言:javascript
运行
复制
Header2 | Header3 'this will return rows with both A under Header2 and B under Header3
A       | B

这可以通过与数据一样多的列和值来展开。请注意,您的表不能有空值,因为这将与所有数据匹配。这就是高级过滤器(如果使用正确)比.autofilter强大得多的原因,因为自动筛选器在默认情况下只搜索一个列,并且在处理多个标准时非常挑剔。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58232543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档