答案1
您的意思是您想按特定單元格值進行過濾,而不是使用內建的表格過濾進行過濾?
那麼,您可以使用巨集呼叫自動過濾器,並使用儲存格的值作為條件。
您可以將巨集放入工作表中,並在每次使用子項變更相關儲存格之一時自動呼叫它Worksheet_Change
。
寫法有很多種,但是我們需要指定要過濾哪個表,還需要指定要過濾哪一行。
這是我在範例中放入工作表中的程式碼(透過右鍵單擊工作表標籤並選擇“顯示程式碼”):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tabl As String, i As Long, C as Range
tabl = "Table1" 'Name of the Table
If Not Application.Intersect(Range(Target.Address), Range("B4:E4")) Is Nothing And Target.Count < 5 Then
For Each C In Target
tCol = Range(tabl & "[" & C.Offset(-1).Value2 & "]").Column
If C.Value2 = "" Then
ListObjects(tabl).Range.AutoFilter Field:=tCol
Else
ListObjects(tabl).Range.AutoFilter Field:=tCol, Criteria1:=C.Value2
End If
Next C
End If
End Sub
結果:
編輯
新增循環以便能夠一次清除所有過濾器。
此程式碼要求您的標題在輸入儲存格和表格中相同,否則會引發錯誤。
-
Worksheet_Change
當工作表上的單元格更改時調用。
這通常與 結合使用,
If Not Application.Intersect(Range(Target.Address), Range("")) Is Nothing Then
以限制子系統的運行,除非針對特定區域。
限制Target.Count
也是一個好主意,以防止程式碼崩潰。通常您希望將其限制為單一目標,除非您打算循環選擇,就像我在本例中所做的那樣。
如果您喜歡帶有選項的下拉列表,這裡有一個 VBA 方法:excel透過資料驗證刪除重複項
答案2
我想建議一個數組(CSE)公式,將幫助您根據幾個標準提取多行。
怎麼運作的:
- 我假設來源資料位於 Range 中
A2:E10
。 - 標準範圍是
A16:E16
。 - 在 Cell 中輸入此公式
A20
,完成 Ctrl+Shift+Enter,先填充右,然後填入。
{=IFERROR(INDEX($A$2:$E$10,SMALL(IF(MMULT(($A$2:$E$10=$A$16:$E$16)*1,{1;1;1;1;1;1;1})=COUNTA($A$16:$E$16),MATCH(ROW($A$2:$A$10),ROW($A$2:$A$10)),""),ROWS($A$1:A1)),COLUMNS($A$1:A1)),"")}
筆記:
- 如果標準單元格為空,則此公式將傳回所有記錄。
- 您可以將一種礦石放入多個條件來過濾相關記錄。
讓我解釋一下命令的機制。
MMULT function
無法使用布林值,因此為了使其正常工作,公式必須將陣列乘以 1。
MMULT(($A$2:$E$10=$A$16:$E$16)*1,{1;1;1;1;1;1;1})
變成,
MMULT({0, 0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 1, 0;0, 0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0, 0;0, 0, 1, 0, 0, 1, 0;0, 0, 1, 0, 0, 0, 0;0, 0, 1, 0, 0, 0, 0;0, 0, 1, 0, 0, 1, 0;0, 0, 1, 0, 0, 0, 0},{1;1;1;1;1;1;1})
並返回,
{0;0;1;0;0;2;1;1;2;1}
和,
MMULT(($A$2:$E$10=$A$16:$E$16)*1, {1;1;1;1;1;1;1})=COUNTA($A$16:$E$16)
變成,
{0;0;1;0;0;2;1;1;2;1}=COUNTA($A$16:$E$16)
變成,
{0;0;1;0;0;2;1;1;2;1}=2
並返回,
{FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; FALSE; TRUE; FALSE}.
IF(MMULT(($A$2:$E$10=$A$16:$E$16)*1, {1;1;1;1;1;1;1})=COUNTA($A$16:$E$16), MATCH(ROW($A$2:$A$10), ROW($A$2:$A$10)), "")
變成,
IF({FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; FALSE; TRUE; FALSE}, MATCH(ROW($A$2:$A$10), ROW($A$2:$A$10)), "")
小的函數取得數組中第 k 個最小的數字。
指數函數根據行號和列號從單元格範圍或陣列中傳回一個值。