- ベストアンサー
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の入る列番号は決まっております。 よろしければどなたかご指導下さい。宜しくお願いいたします。
- みんなの回答 (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
その他の回答 (1)
- zap35
- ベストアンサー率44% (1383/3079)
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
お礼
非常に迅速なご回答をいただいたのに、私の説明不足でご迷惑をおかけしました。 ありがとうございました。
補足
申し訳ございません!せっかくこんなに素晴らしい回答を頂いたのですが、 私の説明不足でこのままでは使用できませんでした。 もう一度サンプルを挙げさせていただきます。 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 初めからきちんとした説明をしておけば良かったのですが、本当に済みませんでした。
お礼
ありがとうございます。 凄いです。完璧です。しかも初心者用にユーザー設定オプションを設けていただき、 更に確認メッセージまで入れていただいて…。 これで作業が大変楽になります。 私もVBAをもっと勉強しなくては…。 本当に感激です。ありがとうございました。