エクセルで不要な行を1クリック削除!キーワードが含まれるテキストの行を自動で削除するVBAとは

 

大量のエクセルデータから、特定のキーワードが含まれる行を手作業で探して削除していませんか?

「目視で1行ずつ確認して削除する」「フィルターで絞り込んでから手動で消す」—— こういった作業を毎回繰り返しているとしたら、かなりの時間をロスしています。

 

VBAを使えば、削除したいキーワードを別シートの一覧表に登録しボタンを1クリックするだけで対象の行をまとめて削除することが可能です

 

この記事では、私が実際にお客様から依頼を受けて開発した「キーワード一致行削除マクロ」を元に、Find関数を使ったVBAの仕組みと実装方法をわかりやすく紹介。

削除キーワードを誰でも追加・変更できる仕様なので、プログラミングの知識がない方でも簡単に運用できる内容になっているので是非チェックしてみてください。

 

広告

手作業でキーワード検索・削除していることの問題

エクセル上の大量データから、不要な行を手作業で削除する作業は、見た目よりもずっと時間がかかります。

「削除するキーワードが複数ある」「データが何百行もある」という条件が重なると、作業が複雑化することも。。。

 

手作業で処理し続けることで発生する3つの問題をご紹介します。

 

問題①:検索・削除に時間がかかりすぎる

Ctrl+Fで1つずつキーワードを検索して削除するという作業は、キーワードの数が多くなるほど時間が膨らみます。

たとえば削除キーワードが10種類あれば、10回分の検索・削除操作が必要になる。

 

私がマクロ開発依頼を受けた案件では、品名リストの中から削除したいキーワードが数十種類もあり、毎月この作業に1時間近く費やしているという状況でした。

データが増えるほど、手作業の時間は比例して増えていきます。

 

問題②:削除漏れ・誤削除のリスクが高い

目視で検索・削除を繰り返すと、どうしても確認ミスが発生します。

「同じキーワードが2か所あったのに1か所しか削除していなかった」「似たような文字列を誤削除してしまった」というミスは、手作業では完全に防ぐことができません。

とくにカタカナの全角・半角が混在しているデータでは、視覚的に区別がつきにくく、ミスの頻度が上がります。

 

VBAを使えば検索条件を正確に指定でき確認ミスを0にすることが可能です。

 

問題③:キーワードが増えるたびに手順が増える

手作業のもう1つの問題は、削除キーワードが増えるたびに作業量が比例して増えることです。

今月から新しい削除キーワードが5件追加されたとすれば、単純に手作業の時間が5件分増えます。

 

VBAなら、キーワードを別シートの一覧表に追記するだけで対応可能です。

 

キーワード一致行削除VBAの全体設計

VBAで「キーワードが含まれる行を削除する」仕組みを作る前に、全体の設計を理解しておくとコードの意味がわかりやすくなります。

 

今回の仕組みは大きく3つ。

「削除キーワードを管理する別シート」「キーワードが含まれる行を探すFind関数の処理」「対象行を削除する処理」

です。

 

この設計にすることで、キーワードの追加・削除をコードに触れずに行えるため、プログラミングが苦手な方でも安心して運用できます。

 

削除キーワードを別シートで管理する設計にする理由

キーワードをVBAコードの中に直接書き込む方法もありますが、この方法では追加・変更のたびにコードを編集しなければなりません。

コードを直接編集するのは、VBAに詳しくない方には難しく、ミスのリスクもあります。

 

そのため今回は、「キーワードリスト」シートのA列にキーワードを一覧で登録しておき、VBAがその一覧を読み込んで処理する設計にしました。

キーワードを増やしたい場合は「キーワードリスト」シートのA列に追記するだけでOKです。

 

コードを一切触らずに運用できる点が、実務では非常に重要になります。

今回は以下の様式にマクロを設定。

設定シートのテンプレート

 

「キーワードリスト」シートのA列に、削除対象にしたいキーワードを縦に並べておくだけで準備完了です。

 

Instr関数を使ってテキスト内のキーワードを検索する

VBAでテキストの中に特定のキーワードが含まれているかを判定する方法はいくつかありますが、今回はInStr関数を使う方法を採用しました。

 

InStr関数は、文字列の中に指定した文字が含まれているかを検索し、含まれていれば位置(何文字目か)を、含まれていなければ0を返す関数です。

「0より大きい値が返ってきた場合 = キーワードが含まれている」という判定ができるため、行の削除条件として使いやすい関数です。

 

キーワード一致行削除VBAのサンプルコードと解説

ここからは実際のVBAコードを紹介します。

 

今回のサンプルは、データシートのB列(品名)に対して、キーワードリストシートのA列に登録したキーワードが含まれる行を削除するという内容です。

品名「ディーゼルDL-1 5W30(20L)」のように、品名の中に「ディーゼル」というキーワードが含まれていれば、その行ごと削除する

という内容です。

 

基本的なキーワード一致行削除するサンプルコード

Sub キーワード一致行削除()

Dim ws_data As Worksheet 'データシート
Dim ws_key As Worksheet 'キーワード設定シート
Dim lastRow_data As Long 'データの最終行
Dim lastRow_key As Long 'キーワードの最終行
Dim i As Long 'データ行ループ用
Dim j As Long 'キーワード行ループ用
Dim keyword As String '削除キーワード
Dim cellValue As String 'セルの値

'処理対象シートを指定
Set ws_data = ThisWorkbook.Worksheets("データ")
Set ws_key = ThisWorkbook.Worksheets("キーワードリスト")

'データの最終行とキーワードの最終行を取得
lastRow_data = ws_data.Cells(Rows.Count, 2).End(xlUp).Row
lastRow_key = ws_key.Cells(Rows.Count, 1).End(xlUp).Row

'行削除は下から処理するのが鉄則
For i = lastRow_data To 2 Step -1

cellValue = ws_data.Cells(i, 2).Value 'B列の品名を取得

'設定シートのキーワードを1つずつ確認
For j = 2 To lastRow_key

keyword = ws_key.Cells(j, 1).Value 'キーワードを取得

'InStr関数でキーワードが含まれているか判定
If InStr(cellValue, keyword) > 0 Then
ws_data.Rows(i).Delete '行を削除
Exit For 'キーワードが1つ見つかれば次の行へ
End If

Next j

Next i

MsgBox "キーワードが含まれる行の削除が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

最初の Set ws_data と Set ws_key で、処理対象のシートをそれぞれ「品名リスト」シートと「設定」シートに指定しています。

シート名を変数に格納しておくことで、コードの中に何度もシート名を書かずに済むため、修正が必要になったときに1か所を直すだけで対応可能。

 

lastRow_data = ws_data.Cells(Rows.Count, 2).End(xlUp).Row は、B列の最終行を自動取得するコードです。

データが増減しても自動的に最終行を拾ってくれるため、範囲を固定する必要がありません。

 

行削除の処理は For i = lastRow_data To 2 Step -1 のように、下の行から上に向かってループさせているのがポインです。

上から順番に削除すると、行が詰まって行番号がずれてしまい、削除漏れが発生するので注意してください。

 

InStr(cellValue, keyword) > 0 の部分が、キーワードの検索判定です。

InStr関数は、第1引数に調べたい文字列、第2引数に探したいキーワードを指定します。

キーワードが含まれていれば1以上の数値を返すため、> 0 という条件が成立した行を削除対象と判定しています。

 

Exit For は、1つのキーワードが見つかった時点で内側のループを抜ける処理です。

キーワードが複数ある場合でも、1つ見つかれば削除は確定なので、残りのキーワードを確認し続ける必要はありません。

 

この Exit For を入れることで、処理のムダをなくし、実行速度を上げることができます。

 

大量データを高速処理するためのVBAの改良

先ほどのコードでも正しく動作しますが、データ量が数千行を超えてくると処理が遅くなる場合があります。

より高速に処理するためのテクニックを2つ紹介します。

 

画面の更新を止めて処理を高速化する

Sub キーワード一致行削除_高速版()

Dim ws_data As Worksheet
Dim ws_key As Worksheet
Dim lastRow_data As Long
Dim lastRow_key As Long
Dim i As Long
Dim j As Long
Dim keyword As String
Dim cellValue As String

'画面更新を停止(処理の高速化)
Application.ScreenUpdating = False

Set ws_data = ThisWorkbook.Worksheets("品名リスト")
Set ws_key = ThisWorkbook.Worksheets("設定")

lastRow_data = ws_data.Cells(Rows.Count, 2).End(xlUp).Row
lastRow_key = ws_key.Cells(Rows.Count, 1).End(xlUp).Row

For i = lastRow_data To 2 Step -1

cellValue = ws_data.Cells(i, 2).Value

For j = 2 To lastRow_key

keyword = ws_key.Cells(j, 1).Value

If InStr(cellValue, keyword) > 0 Then
ws_data.Rows(i).Delete
Exit For
End If

Next j

Next i

'画面更新を再開
Application.ScreenUpdating = True

MsgBox "削除が完了しました。", vbInformation

End Sub

Application.ScreenUpdating = False は、処理中の画面更新を止める命令です。

VBAが実行されている間、エクセルは1行削除するたびに画面を更新しようとします。

この更新処理が実は非常に時間を消費しているため、処理の冒頭でFalseにして停止させておき、処理が終わったらTrueに戻すのが高速化の基本テクニックです。

 

データが数百行程度であれば速度の差は小さいですが、数千行になると体感できるほど違いが出てくるので注意しましょう。

 

大文字・小文字を区別しない検索に対応させる

実務では、「ディーゼル」と「ディーゼル」のように全角・半角が混在しているケースが珍しくありません。

標準の InStr関数 は全角と半角を別の文字として扱うため、どちらか片方しか検索できないがStrConv関数 を使って文字を統一してから比較すると、この問題を解決できます。

'全角・半角を統一してから比較する方法
If InStr(StrConv(cellValue, vbNarrow), StrConv(keyword, vbNarrow)) > 0 Then
ws_data.Rows(i).Delete
Exit For
End If

 

StrConv(文字列, vbNarrow) は、全角文字を半角文字に変換する関数です。

セルの値もキーワードも半角に統一してから比較することで、「ディーゼル」と「ディーゼル」を同じものとして扱えるようになります。

 

全角・半角が混在しているデータを扱う場合は、事前にこの処理を加えておきましょう。

 

VBAをボタンに登録してワンクリックで実行する方法

VBAコードを書いたら、エクセルシート上にボタンを配置してワンクリックで実行できるようにしましょう。

ボタンを設置しておけば、VBAの操作に慣れていない方でも迷わず使えるようになります。

設定手順は次のとおりです。

 

まず「開発」タブを開き、「挿入」から「ボタン(フォームコントロール)」を選択。

シート上でドラッグするとボタンが作成され、「マクロの登録」ダイアログが表示されます。

ボタン作成方法

 

登録したいマクロ名(例:キーワード一致行削除)を選んで「OK」をクリックすれば設定完了です。

ボタン上で右クリックして「テキストの編集」を選ぶと、「▶ 不要行を削除する」のようにボタンに説明文を入れることもできます。

 

一度設定してしまえば、次回からはボタンを押すだけでマクロが使用できるので担当者が変わっても迷わず使用することが可能です。

 

VBAを使う際の注意点と実務での活用ポイント

キーワード一致行削除VBAを実務で運用するうえで、あらかじめ知っておきたい注意点を紹介します。

 

削除前にデータのバックアップを取る

行削除のVBAは、一度実行すると元に戻すことができません。(Ctrl+Zによるアンドゥが効かない場合がある)

 

誤ったキーワードが設定シートに入っていた場合、必要なデータを削除してしまうリスクがあるので注意しましょう。

 

マクロの実行前に必ずバックアップを取るか、削除前に確認メッセージを表示するコードを追加しておくことをおすすめします。

確認メッセージを入れる場合は、処理の冒頭に次の1行を追加するだけです。

If MsgBox("キーワードが含まれる行を削除します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub

 

設定シートのキーワードは正確に入力する

InStr関数による検索は、設定シートに入力されたキーワードと完全一致した文字列を探します。

「ディーゼル」と入力するつもりが「ディーゼル」と入力してしまった場合、半角カタカナのデータには反応しない。

 

設定シートに入力するキーワードは、実際のデータと同じ文字種(全角・半角、大文字・小文字)で入力するルールを徹底するか、前述した StrConv関数 による文字統一処理を組み込んでおきましょう。

 

削除対象列を正しく指定する

今回のサンプルコードはB列(品名)を検索対象にしていますが、実際の業務に合わせてどの列を検索するかを変更する必要があります。

 

cellValue = ws_data.Cells(i, 2).Value の 2 という数字がB列を指しています。

C列を対象にしたい場合は 3 に、D列なら 4 に変更してください。

 

まとめ ~ キーワード一致行削除こそVBAで自動化すべき作業 ~

エクセルの品名リストや管理表から、指定したキーワードを含む行を手作業で削除する作業は、ミスが起きやすく、データが増えるほど時間がかかる代表的なルーティーン作業です。

VBAを使えば、削除キーワードを別シートに登録しておくだけで、ボタン1クリックで一括削除が完了します。

キーワードの追加・削除もコードを触らず設定シートで管理できるため、プログラミングの知識がなくても安心です。

 

今回紹介したポイントをまとめると、「下から処理することで削除漏れを防ぐ」「InStr関数でキーワード検索を正確に行う」「StrConv関数で全角・半角を統一する」「ScreenUpdatingで処理を高速化する」の4点が実務での活用に欠かせないテクニックなので、しっかり抑えておきましょう。

 

実際にマクロを動かしてみたい!と言う方は、関連記事「目視でキーワード検索してませんか?VBAで指定ワードを含む行を一括削除する方法」を参考にしてください。

キーワードが一致する行を削除するマクロが設定されたエクセルファイルをダウンロードすることができます。

 

もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。

 

最後まで読んでいただきありがとうございました。エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。