- ベストアンサー
エクセルVBAで複数条件でセルをクリアする方法
- エクセルVBAを使用して、複数の条件でセルをクリアする方法について教えてください。
- 表内の特定のセルに対して、完全一致する文字や数字を検索し、クリアする方法について知りたいです。
- 関数ではなくVBAを使用した場合、同じ整理処理を繰り返し行うことができるため、効率的です。具体的な方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
たびたびお邪魔します。 >c.ClearContents の部分で止まってしまうというコトですので・・・ 結合セルがある場合(仮にA2~A4セルが結合されているとすると) ClearContents を使う場合は Range("A2:A4").ClearContents といった具合に結合セルのセル番地を指定しないと そうようなエラーになると思います。 しかし結合セルがあちらこちらにあるとこれでは大変ですので 単純に >c = "" とした方が間違いないと思います。 そこで今一度コードを載せてみます。 (今回もE列に「0」があっても、E列の「0」は消さないようにしています。 Sub test2() Dim c As Range For Each c In ActiveSheet.UsedRange If c.Column < 5 Then '←A~D列の場合のみ(E列に「0」がある場合は残すため) If c = "×" Or c = 0 Or c = "名" Then c = "" End If End If Next c End Sub こんな感じではどうでしょうか?m(_ _)m
その他の回答 (5)
- tom04
- ベストアンサー率49% (2537/5117)
No.1・4です。 エラーの件について・・・ 前回のコードはシートモジュールの場合のコードですので 標準モジュールにしているとおそらくそのようなエラーが表示されると思います。 標準モジュールのままで良いと思いますが、 前回のコードの >For Each c In UsedRange を >For Each c In ActiveSheet.UsedRange に訂正し、操作したいSheetをアクティブにしてマクロを実行してみてください。 おそらく大丈夫だと思います。m(_ _)m
補足
>tom04さん ご回答ありがとうございます! 知識不足で大変ご迷惑をおかけいたしましたm(__)m シートモジュールと標準モジュールの違いがわからず… 今までずっと標準モジュールでやっておりまして… ご教示頂いた通り、”ActiveSheet.”を追記して動かしてみましたが、今度は”c.ClearContents”の部分で「統合されたセルの一部を変更することができません。」とエラーが出てしまいました。 表題の部分をセル結合し、題名を記入している為に起こったと思い、セル結合を解除し、実行しましたら、動いたのですが、「×」は消えましたが、「名」が消えません… 何かやり方が違うのでしょうか? 他のファイルでも、いくつかセル結合している部分が存在します… 結合したセルにも対応できる方法はりますでしょうか? ご面倒をお掛けいたしますが、引き続きご教示をお願い申し上げますm(__)m
- tom04
- ベストアンサー率49% (2537/5117)
No.1です! B列は「○」か「×」・C列は数値・D列は「○名」か「名」しか入らない! という条件であれば前回のように列毎の条件分けをする必要はないですね! ↓のコードに変更してみてください。 Sub test2() Dim c As Range For Each c In UsedRange If c.Column < 5 Then If c = "×" Or c = 0 Or c = "名" Then c.ClearContents End If End If Next c End Sub ※ E列の数値に「0」があってもクリアしないようにしてみました。 そして補足の件ですが、Case 4 に関しては大きな勘違いをしていました。 仮にD列に 4名と入っていても「4」を残して「名」だけ消すコードで数値だけが残ってしまいます。 それから >For Each c In ”UsedRange” に関してはダブルクォーテーションなしにしてください。 何度も失礼しました。m(_ _)m
補足
>tom04さん ご丁寧にご回答ありがとうございます! >B列は「○」か「×」・C列は数値・D列は「○名」か「名」しか入らない! >という条件であれば前回のように列毎の条件分けをする必要はないです >ね! その通りです!たまにイレギュラーが発生する時はありますが… >それから >>For Each c In ”UsedRange” >に関してはダブルクォーテーションなしにしてください。 こちらですが ”UsedRange”部分でエラーが出てしまいます。 コードには「For Each c In UsedRange」と記載しております。 エラーが出てしまい、動かないのでテストができません… 度々ご面倒をお掛けしますが、引き続きよろしくお願い申し上げますm(__)m
- keithin
- ベストアンサー率66% (5278/7941)
>複数の条件で行いたい sub macro1() dim h, targetlist targetlist = array("×",0,"名") for each h in targetlist cells.replace what:=h, replacement:="",lookat:=xlwhole next end sub といったカンジで。
お礼
早急なご回答ありがとうございました! 出来ました! 感動です!!! ちなみに >targetlist = array("×",0,"名") 部分にいろいろ追加すれば、広範囲に対応できますよね? VBAは奥が深いですね… 皆さんでそれぞれ作り方が違い、パターンもいろいろで… もっと勉強します!!! 本当にありがとうございました!m(__)m
- mar00
- ベストアンサー率36% (158/430)
Sub Macro1() Do X = InputBox("検索対象を入力してください。") If X = "" Then Exit Sub Cells.Replace What:=X, Replacement:="", LookAt:=xlWhole Loop End Sub InputBoxに何も入力をしないでOKを選択するかキャンセルを選択すると 終了するようになっています。
補足
早々のご回答ありがとうございます! 試みてみましたが、 >Do >”X =” InputBox("検索対象を入力してください。") >If X = "" Then Exit Sub ””部分で「定数が定義されていません」とエラーが出てしまいます… なぜでしょうか??? 初心者なもので申し訳ありません… InputBoxの入力なしで、できれば扱いたいのですが、可能でしょうか? わがままを言って、大変申し訳ありません… 引き続き、ご教示をお願いしますm(__)m
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 一例です。 Sub test() Dim c As Range For Each c In UsedRange Select Case c.Column Case 2 If c = "×" Then c.ClearContents End If Case 3 If c = 0 Then c.ClearContents End If Case 4 c = WorksheetFunction.Substitute(c, "名", "") End Select Next c End Sub こんな感じではどうでしょうか?m(_ _)m
補足
早々のご回答ありがとうございます! 試みてみましたが、 >Dim c As Range >For Each c In ”UsedRange” >Select Case c.Column ””部分で「定数が定義されていません」とエラーが出てしまいます… なぜでしょうか??? それと質問なのですが、 >Case 4 >c = WorksheetFunction.Substitute(c, "名", "") はCase 2の場合の >If c = "×" Then を「If c = "名" Then」とするとおかしくなるのでしょうか? Case 4を少し詳しくご説明頂けませんでしょうか? 初心者なもので、大変申し訳ありません… ご指導をお願いしますm(__)m
お礼
>tom04さん 返信が遅くなり、申し訳ありませんでした! 細かなご指導ありがとうございます! できました!!!ありがとうございます!感激です!!! やはりVBAは難しいですね… もっと勉強して習得できるように頑張ります! お忙しい中、何度もご教示下しまして、 本当にありがとうございましたm(__)m