Excel 2010:VBA 將傳入文字轉換為多重選取下拉列表

Excel 2010:VBA 將傳入文字轉換為多重選取下拉列表

我經常收到原始匯出文件,並且我編寫了巨集來格式化和操作它。我使用 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

宏後
在此輸入影像描述

我相信您會明白這個想法以及如何適應它。

相關內容