エクセルマクロVBAで、特定の文字列を含む行を削除するプログラムを紹介します。
特定の文字列が複数でも対応できるプログラムをお伝えします。
このページでは、こちらのヤフー知恵袋の内容を参考に画像を使いながらプログラムを解説していきます。
目次
エクセルマクロVBAで複数の特定文字列を含む行を削除
ここでは、以下のデータ一覧を事例にして複数の特定文字列を含む行を自動削除するVBAプログラムを紹介します。
このプログラムを実行すると、以下のように特定文字列(キーワード)を含む行のみを削除します。
それでは以下でVBAプログラムを紹介していきます。
VBAプログラムの解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub DeleteRowsWithStrings() 'プログラム2|キーワードを入力 Dim keywords As String keywords = InputBox("削除したい文字列を記入。複数ある場合は、「,」で区分けすること") 'プログラム3|キーワードがない場合、プログラムを終了 If keywords = "" Then: Exit Sub 'プログラム4|シートコピー Dim ws As Worksheet ActiveSheet.Copy after:=ActiveSheet Set ws = ActiveSheet 'プログラム5|変数設定 Dim myrange As Range Dim keyword As Variant 'プログラム6|キーワードを一つずつ処理 For Each keyword In Split(keywords, ",") 'プログラム7|対象シートでキーワードが一つでも含まれている行を削除 Do Set myrange = ws.Cells.Find(keyword, Lookat:=xlPart) If myrange Is Nothing Then: Exit Do Rows(myrange.Row).Delete Loop Next 'プログラム8|プログラム終了 End Sub |
以下で詳しく説明します。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
プログラム1|プログラム開始
1 |
Sub DeleteRowsWithStrings() |
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
プロシージャに関連するmoduleの話については以下で説明しています。
プログラム2|キーワードを入力
1 2 |
Dim keywords As String keywords = InputBox("削除したい文字列を記入。複数ある場合は、「,」で区分けすること") |
変数keywordsを文字数型で設定します。
変数については、以下のページで紹介しています。
入力用のメッセージボックスに文字列を入力
2 |
keywords = InputBox("削除したい文字列を記入。複数ある場合は、「,」で区分けすること") |
「InputBox()」で入力用のメッセージボックスを表示させます。
ここに削除したい文言を入力します。
削除対象の文言が複数ある場合は、以下のように「,」でつなぎます。
これで「愛知」と「商品売却」の文字列を取得し、これらのうち一方の文字列を含んでいる行を削除していきます。
プログラム3|キーワードがない場合、プログラムを終了
1 |
If keywords = "" Then: Exit Sub |
プログラム2の入力値がない場合、「Exit Sub」でプログラムを途中終了させます。
プログラム4|シートコピー
1 2 3 |
Dim ws As Worksheet ActiveSheet.Copy after:=ActiveSheet Set ws = ActiveSheet |
ここではシートをコピーします。
マクロを実行すると元に戻せません。
そのためシートコピーすることで、オリジナルのデータをそのまま残しておきます。
プログラム5|変数設定
1 2 |
Dim myrange As Range Dim keyword As Variant |
変数を設定します。
変数については、以下のページで紹介しています。
プログラム6|キーワードを一つずつ処理
1 2 3 4 5 6 7 8 9 |
For Each keyword In Split(keywords, ",") 'プログラム7|対象シートでキーワードが一つでも含まれている行を削除 'Do 'Set myrange = ws.Cells.Find(keyword, Lookat:=xlPart) 'If myrange Is Nothing Then: Exit Do 'Rows(myrange.Row).Delete 'Loop Next |
プログラム2で入力したkeywordsを「,」で区切って、繰り返し処理を行います。
ここでは「keywords=愛知,商品売却」なので、Debug.Printで検証すると以下のようになります。
Debug.Printでの検証結果
1 2 3 4 5 6 |
For Each keyword In Split(keywords, ",") Debug.Print keyword Next >>>愛知 >>>商品売却 |
このようにプログラム2で入力したkeywordsを「,」で区切って、繰り返し処理を行うことができます。
なお「aaa,bbb,ccc」のように3つの文字列はもちろん、「,」でつなげば大量の文字列を対象にできます。
プログラム7|キーワードが一つでも含まれている行を削除
1 2 3 4 5 |
Do Set myrange = ws.Cells.Find(keyword, Lookat:=xlPart) If myrange Is Nothing Then: Exit Do Rows(myrange.Row).Delete Loop |
プログラム2で入力したキーワードが一つでも含まれている行をFindで見つけて削除していきます。
Do Loopで繰り返し処理とすることで、一つ目の対象行を削除すると、別の行があるかどうかをFindでセルをチェックします。
キーワードが含まれるセルが存在しなくなるまで、Do Loopを実行します。
以下で詳しく説明します。
ws.Cells.Find()でキーワードを含むセルを取得
Findを使うと、特定の文言を含むセルを取得することができます。
→シート内のセルの中(ws.Cells)で、検索文言(keyword)が部分一致(Lookat:=xlPart)しているセルを取得
これでkeyword(愛知or商品売却)の文字列が部分一致するセルを取得できます。
この事例では、上記の画像の赤い矢印を付けたセルを取得します。
Findで取得したセルを変数myrangeとします。
myrangeがNothing(存在しない)ならDoLoopを抜ける
→myrangeが存在しない場合、Do Loopの処理を抜ける
削除対象となるセル(myrange)が存在しない場合、Exit DoでDo Loopの処理を抜けるようにします。
つまりmyrangeが存在し続ける限り、行削除を行っていきます。
キーワードを含む行を削除
→削除対象となるセル(myrange)の行を削除
「myrange.Row」で、削除対象となるキーワードを含むセルの行番号を取得できます。
「Rows(myrange.Row).Delete」とすることで、対象行を削除できます。
行を削除したら、Do Loopで次のセルをFindで見つけます。
対象となる行が見つからなくなると、「If myrange Is Nothing Then: Exit Do」でDo Loopの処理から抜けます。
この事例では、プログラム7を実行後に以下のように、キーワードが部分一致するセルを含む行が全て削除されます。
プログラム8|プログラム終了
1 |
End Sub |
プログラム1と対になるプログラムで、プログラム終了させるための記述です。
「End Sub」を読み込むと、プログラムが終了します。
プログラムの解説はここまでです。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
少しずつレベルアップしながら、難しい内容に挑戦していくと効率的に学ぶことができます。
上記のリンクでは、VBA勉強に役立つ内容を紹介しています。
興味がある人はご覧ください。