
私は定期的に生のエクスポート ファイルを受け取っており、それをフォーマットして操作するためのマクロを作成しました。私は Excel 2010 を使用しており、VBA にはそこそこ慣れています。
入力列の 1 つには、既知の (有限だが大きな) リストからセミコロンで区切られた名前のリストがあります。ただし、オートフィルターを使用する場合、エントリは真の複数選択のようには扱われません。
質問:Excel に「apple; grape」を「apple」と「grape」の両方の複数選択として認識するようにプログラムで指示できますか?
例:
リストには次の名前だけが含まれていると仮定します: リンゴ チェリー ブドウ オレンジ 桃
列 (A) のセルには、これらの果物が 1 つ、2 つ、... または 5 つ、任意の組み合わせで「;」で区切られて含まれる場合があります。
(A1) = リンゴ (A2) = リンゴ、ブドウ (A3) = リンゴ、桃 (A4) = チェリー、ブドウ (A5 = チェリー、オレンジ
幸運なことに、受信データは常にアルファベット順にエクスポートされます (そのため、1 つのセルに「apple; grape」が含まれ、別のセルに「grape; apple」が含まれることはありません)。
問題:オートフィルタは、可能な組み合わせがそれぞれ固有の「選択」オプションであると想定します。後の手順では、複数の条件に基づいて組み合わせ/フィルタリングする必要があり、配列- リストが大きすぎて、すべての組み合わせ順列を一意の可能性として表示することができないためです。
[たとえば、データのグループを新しいタブにコピーするようにフィルタリングしているときに、「grape」を含むものだけを新しいタブに移動することもありますが、「grape」または「cherry」を含むものがすべて同じ新しいタブにコピーされることもあります。]
私が考えすぎて、必要以上に難しくしている可能性は十分にあります。
ありがとう!
編集: 言い換えると、指数関数的に大きな組み合わせセットで Range().Autofilter Field... Criteria1:=() を合理的にループする方法がわかりません。わかりますか?
答え1
必要な数の条件を処理できるため、advancedfilter
の代わりにを使用します。 次に動作例を示します。最初のスクリーンショットに示すように Excel シートを設定し、マクロを実行します。autofilter
マクロ前
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
マクロ後
きっとそのアイデアとそれをどのように応用するかがわかると思います。