プロが教えるわが家の防犯対策術!

vbaを始めたばかりでまだ全然分からず、調べ調べやっております。

データの2行目B列からO列までフィルターをかけ、I列の要素から5つ以外を抽出&削除したいです。
調べて下記のようなコードまでたどり着きましたが、これで指定すると、"XY"に付随して”XYZ”という要素も残ってしまいます。
コードが部分一致になっているからということは理解できたのですが、完全一致にするにはどうすればよいでしょうか?

Dim a
a = Application.Transpose(Range("I3:I" & Range("I65536").End(xlUp).Row).Value)

a = Filter(a, "BG", False)
a = Filter(a, "BGY", False)
a = Filter(a, "KM", False)
a = Filter(a, "WR", False)
a = Filter(a, "XY", False)


ActiveSheet.AutoFilterMode = False
With Range("B2").CurrentRegion
Range("B2", .Cells(.Count)).AutoFilter field:=8, Criteria1:=a, Operator:=xlFilterValues
End With

質問者からの補足コメント

  • BG、BGY、KM、WR、XYZの5つを完全一致で除外したいです!

    ほかの要素をただ選択していくコードだと、新たな要素が出てきた時にその要素の選択が抜けてしまうので…

      補足日時:2021/07/27 13:17

A 回答 (3件)

こんにちは、


作業用や作業シートを使用するのは、とても良い方法と思います。
>ゴリゴリ書きたくないです!笑
確かに

すでに良いアドバイスがありますが、
Matchを使ってa 配列を作れば良いので ゴリくらいではないかと、、

VBAカテなので配列を作る簡単なサンプルです

Dim a(), b
Dim r As Range
Dim i As Long
b = Array("BG", "BGY", "KM", "WR", "XY")
For Each r In Range("I3:I" & Range("I65536").End(xlUp))
If Not IsError(Application.Match(r.Text, b, 0)) = False Then
ReDim Preserve a(i)
a(i) = r.Value
i = i + 1
End If
Next

Falseで無い事を示します。

配列bはMatch関数内に直置きでも良いですが、b自体を別の方法で
作成するかもなので 変数にしました。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます!

まだまだ勉強しないといけないことだけで、まずこのサンプルの理解からやらねば!という感じです笑
私も回答者さんのようにコードがかけるよう頑張ります!アドバイスをありがとうございます!

お礼日時:2021/07/28 07:31

あんまりゴリゴリ、コード書きたくないよね。


なので、ワード判定用の列を1列追加すると。
例えば、5つのワードのどれかと一致している場合は1、それ以外は0とし、その列でオートフィルタを使う、とか。
ワード判定用はMATCH関数でも使う、とか。

ダメかね?
    • good
    • 1
この回答へのお礼

ゴリゴリ書きたくないです!笑

MATCH関数の手がありましたか!
なるほど!
挑戦してみます!

ありがとうございます!!

お礼日時:2021/07/27 18:18

オートフィルタで処理しているなら、


マクロの自動記録を使ったらいい。

自動記録中に、オートフィルタで完全一致検索すれば、
それが記述されるはず。

元のソースコードと比較すれば、すぐ解決する。
ちょろいね!
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます!

完全一致検索だと2つまでしかできないですよね?できたらすみません!
あとただ単に5つを除外するのを自動記録すると、ほかの要素を指定するコードになってしまい、これでは新しい要素が出てきたらその選択が抜けてしまいます…

要素5つを完全一致で除外したいのですが…
分かりますでしょうか??

お礼日時:2021/07/27 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A