簡體   English   中英

VBA Excel 和 combobox 中的高級過濾器

[英]Advanced filter in VBA Excel with combobox

我有這個 Excel 表和 combobox 里面有一些值。

這是一個例子

在此處輸入圖像描述

我想做的是:

在 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

但我不能讓它工作我應該發布預期的 output 嗎?

這是我預期的 output:

在此處輸入圖像描述

高級過濾器用於按一系列標准進行過濾,但要根據 combobox 值獲得的一個標准來獲得結果,一個簡單的自動過濾器可以做到這一點:

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

說明:lastrow 變暗以獲取 integer(數值整數)。 然后用迄今為止最可靠的lastrow方法確定 然后范圍 A1 到 C 和你的 lastrow (例如有效的A1:C7 )和一個自動過濾器被應用。 該字段是它過濾的范圍內的列,在這種情況下,3 表示 C 列(如果您的范圍是 B:D,3 表示范圍中的第 3 列,因此 D 列)。 標准是直接取自您的 combobox 和ComboBox1.value的值。 運算符 xlFilterValues 意味着它將按列中找到的值進行過濾,即使該列有公式也可以使用。

請注意:您可以直接從 combobox 中獲取值,無需先將其放入單元格中,但您可以根據需要這樣做。 在這種情況下,也不是絕對需要找到數據的最后一行,只需將 range 設置為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

注意:有一個 combobox 與linkedcell F2,范圍F1:F2 在名為table1 的表中。 由於高級過濾器屬性,我沒有讓高級過濾器工作而不把它放在一個表中。 表 1 的 header 需要與您要過濾的列的 header 完全相同。 如果將 header 設置為與第 1 列相同,它將在第 1 列的表中搜索值。

說明:工作表 dim 將工作表設置為當前文件 sheet1。 這不是絕對必要的,但稍后會派上用場。 lastr與上次相同,確定最后一行並將過濾器應用於此范圍。 再次不是絕對必要的,但在這種情況下會加快速度。

If sh.FilterMode Then sh.ShowAllData對於您在 select 一個新值時很重要。 它基本上會重置過濾器,因此可以應用新的過濾器。 它檢測是否有過濾器應用於您的工作表,然后將其設置為顯示所有數據。 如果沒有應用過濾器,則不需要,但如果您忽略測試並僅放入showalldata它將失敗,因為沒有其他內容可顯示並拋出錯誤,因此測試。 如果在應用新過濾器時未重置過濾器,它也會引發錯誤,因為未找到數據(因為它已被前一個過濾器過濾掉)。

然后像以前一樣將高級過濾器應用於包含您的數據的范圍。 這里要注意的標准:它采用 Table1 的全部范圍,在這種情況下,只是 header 下方的 combobox 值與第 2 列相同。然后,高級過濾器會隱藏所有與這些數據不匹配的行。

注意:高級過濾器可以采用更多的標准,而不僅僅是一個 combobox 值。

For every row in Table1, it will handle it as an OR statement: So if in Table 1 I have a header similar to header 2 with below it value A, and a header similar to header 3 with two rows below it value B, it將搜索第 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 默認只會搜索一列,並且很難處理多個條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM