
我經常收到原始匯出文件,並且我編寫了巨集來格式化和操作它。我使用 Excel 2010,並且對 VBA 比較熟悉。
其中一個傳入列有一個名稱列表,來自已知(有限但很大)列表,以分號分隔。但是,如果您使用自動篩選,它不會將條目視為真正的多重選擇。
問題:我可以透過程式告訴 Excel 將「蘋果;葡萄」視為「蘋果」和「葡萄」的多選嗎?
例子:
假設我們知道該清單僅包含以下名稱: apple、cherry、grave、orange、peach
(A) 欄中的儲存格可能包含一個、兩個、...或五個這些水果的任意組合,並以「;」分隔。
(A1) = 蘋果 (A2) = 蘋果;葡萄(A3)=蘋果;桃子(A4)=櫻桃;葡萄(A5)=櫻桃;橘子
對我來說幸運的是,傳入的數據始終按字母順序導出(因此我不會有一個單元格包含“蘋果;葡萄”而另一個單元格包含“葡萄;蘋果”)。
問題:自動篩選假定每個可能的組合都是唯一的「選擇」選項。在後面的步驟中,我需要根據多個標準進行組合/過濾,這使得使用大批- 因為我的清單太大,無法將所有組合排列視為獨特的可能性。
[例如:我正在過濾以將一組資料複製到新選項卡,有時我只是將帶有“葡萄”的任何內容移動到新選項卡,但有時包含“葡萄”或“櫻桃”的任何內容都會被複製到相同的新標籤。
很明顯,我想太多了,讓它變得比原來更難!
謝謝!
編輯:換句話說,我不知道如何使用指數級大的組合集合理地循環 Range().Autofilter Field... Criteria1:=() 。合理?
答案1
使用advancedfilter
而不是autofilter
因為它可以處理您想要的任意數量的條件。
這是一個工作範例。像第一個螢幕截圖所示設定 Excel 工作表並執行巨集。
宏之前
Sub AdvancedFilterTest()
'clear old results and old filters
Range("C:C").Clear
Range("D:D").Clear
'criteria header name and data header name needs to be the same
[C1] = [B1]
'Split multiple criterias by semicolon and save them as array
Criterias = Split([A2], ";")
'write the array to cells since advancedfilter needs a range as criteria
For i = 0 To UBound(Criterias)
Cells(i + 2, 3) = Criterias(i)
Next i
'Set the cells as a range so advancedfilter can use them
Set critrange = Range(Cells(1, 3), Cells(UBound(Criterias) + 2, 3))
'advanced filter will filter and copy your data to a new target range
Range("B:B").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=critrange, CopyToRange:=Sheets(1).[D1]
End Sub
宏後
我相信您會明白這個想法以及如何適應它。