エクセルVBAで複数条件でセルをクリアする方法

このQ&Aのポイント
  • エクセルVBAを使用して、複数の条件でセルをクリアする方法について教えてください。
  • 表内の特定のセルに対して、完全一致する文字や数字を検索し、クリアする方法について知りたいです。
  • 関数ではなくVBAを使用した場合、同じ整理処理を繰り返し行うことができるため、効率的です。具体的な方法を教えてください。
回答を見る
  • ベストアンサー

エクセルVBA 検索クリア

こんにちは! なかなか思うようには行かず… ご教示頂けませんでしょうか? エクセルのSheet内の様々なセルに文字や数値が混在しているものがあります。    A  B  C  D  E 1  35  〇  0  3名  30 2  20      0  0名  25 3  25  〇  3   名    5 4  13  〇  1  10名  10 5  20  ×  0   名   6 このような表の中のB5の"×"だけクリアする C1、C2、C5の"0"だけクリアする D3、D5の"名"だけクリアする というように該当文字or数字を完全一致したもののみクリア Sheet内を検索し、終了したら次の条件を検索というように、 複数の条件で行いたいのですが、どのようにすれば良いかがわかりません… 関数でもできるような気がしますが、他にも沢山のファイルがあり、毎回同じように整理をしなければならないので、VBAでできればと考えております。 どなたかお分かりの方、お教え下さいm(__)m よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.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

et9985ap
質問者

お礼

>tom04さん 返信が遅くなり、申し訳ありませんでした! 細かなご指導ありがとうございます! できました!!!ありがとうございます!感激です!!! やはりVBAは難しいですね… もっと勉強して習得できるように頑張ります! お忙しい中、何度もご教示下しまして、 本当にありがとうございましたm(__)m

その他の回答 (5)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.1・4です。 エラーの件について・・・ 前回のコードはシートモジュールの場合のコードですので 標準モジュールにしているとおそらくそのようなエラーが表示されると思います。 標準モジュールのままで良いと思いますが、 前回のコードの >For Each c In UsedRange を >For Each c In ActiveSheet.UsedRange に訂正し、操作したいSheetをアクティブにしてマクロを実行してみてください。 おそらく大丈夫だと思います。m(_ _)m

et9985ap
質問者

補足

>tom04さん ご回答ありがとうございます! 知識不足で大変ご迷惑をおかけいたしましたm(__)m シートモジュールと標準モジュールの違いがわからず… 今までずっと標準モジュールでやっておりまして… ご教示頂いた通り、”ActiveSheet.”を追記して動かしてみましたが、今度は”c.ClearContents”の部分で「統合されたセルの一部を変更することができません。」とエラーが出てしまいました。 表題の部分をセル結合し、題名を記入している為に起こったと思い、セル結合を解除し、実行しましたら、動いたのですが、「×」は消えましたが、「名」が消えません… 何かやり方が違うのでしょうか? 他のファイルでも、いくつかセル結合している部分が存在します… 結合したセルにも対応できる方法はりますでしょうか? ご面倒をお掛けいたしますが、引き続きご教示をお願い申し上げますm(__)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

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

et9985ap
質問者

補足

>tom04さん ご丁寧にご回答ありがとうございます! >B列は「○」か「×」・C列は数値・D列は「○名」か「名」しか入らない! >という条件であれば前回のように列毎の条件分けをする必要はないです >ね! その通りです!たまにイレギュラーが発生する時はありますが… >それから >>For Each c In ”UsedRange” >に関してはダブルクォーテーションなしにしてください。 こちらですが ”UsedRange”部分でエラーが出てしまいます。 コードには「For Each c In UsedRange」と記載しております。 エラーが出てしまい、動かないのでテストができません… 度々ご面倒をお掛けしますが、引き続きよろしくお願い申し上げますm(__)m

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

>複数の条件で行いたい sub macro1()  dim h, targetlist  targetlist = array("×",0,"名")  for each h in targetlist   cells.replace what:=h, replacement:="",lookat:=xlwhole  next end sub といったカンジで。

et9985ap
質問者

お礼

早急なご回答ありがとうございました! 出来ました! 感動です!!! ちなみに >targetlist = array("×",0,"名") 部分にいろいろ追加すれば、広範囲に対応できますよね? VBAは奥が深いですね… 皆さんでそれぞれ作り方が違い、パターンもいろいろで… もっと勉強します!!! 本当にありがとうございました!m(__)m

  • mar00
  • ベストアンサー率36% (158/430)
回答No.2

Sub Macro1() Do X = InputBox("検索対象を入力してください。") If X = "" Then Exit Sub Cells.Replace What:=X, Replacement:="", LookAt:=xlWhole Loop End Sub InputBoxに何も入力をしないでOKを選択するかキャンセルを選択すると 終了するようになっています。

et9985ap
質問者

補足

早々のご回答ありがとうございます! 試みてみましたが、 >Do >”X =” InputBox("検索対象を入力してください。") >If X = "" Then Exit Sub ””部分で「定数が定義されていません」とエラーが出てしまいます… なぜでしょうか??? 初心者なもので申し訳ありません… InputBoxの入力なしで、できれば扱いたいのですが、可能でしょうか? わがままを言って、大変申し訳ありません… 引き続き、ご教示をお願いしますm(__)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 一例です。 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

et9985ap
質問者

補足

早々のご回答ありがとうございます! 試みてみましたが、 >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

関連するQ&A

  • エクセル VBAで2つのデータを比較して、一致するものを検索したい

    以下のような事をしたいと思っています。 VBAは今まで使った事が殆どなく困っております。 仕事で作らなければならず、宜しくお願い致します。 エクセルVBAで、既存と新規という2つのシートから 2つの条件(A列とB列の完全一致)で行を検索して 一致したものを探し出します。 一致したら「新規シート」の該当した行の売上列のデータを 「既存シート」の該当月の列へコピーしたいと思っております。 また、「新規シート」には「既存シート」にないデータが 存在するので、一致から漏れた行は「既存シート」へ 新たに追加のデータとしてコピーしたいと思っています。 イメージ↓ 既存シート) 商品名 |製造地|6月(製造月の売上)|7月(製造月の売上) a     |あ   |¥150      | b     |い   |¥200      | (空白)  |(空白)|          | 新規シート) 商品名 |製造地 |7月(製造月の売上)| a     |あ   |¥300      | b     |い   |¥100      | c     |う   |¥250      | 上記の2シートで、商品名と製造地の2つが一致していれば 「新規シート」の7月の列のデータを「既存シート」の 7月の列にコピーし、「既存シート」に存在しない 「新規シート」の商品名”c”の行のデータを「既存シート」へ 新たに商品名”c”の行を作成しコピーしたいと思っています。 出来上がり後の(既存シート) 商品名 |製造地 |6月(製造月の売上)|7月(製造月の売上) a      |あ   |¥150      |¥300 b      |い   |¥200      |¥100 c      |う   |¥0        |¥250

  • エクセルVBA 指定した文字を検索クリア

    こんにちは! 過去記事を見てもわからず、質問させて頂きます。 VBAは初心者ですが、猛勉強しているので、ほんの少しは理解できます。 sheet内にAccessからデータを取り込み、Vlookなどの関数を使い、表を作成しています。 その中に、値がなく後ろにつけた"泊"や"名"、「0」が返っているセルが存在します。(数値と文字列) (図の色がついたセル) 例えば"泊"を置換などで処理すると、H;I列の青色のセルまで置き換わってしまいます… やりたいことは、図のG列からK列の青色のセルを残し、赤色と緑色のセルを削除したいです。 該当文字と数値を検索(完全一致のみ)して、削除。それをLoopして といったイメージです… ※削除とはセル自体を削除するのではなく、入力されているものを消す(クリアってことですかね) 表現が下手で申し訳ございません! 非常に行き詰っております… ご教示をお願い申し上げます。

  • エクセル、VBA、抽出複数検索について

    エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

  • Excel VBAを使って会員検索

    Sheet1のA列に会員番号、B列に氏名、C列にフリガナ、D列に住所といったデータがあります。 Sheet2のA列に会員番号のみがあります。 この2つのデータを照合して、一致した場合のみ、Sheet1の該当会員データの横のセルに“一致”もしくは“1”などの値(上の例だとSheet1のE列に)を入力できるようなVBAを組みたいのですが、教えていただけますでしょうか?

  • ExcelのVBAについて

    ExcelのVBAについて VBA全くの初心者です。 以下のような処理を行いたいのですが、どなたかご教授をお願いします。 以下のように支店(1)~(3)のシートがあります。 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、   一致しない行を不一致データシートに出力する もう一つ別のマクロで、 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、、   一致する行を一致データシートに出力し、D列に対象データがあるシート名を表示する   ※可能でしたら、E列に対象データがある行番号も表示する -------------------------------- シート名:支店(1) A      B     C 商品No   商品名   備考 011    商品A   備考A 009    商品B   備考B 015    商品C   備考C -------------------------------- シート名:支店(2) A      B     C 商品No   商品名   備考 008    商品A   備考A 023    商品B   備考B 004    商品C   備考C -------------------------------- シート名:支店(3) A      B     C 商品No   商品名   備考 007    商品A   備考A 033    商品B   備考B 018    商品C   備考C -------------------------------- シート名:入力シート A      B     C 商品No   商品名   備考 ※ここに複数行入力する -------------------------------- シート名:不一致データシート A      B     C 商品No   商品名   備考 ※ここに出力される -------------------------------- シート名:一致データシート A      B     C 商品No   商品名   備考 ※ここに出力される

  • エクセルVBA/抽出・貼付け

    下記を行いたいのですが、どのようなコードになるのでしょうか? シート001(入力用) (1)A1~A50、B1~B50、C1~C50、D1~D50  に数値、E1~E50に文字列 (2)F1~F50、G1~G50、H1~H50、I1~I50  に数値、J1~J50に文字列 ※空白行混在 シート002(計算用) シート001に作ったコマンドボタン:クリックにより、 シート002を表示させ、A1~E100に、 シート(1)のA1~E50とF1~J50の空白行以外を連続して 反映させたい。並べ替え用など別シートを用いずに、 VBAコード内で処理したい。

  • VBAのセルのClearについて

    VBA超初心者で、困っていることがあります;; たとえば、プログラムを実行したら、セルの「A1~D3」の範囲をクリアするという物があったとして、 その他の条件が以下のようになっています。 (1)クリアしても、セル内の数式を保持 (2)クリア対象のセルの罫線は残す 私は、以下のように記述したのですが、数式は残るのですが罫線が残りませんでした。 Sheets("シート名").Range("A1:D3").ClearFormats 数式を保持し、罫線を残すようにするには、どのような記述をすれば良いのでしょうか。 以上、よろしくお願いいたします。

  • VBA複数セルで検索

    VBA複数セルで検索 VBA初心者です。 1つのシートにA列氏名1、B列番号1、c列エラー、D列氏名2、E列番号2と並んでます。 例) a*1001* *a*1001 a*1005*該当なし *a*1002 a*1000* *c*1003 c*1003* *e*1005 c*1005*該当なし *d*1004 以下続く(*はセル区切り) 氏名1と番号1の組み合わせが氏名2、番号2にあるかどうかチェックして ないものは、C列に「該当なし」とエラーを表示させたいです。 Find関数を使用してやってみたのですが、氏名と番号をセットで検索する方法がわかりません。 氏名と番号をくっつけて検索すればいいのでしょうか?

  • EXCELのデータベース利用について(VBA)

    VBA初心者の者です。 下記の様なEXCELファイルを作りたいのですが、どのようにすれば良いのか まったくわかりません。 ACCESSでの構築が簡単なのかもしれませんが、データ量がそれほど多くないことと 職場にACCESSがないため、可能であればEXCELで構築したいと考えています。 私自身、プログラムの知識がなく、EXCEL VBAのサイトを確認するのですが、いまいち どうすれば良いのかわかりません。 ぜひご教授の程よろしくお願いします。 3つのシートの構成は以下になります。 【入力シート】 A1セルに文字列(A~Z)入力欄 【○○データシート】 A列に A~Z の文字列 B列に 001~100までの数値 C列に 001~100までの数値 D列に 001~100までの数値 E列に 001~100までの数値 例)    A列   B列   C列   D列   E列 1   A   001 2   B   001    002    003   004 3   C   003 4   D   002    003 【▽コマンドシート】 A列に 001~100までの一意の数字 B列に 文字列(コマンド) C列に 文字列(コマンド詳細) 例)    A列    B列    C列 1   001   xx     blank 2   002   xxx△   xxx 3   003   xxxx    x○ 4   004   xxxxx   xxx 【欲しいVBA】 1、入力シートのA1セルに○○データシートのA列に該当するA~Zの 文字列を入力。 2、○○データシートのB列~F列までの数値を参照 3、2の数値において▽コマンドシートのA列に記載ある番号と紐づけを行い、 ▽コマンドシートのB列、C列に記載がある文字列を入力シートのB列、C列にコピー ※コピー時は▽コマンドシートの書式や体裁情報も含めてコピー。 例としては以下になります。 入力シートの A1セルにDを入力した場合は 入力シート    A列    B列    C列 1   D    xxx△  xxx 2        xxxx    x○ 3 以上、ご教授よろしくお願いします。

  • エクセルで別ブックを検索するマクロ、VBA

    エクセルで以下の処理を行えるマクロを作成したいです。 当方、マクロについてほとんど知識がありません。 恐縮ですが、教えていただけると嬉しいです。 ・主にしたいこと  [検索]ブックで一致するコードを探して、  [結果]ブックの対応するコードの行にそれぞれの項目を返したい。 ●ブック1 [検索]  シートが12個あります(それぞれ、1、2、3…12というシート名=1~12月分)  ↓各シートの内容    A    B    C    D 1  氏名  数値  コード  内容 2  abc   111  SS1234 あいうえお 3  bcd   123  SS3456 かきくけこ ・ ・ ・ といった感じです。 12個のシートの中身はそれぞれ似たようなものですが、 「コード」や「内容」などは少しずつ違います。 ●ブック2 [結果]  ↓シートの内容    A    B    C    D 1  氏名  コード  内容  数値 2      SS3456 3      SS1234 ・ ・ ・ といった感じです。 (注)検索用ブックとは列の並びが異なっています。 ここでやりたいことの詳細ですが、 ・[結果]ブックの「コード」(B列)にコードを入力すると、  [検索]ブックで一致するコードを検索し、  A列「氏名」、C列「内容」、D列「数値」に、[検索]シートの内容を  自動的に表示させたい。  (ただし[結果]ブックに入力した「コード」は、[検索]ブックの1~12のうち、   どのシートにあるかわからない) ・入力したコードが見つからない場合は何も表示しない。 ということです。 最初VLOOKUP、MATCH等の関数で表示することを考えましたが、 シートが複数にまたがっているのと、 列の並び方が[検索][結果]ブックで違うのでわかりませんでした。 長くなってしまい申し訳ありませんが、どうかおしえてください。 よろしくお願いします。

専門家に質問してみよう