Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
3つ以上のテキストフィルターを条件にしたい
投稿日時: 23/05/29 10:02:52
投稿者: takatada72

お疲れさまです。
 
・データは、A2-DU4000まであります。
・E列に製品名+カテゴリの名前が記載されております。
※バスタオル、マグカップ、バッグ、ハンカチ、ぬいぐるみ、他などが
記載されております。
 
E列の名前の中にListArray(0-2)のあるようなカテゴリを抽出させたいのですが、
下記を実行しても実行後は、0件になってしまいます。色々と検索して見たのですが、
いっこうにうまくいきません。こちらへ投稿させて頂きき、解決できればと思い、
投稿させて頂きました。
 
お忙しいとは思いますが宜しくお願い致します。
 
Dim ListArray(3) As String
Dim MaxRow As Long
 
ListArray(0) = "*バスタオル*"
ListArray(1) = "*アクリル*"
ListArray(2) = "*ぬいぐるみ*"
 
MaxRow = Cells(Rows.Count, 5).End(xlUp).Row
 
Range(Cells(1, 1), Cells(MaxRow, 125)) _
            .AutoFilter Field:=5, _
            Criteria1:=ListArray, _
            Operator:=xlFilterValues

投稿日時: 23/05/29 12:22:25
投稿者: takatada72

すみません。
 
補足になりますが、
 
いぬマグカップ、ネコタオル、うまバッグのように、必ず、動物名+カテゴリに
なりますので、カテゴリは、含まれる条件になります。
 
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 23/05/29 13:08:42
投稿者: taitani
投稿者のウェブサイトに移動

Range("A1:DU" & MaxRow).AutoFilter Field:=5, Criteria1:=ListArray(0), Operator:=xlFilterValues, _
                                  Criteria2:=ListArray(1), Operator:=xlOr, _
                                  Criteria3:=ListArray(2), Operator:=xlOr
 
とかでしょうか。

投稿日時: 23/05/29 13:38:12
投稿者: takatada72

taitaniさん
早速、ありがとうございました。
下記を実行したところ、「Criteria3:=」で名前付き引数が見つかりません。
とエラーが出ました。私が記載した内容に間違いはあるのでしょうか
 
お忙しいとは思いますが宜しくお願い致します。
 
Dim ListArray(3) As String
Dim MaxRow As Long
  
ListArray(0) = "*バスタオル*"
ListArray(1) = "*アクリル*"
ListArray(2) = "*ぬいぐるみ*"
  
MaxRow = Cells(Rows.Count, 5).End(xlUp).Row
 
Range("A1:DU" & MaxRow).AutoFilter Field:=5, Criteria1:=ListArray(0), _
Operator:=xlFilterValues, Criteria2:=ListArray(1), Operator:=xlOr, _
Criteria3:=ListArray(2), Operator:=xlOr

回答
投稿日時: 23/05/29 13:56:28
投稿者: WinArrow

3つ以上の検索条件では、ワイルドカードが使えない仕様ではないでしょうか?

回答
投稿日時: 23/05/29 14:15:04
投稿者: QooApp

配列で指定(実質3重指定以上)の場合、Arrayで絞り込み単語を設定する時にワイルドカードは設定できないはずです。
 
参考引用
http://officetanaka.net/excel/vba/tips/tips190.htm
 
具体的な解決策を考える場合、おそらくですが、製品名orカテゴリ名単体の項目へフィルタを設定したほうが現実的ではないかなと考えます。
 
少なくともワイルドカードを設定しないように運用することを考えるなら事前に分割済みのデータを別の列に生成しておき、単純な3重指定を行えるようにするほうがデータ項目の整理という点でも安全性がたかいかなあと。
 
前後の単語を連結した中間部分に別の単語が生成されてしまい、誤った絞り込みを発生させるリスクも減ると思います。

回答
投稿日時: 23/05/29 14:15:56
投稿者: Suzu

AutoFilter に Criteria3 の 引数 はありません。
なので、エラーになります。
 
セルの値と一致なら、Criteria1 に配列を渡す事で、3つ以上の場合でも抽出できますが
あいまい検索 の場合は、Criteria1、Criteria2 の 2つの条件だけです。
 
 
簡単なのは
Range.AdvancedFilter メソッド
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.advancedfilter
 
 
AutoFilter でやるのであれば、
「一致」であれば、抽出できるのですから
1.検索対処の列の値すべてに対し あいまい検索条件の値が含まれるかどうかを判定
2.含まれる場合は、別の配列を用意し、その配列に セルの値そのまま を渡し
3.最後のセルまで 2 の動作を行い、最終的に、別の配列を、Criteria1 に渡し
  Operator:=xlFilterValues で抽出
 
でしょうか。

回答
投稿日時: 23/05/29 14:18:43
投稿者: Suzu

引用:
AutoFilter でやるのであれば、
  :

 
 
【エクセルマクロ】オートフィルタ複数条件3つ以上:9選
https://kirinote.com/excelvba-multiple-filter/
 
オートフィルタ複数条件3つ以上(含む)
 
にありましたね。

投稿日時: 23/05/29 14:50:54
投稿者: takatada72

皆様、ご確認をありがとうございました。
 
すべてあるデータを使ってのことなので、製品名とカテゴリを分けての
ことが難しいのであります。
 
Suzuさんが示して頂いたサイトを学ばせて頂きたいと思います。
途中でつまるようであれば、ご質問させて頂きますので、引き続き宜しく
お願い致します。

回答
投稿日時: 23/05/29 15:04:44
投稿者: taitani
投稿者のウェブサイトに移動

takatada72 さん、動作確認を行っておらずご迷惑おかけしました。
VBA にこだわれないということであれば、Filter 関数を利用する。
 
もしくは、PowerQuery で理想の抽出が可能かもしれません。

投稿日時: 23/05/29 15:32:50
投稿者: takatada72

お疲れさまです。
 
下記のようにyoutubeの動画から見つけて、3つ以上の条件/ワイルド
カードが使えるようになりました。
(113) VBAオートフィルターで3つ以上かつワイルドカードや不等号<発展編> - YouTube
https://www.youtube.com/watch?v=e2JgY6AZPKQ
無事、解決になりました。
 
taitaniさん、お気にしないで下さい。投稿頂いただけでも嬉しいです。
 
ありがとうございました。
 
ActiveSheet.AutoFilterMode = False
Range("E2").AutoFilter 5, "*タオル*", xlOr, "*マグカップ*"
Range("E2").CurrentRegion.Resize(, 1).Offset(0, 2) = "対象"
ActiveSheet.AutoFilterMode = False
Range("E2").AutoFilter 5, "*ぬいぐるみ*"
Range("E2").CurrentRegion.Resize(, 1).Offset(0, 2) = "対象"
ActiveSheet.AutoFilterMode = False
Range("E2").AutoFilter 3, "対象", VisibleDropDown:=False