• ベストアンサー

EXCELのマクロで条件に一致したセル範囲を削除する方法

済みません、どなたか教えて下さい。 001 100 200 300 400 001 111 222 100 201 301 444 001 111 222 100 202 300 400 001 111 222 100 203 301 400 001 111 222 100 204 300 440 002 100 200 300 400 002 111 222 100 201 301 400 002 111 222 100 202 300 404 002 111 222 100 203 300 400 002 111 222 100 204 301 444 Excelで上記のような表があるとします(行列番号は省略しています)。 2列目に注目していただきたいのですが、データが111の場合のみ、右隣のセルに222という値があります。 この111と222の入ったセルのみを削除(左方向にシフト)したいのですが(この場合B2:C5とB7:C10)、 データが多い為手動では非常に時間がかかります。 そこでこれをマクロ化したいと考えているのですが、どのようにすればよいのか方法(考え方)がわかりません。 VBAは初心者ですが、かなり難しいでしょうか。 ちなみに、データのレコード数は決まっておりません。 上記の例で言う111、222の入る列番号は決まっております。 よろしければどなたかご指導下さい。宜しくお願いいたします。

  • gebe
  • お礼率83% (46/55)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 最初の質問と、#1の補足で付けた内容とは、少し違いますね。 ユーザー設定オプションを設けました。そして、最後は、目で確認してから削除してください。 なお、設定の中の「オフセット列数」というのは、検索対象列に対して、セル左ひとつなら、-1、検索対象列自体なら、0、セル右にひとつなら、1 と入れます。 '---------------------------------------------------- 'なるべく、標準モジュールに登録してください。 '--------------------------------------------------- Sub TestMatchDelete()   Dim dlRng As Range   Dim i As Long   Const OCOL As Integer = 3 '検索対象列   Const OFSTCOL As Integer = -1 'オフセット列数   Const DELCOL As Integer = 4 '削除する列数   'ユーザー設定   With ActiveSheet     For i = 1 To .Range("B65536").End(xlUp).Row       If .Cells(i, OCOL).Value = 111 Then         If dlRng Is Nothing Then           Set dlRng = .Cells(i, OCOL).Offset(, OFSTCOL).Resize(, DELCOL)         Else           Set dlRng = Union(dlRng, .Cells(i, OCOL).Offset(, _           OFSTCOL).Resize(, DELCOL))         End If       End If     Next i     If Not dlRng Is Nothing Then       dlRng.Select       If MsgBox("この範囲を削除します。よろしいですか?", vbQuestion + vbOKCancel) = vbOK Then         dlRng.Delete xlShiftToLeft       End If     Else      MsgBox "検索対象列に該当するものがありません。", 48     End If     .Range("B1").Activate   End With   Set dlRng = Nothing End Sub

gebe
質問者

お礼

ありがとうございます。 凄いです。完璧です。しかも初心者用にユーザー設定オプションを設けていただき、 更に確認メッセージまで入れていただいて…。 これで作業が大変楽になります。 私もVBAをもっと勉強しなくては…。 本当に感激です。ありがとうございました。

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

B列が111、C列が222の行をB列、C列のセルを削除し左にシフトするマクロです。 マクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はワークシート画面に戻ってALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。 Sub Macro4() Dim idx As Long For idx = 1 To Range("B65536").End(xlUp).Row   If Cells(idx, "B") = 111 And Cells(idx, "C") = 222 Then     Cells(idx, "B").Resize(1, 2).Delete Shift:=xlShiftToLeft   End If Next idx End Sub 念のため申し添えますが、セルの値が数値(右詰)ではなく文字列(左詰)ならば "111"、"222"のようにダブルコーテーションで囲む必要があります   If Cells(idx, "B") = "111" And Cells(idx, "C") = "222" Then

gebe
質問者

お礼

非常に迅速なご回答をいただいたのに、私の説明不足でご迷惑をおかけしました。 ありがとうございました。

gebe
質問者

補足

申し訳ございません!せっかくこんなに素晴らしい回答を頂いたのですが、 私の説明不足でこのままでは使用できませんでした。 もう一度サンプルを挙げさせていただきます。 001 東 001 002 AAA 003 東 111 222 BBB 北 001 002 AAA 005 東 111 333 CCC 北 001 002 AAA 004 東 111 444 DDD 北 001 002 AAA 008 西 001 002 AAA 009 西 111 666 BBB 南 001 002 AAA 006 西 111 777 DDD 南 001 002 AAA 007 西 111 888 CCC 南 001 002 AAA 上記の例で、3列目をキーにして、111という値があった場合に、該当するレコードの2列目から5列目までを 左シフトで削除したい、ということなのです。 つまり、該当レコードであってもキーになる列以外の値は必ずしも同じではないということです。 結果はこうなります。 001 東 001 002 AAA 003 北 001 002 AAA 005 北 001 002 AAA 004 北 001 002 AAA 008 西 001 002 AAA 009 南 001 002 AAA 006 南 001 002 AAA 007 南 001 002 AAA 初めからきちんとした説明をしておけば良かったのですが、本当に済みませんでした。

関連するQ&A

  • 完全一致したら複数のセル代入するマクロは?

    エクセルのSheet1のa列にある文字列と、Sheet2にあるa列にある文字列と完全一致したら、前者のセルの右隣から3番目までのセルに、後者のセルの右隣から3番目までの文字列を順に代入するマクロをお教えください。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。複数のセルに順に代入するのに苦慮しています。よろしくお願い申し上げます。

  • エクセルVBA 条件にあうときセルを塗りつぶすには?

    エクセルVBA 条件にあうときセルを塗りつぶすには? エクセルVBAについて教えてください。 _________A 列 _________B 列_________C列_________D列 -------------------------------------------- 1行| 基準値_________ 5_____________1____________8 2行| りんご____________1_____________9____________0 3行| みかん___________12___________5____________3 4行| ぶどう____________15___________7____________8 5行| バナナ____________3_____________1____________4 上図のようにデータがあります。 (実物は列行共に膨大です。また条件を4つ以上つける予定なので条件付書式は使えません) 各列の基準値に対して、セルの増減が、0以下のときに黄色に、5から8のとき大きくなるときに赤、9以上のときに青にセルの色を塗りつぶしたいです。 どのようにすればよいでしょうか? B列の場合、基準値が5です。 B2のセルの場合、基準値5と1(B2セル)の増減は-4です。 増減が0以下のときは黄色に、増減が5から8のときは赤に、増減が9以上のときに青にするので、このときは黄色に塗りつぶします。 B3のセルの場合、基準値5と12(B3セル)の増減は7です。 増減が5から8のとき赤に塗りつぶすので、このセルは赤に塗りつぶします。 B4のセルの場合、基準値5と15(B4セル)の増減は10です。 増減が9以上のとき青色に塗りつぶすので、このセルは青色に塗りつぶします。 C2のセルの場合は、C列の基準値は1(C1セル)です。 基準値1と9(C2のセル)の増減は8です。 増減が5から8のとき赤に塗りつぶすので、このセルは赤に塗りつぶします。 よろしくお願いいたします。

  • エクセルで重複セルを削除するマクロを考えています

    シート1のA列に顧客No.が並んでいます。 A列は 2 2 3 4 4 4 5 7 8 ・・・ という風に数千番台までデータがあります。 数字が飛んでいるのは永久欠番的な顧客がいるからです同一番号が複数あるのは B列以降に入力されている顧客情報に追加が あった場合です。 前半 A列とB列の間に列を挿入してB1セルに =A1     と入れます    B2以降は =IF(A2=A1,"",A2) と入れます。    この式をA列のデータがある部分まで    コピーする。    B列をコピーしてB列自体に「値」で貼り付ける。 後半 B列でフィルタをかけて空白セルを選択し    そこに属するダブリ列データを全部消す。    B列そのものを削除し    A列で昇順に並べ替えしたら完成。 というマクロを考えているのですが 後半の部分をどうやって記述したらよいかわかりません もしくはフィルタや並べ替え等で行うのは VBA向きではないのでしょうか? なにか良い方法がありましたら御教授願います。

  • エクセルで、ある条件でセルを色分けしたい

    B5~B15まで数値が入っています。 上から 98 97.7 96.8 96.2 95.7 95 93.4 92 91.6 89.8 この数値は毎回違う数値が入りますが、上から順に大きな値となっています。 色分けさせたいルールはB5に入る数値(一番大きな数値)から5を引いた数値よりも大きな数値のセルだけ色を付ける。 上記のデータの場合だと98-5=93以上の数値のセル(B5~11)に着色する。 それともう一つのルールがあり、上から2番目の数値から4を引いた数値よりも大きな数値の場合は隣のセルC列に着色する。 上記のデータの場合だと97.7-4=93.7以上の数値のセル(B5~B10)の隣のセルC列に着色する。 初心者でも分かるような内容で回答をよろしくお願いいたします。

  • 完全一致したら代入するマクロを教えてください

    エクセルのSheet1のa列にある文字列と、Sheet2にあるa列にある文字列と完全一致したら、前者のセルの右隣に後者のセルの右隣の文字列を代入するマクロをお教えください。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。よろしくお願い申し上げます。

  • エクセルVBAでセル結合

    いつもお世話になっています。 エクセル2003でVBAを使って下記をしたいのでその、VBA構文を教えて下さい。 特定の列のあるセルに文字が入っています。 (文字が入っている列は固定ですが、行番号はデータによって変わります。例えば、Aデータの場合は「J30」、Bデータの場合は、「J55」だったりします。) この文字が入っているセルをVBAで検索し、検索したセルを右隣のセルと結合します。(先ほどのAデータの場合、J30:Z30に結合します。) 更に、文字が入っているセルが2以上の複数の場合があります。(先ほどのAデータの場合、「J30」と「J40」と「J45」という感じです。文字が入っているセルの数はデータにより異なります。) 結合が終わり、このシートのデータがあるところだけに罫線を引きます。(このシートのデータというのは、前述の文字とそれ以外は、「数字」と「・」です。 ややこしいですが、よろしくお願いします。

  • セル内の時間範囲による条件分岐

    A3セルには「2009/8/26 0:00」 A4セルには「2009/8/26 0:01」 A5セルには「2009/8/26 0:02」~~と1分刻みで「2009/8/26 23:59」まで、1日分のあります B1セルに開始時間「2009/8/26 7:30」 B2セルに終了時間「2009/8/26 8:45」 というように行1と行2に日時を書きます。これは人が手動で入力します この場合、「2009/8/26 7:30」から 「2009/8/26 8:45」まで B列のセルに●を埋めたいのですが、関数かVBAを使ってうまくできないでしょうか タイムチャートを描きたいのです

  • excelで条件に一致するデータ全てを抽出する方法

    現在、エクセル2003を使用しています。 A列・B列・C列にデータが入力されています。 ただし、空白セル(空白行)もあります。 A列に“@Name”とデータ入力がある場合 同じ行のC列の値を抽出したいと思います。 A列に@Nameは複数ありますが、C列の値は それぞれ違いますので、データの集計先はF列に 全て抽出をしたい。 なにか良い方法(VBAや関数)がありましたら 教えてください。

  • マクロ 2つのブック 条件一致 転記

    2つのエクセルブックがあります。 1つがIDデータ表になって、IDと払い出し内容と日付の3つがあります。 もう1つがID管理票で、IDを担当ごとに管理している票です。 IDデータ表のIDとID管理票のIDを一致したら IDデータ表の払い出し区分の単語を基準に(新規・変更・廃止) ID管理票.xlsに乗っているIDの横に 払い出し区分の単語の条件で 新規の場合,ID右隣に日付を転記 変更の場合,IDの2つ右隣に日付を転記 廃止の場合,IDの3つ右隣に日付を転記を行いたいのですが FINDメソッドを使い、行のB列の区分で判定して、日付を書き入れるのと Offセットでセルの位置を指定するのと「IDデータ表」.xlsの特定の範囲のデータを繰り返す というアドバイスをもらいましたが 繰り返し処理(ForやLoop)をよく理解していないからだと思います。 どなたかご教示くださいますでしょうか。 下記に簡素でありますが構成状態と 処理の概要と画像添付させて頂きます IDデータ表.xls    A列         B列       C列 1  ID番号     払い出し区分   日付 2  110001241      新規      10/2 3  120000065      変更      10/3 4  190000036      廃止      10/4     ↓ 以下100行くらい続いています ID管理票.xls ID番号の場所がバラバラで AO列にあったりBC列にあったりしています。 また、ID管理票にすでに日付が入っていることもありますが それはそのまま上書きで問題ありません。 110001241, 10/2       (新規区分なのでIDの右隣に日付を転記) 120000065, 空白 10/3     (変更区分なのでIDの右2つ目に日付を転記) 190000036, 空白,空白,10/4   (廃止区分なのでIDの右3つ目に日付を転記) お手数ですがよろしくお願いいたします

  • 複合条件に一致するセルのカウント方法

    A列から"山田"かつB:D列から"101"を含むセルの個数をカウントしたい場合どうすればよいでしょうか? A列の"山田"とB:D列の"101"は複数レコードある事を想定してください。

専門家に質問してみよう