VBAについて質問です。


VBAである文字列を含んでいるものを削除するやり方を教えていただけないでしょうか?

例えば、列Cにあいうえおを含む文字列を含んだものがあればその行を削除する。

例)列C1にあいうえおかきくけこ というデータがある場合 マクロ実行後1行目が全て削除されます。
例)列C2にあいうえお というデータがある場合 マクロ実行後2行目が全て削除されます。

お手数をおかけしますがわかるかたおりましたら型を書いていただければと思います。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/17 19:48:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:jccrh1 No.1

回答回数111ベストアンサー獲得回数19

ポイント100pt

オートフィルターを使用すればできると思います。

Sub 抽出行削除()
 Dim 検索結果  As Range
 Rows("1:1").Insert
 Columns("C:C").AutoFilter Field:=1, Criteria1:="=*あいうえお*"
 Set 検索結果 = Columns("C:C").SpecialCells(xlCellTypeVisible)
 AutoFilterMode = False
 検索結果.EntireRow.Delete
End Sub
id:aiomock

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

例)列C1にあいうえおかきくけこ というデータがある場合はいけたのですが、

例)列C2にあいうえお というデータがある場合 はいけなかったです。

今のままでも非常に便利ではあるのですが、、。

2009/12/17 19:39:46
  • id:jccrh1
    aiomockさん
    下記のデータでやってみましたが、C2の行がきちんと削除できましたが…。

    C1:あい
    C2:あいうえお
    C3:あ
    C4:い
      ↓
    C1:あい
    C2:あ
    C3:い

    注)もしC1とC2に「あいうえお」が含まれると両方共に削除されます。
      最初に見つかった行だけを削除するということでしょうか?
  • id:aiomock
    私の場合

    C1:あいうえおかきくけこ
    C2:あいうえお

    C1:あいうえお

    となりました。

    後本当に申し訳ないのですが、先ほど実際のデータで行ったところ削除できないものが結構ありました。
    削除したいデータが長いものであるからか、原因はわからないのですが。。。
    原因が考えられるようでしたら教えていただければと思います。

    C列に入っていて削除出来なかったデータ 例です。

    ★=セルに入っているデータ

    ★ヤフーケツサイ Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフ-ケツサ*"
    ★ジャパンネット銀行 本店営業部 普通預金 212a330 ああああ あああ(依頼人名:ああああ あああ Columns("C:C").AutoFilter Field:=1, Criteria1:="=*(依頼人名:ああああ あああ*"
    ★振込手数料(内消費税 ¥7) Columns("C:C").AutoFilter Field:=1, Criteria1:="=*振込手数料(内消費税*"

    うまくできませんでした。。。


    以下のように組んでいたのですが、これは間違いでしょうか???

    Dim 検索結果 As Range
    Rows("1:1").Insert
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフ-ケツサ*"
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*(依頼人名:あああ ああ゛*"
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*振込手数料(内消費税*"
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*カ-ド手数料(内*"
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*カ-ド出金*"
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*イ-バンクマネ-カ-ド(ゴ-ルド)会費*"
    Set 検索結果 = Columns("C:C").SpecialCells(xlCellTypeVisible)
    AutoFilterMode = False
    検索結果.EntireRow.Delete

    お手数をおかけしますがご回答頂ければと思います。
    お待ちしております。。。
  • id:jccrh1
    aiomock様
    削除はフィルター1つずつで行わないとだめです。
    以下のように修正してみました。
    ※"=*依頼人名:ああああ あああ*" は違っているようで勝手に訂正してあります。
    ※また、AutoFilter 部分も多少手直ししてあります。

    一応私のテストでは上手くいっているようです。
    確認してください。

    Sub 抽出行削除()
     Dim 検索データ As Variant
     Dim 検索キー  As Variant
     Dim 検索結果  As Range

     検索データ = Array("=*ヤフーケツサイ*", _
               "=*依頼人名:ああああ あああ*", _
               "=*振込手数料(内消費税*", _
               "=*カ-ド手数料(内*", _
               "=*カ-ド出金*", _
               "=*イ-バンクマネ-カ-ド(ゴ-ルド)会費*")
     For Each 検索キー In 検索データ
      Rows("1:1").Insert
      Columns("C:C").AutoFilter Field:=1, Criteria1:=検索キー, Operator:=xlAnd
      Set 検索結果 = Columns("C:C").SpecialCells(xlCellTypeVisible)
      ActiveSheet.AutoFilterMode = False
      検索結果.EntireRow.Delete
     Next
    End Sub
  • id:aiomock
    すいません。実行してみましたがうまくいきませんでした。。
    私の環境の問題かもしれないです。。

    Dim 検索結果 As Range
     Rows("1:1").Insert
     Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*"
     Set 検索結果 = Columns("C:C").SpecialCells(xlCellTypeVisible)
     AutoFilterMode = False
     検索結果.EntireRow.Delete

    これででしたら、ヤフーケツサイが削除出来ました。
    最後に頂いたプログラムではデータの状態は変わらずでした。

    jccrh1 さんの所で動くとなるとデータが若干違っていたりするのでしょうか。。

  • id:jccrh1
    aiomock様
    下記のように変更してみてください。

     Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*"
             ↓
     Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*" Operator:=xlAnd


  • id:aiomock
    jccrh1 さん

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

    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*" Operator:=xlAnd
    ですと構文エラーになってしまいます。

    また先ほど削除出来ていたヤフーケツサイが削除出来なくなりました。。
    非常に面倒なことになっています。。お手数をおかけします。。

    このまま jccrh1 さん に質問を回答していただくのも申し訳ないので、
    私の環境にあったコードを探して再度質問してみようと思います。

    自分で質問を終了させておきながら申し訳ありません。。。
  • id:aiomock
    本当に申し訳ないのですが、構文エラーについてわかりましたら教えていただければと思います。

    私の方でも変更して見たいと思います。

    Dim 検索結果 As Range
     Rows("1:1").Insert
     Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*" Operator:=xlAnd
     Set 検索結果 = Columns("C:C").SpecialCells(xlCellTypeVisible)
     AutoFilterMode = False
     検索結果.EntireRow.Delete



    Operator:=xlAnd

    が構文エラーでした。。
  • id:kn1967
    横から失礼。

    Operator:=xlAnd は抽出条件が複数存在するときにだけ使います。

    例えば、「ヤフー」と「楽天」の両方が含まれているものを抽出
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフー*", Operator:=xlAnd, Criteria2:="=*楽天*"
    例えば、「ヤフー」と「楽天」のいずれか一方が含まれているものを抽出
    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフー*", Operator:=xlOr, Criteria2:="=*楽天*"
    他にもありますが、割愛します。

    従って、1回あたり1つだけの時には不要です。書いてしまうと、
    ExcelVBAは「続きがあるはずなのに存在しないぞ! 構文エラーだ!」になります。


    ここから雑談。
    それにしても昨日の質問ラッシュはすごかったですね。
    返事するだけでも大変だったでしょうに・・・。
    一発目の回答で内容も確定しないうちから終了して、いるかまで連発して、
    あせりすぎだと思いますよ。失礼ながら、一度ためさせていただきましたが・・・。
    (たった4行の説明抜きの回答がありましたでしょ?
     その前の時に5分差で回答は後からオープンなんてのがあったので、
     気になって試させていただいたのです。)

    確かに、
    「別の質問をする際には以前の質問を終了しておく」ってのは1つの礼儀ですけど、
    そもそも質問文をよく吟味していれば、質問数は半分以下に減らせたはずですし、
    より深い説明と、じっくりテストする余裕も得られた事でしょう。

    そして、その内容と労に応じてポイント配分をかえたり、
    いるかの有無を決めたりしていただく時間も取れたと思います。
    (最小ゼロポイントから最大100ポイントくらいの間で十分かと思います。
     予想外に気に入った時だけ200にするとかすれば、さらにGood。
     たまに多めにしても今の乱発よりは結果的に少なくなると思います。)

    年末も近づき、いろいろ大変かと思いますが、くれぐれも、ご無理はなさらぬよう・・・。
    (と言いつつ私は、ここ3日で5時間くらいしか寝てなかったりするのだが・・・。)
  • id:jccrh1
    【aiomock様】
    Operator:=xlAnd の 前に ,(カンマ)が抜けています。

     Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*" Operator:=xlAnd

    Columns("C:C").AutoFilter Field:=1, Criteria1:="=*ヤフーケツサ*", Operator:=xlAnd

    【kn1967様】
    私も最初「Operator:=xlAnd」を指定しなかったのですが、結果がおかしいことがあり指定して正常に動作しました。
  • id:aiomock
    ご回答ありがとうございます。無事実行できました。
    私の質問に最後までご回答いただいて本当にありがとうございます^^。

    kn1967さん
    ご指摘ありがとうございます。昨日は質問をかなり多くしてしまいました。
    各目的(機能)を達成したいと思い、目的ごとに質問をしたのですが、
    kn1967さんの より深い説明と、じっくりテストの余裕 まさにその通りだと思います。

    今までは目的を達成することだけに、意識が集中していたのですが、
    いろんな人たちの知識をどれだけ吸収して活用できるか
    そこの部分にもっと意識を働かせる事は今後プログラムをしていく中で非常に重要なことではないかと気づきました。
    特にVBAに関しては初心者ですのでより多くの知識を今後得られるように、よりはてなを活用していきたいと思います。

    いつもご指摘本当にありがとうございます。また一つ気づけたこと本当に感謝しております。
  • id:kn1967
    >(カンマ)が抜けています。

    スミマセン。本日再確認したところ、問題ありませんでした。

    Operatorの有無による挙動の違いは気になるところですが、
    軽く検索してみても、その違いは判りませんでした。
    また、機会があれば探ってみたいと思います。
    ありがとうございました。そして、お手数おかけしました。> jccrh1 さん

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません