サイトアイコン エントレ|演劇動画ニュース

エクセルマクロ(EXCEL VBA) その19 文字列の検索(Find)

エクセルマクロ(EXCEL VBA)

文字列の検索

今回は文字列の検索についてご紹介します。
例えばこんな表があったとします。

「リア王」を検索して見つけてみましょう。
検索は Find というのを使います。

Cells.Find("リア王").Select

と打ち込んでください。

ここで、赤線の部分は「検索対象の範囲」で、Cells は このシート全体を検索対象にしています。
青線の部分は文字列を探すメインの部分。そして緑線の部分は、見つかったセルを選択するということです。

これを実行すると、

Selectの部分を、Copyに変えることもできます。

これを実行すると、

お察しの通り、コピーすることができます。

 
さらに変形して、

lear = Cells.Find("リア王").Row

とすると、変数learの中に、検索結果のセルの行番号を入れることができます。
これを実行しても何も変化がないので、B4に入れてみましょう。

lear = Cells.Find("リア王").Row
Cells(4, 2) = lear

これを実行すると、

結果は 4 となって、正しく「リア王」の行番号を取得できていました。
行番号がわかったということは、その検索結果の行に対して操作ができるということです。

例えば、「リア王」がある行だけ削除したいと思ったら、

lear = Cells.Find("リア王").Row
Rows(lear).Delete

と書けば、消すことができそうです。
実行すると、

リア王のある行を削除できました。
.Rowのところを、.Column にすれば列番号が取得できるので、列を消すのにも使えそうですね。

 
Findの注意点

Find はとても便利なのですが、注意すべき点があります。

注意点1
まず、表の中に検索対象が2つ以上あると、最初の方が検索に引っかかることになります。

リストがもしこうなっていて、

検索結果をコピーするマクロを書いて、実行すると

このように、上にある方が検索結果として選ばれます。

もし、こうだったら、

どこが選ばれるんでしょうか?
実行してみると、

どうやら、まず1行目をA列から順番に右へ検索していって、
その次に2行目を検索しているようですね。

 
注意点2

検索結果が無い場合、エラーになります。

しょうがないので、Ifを使って「もし、検索結果が無かったときは、メッセージボックスを出す」ということにしましょう。
検索結果が無かったらというのは、このように書きます。

If Cells.Find("十二夜") Is Nothing Then
    MsgBox ("十二夜はありません")
Else
    Cells.Find("十二夜").Copy
End If

これを実行すると、

メッセージボックスを出すことができました。

 
今回の最終的なコード

Sub juniya_copy()
If Cells.Find("十二夜") Is Nothing Then
    MsgBox ("十二夜はありません")
Else
    Cells.Find("十二夜").Copy
End If
End Sub

 

宿題-19
先程の表を別シートにコピーし、「ハムレット」と「真夏の夜の夢」を削除した表を作ってください。

▼ クリックで解説を表示

解説

まずは、シートをコピーして「削除済み」という名前を付けておきましょう。

続いて、ハムレットを検索し、検索結果の行番号を取得します。

ham = Cells.Find("ハムレット").Row

この行番号 ham を元に、行を削除します。

ham = Cells.Find("ハムレット").Row
Rows(ham).Delete

これで、「ハムレット」の行が消せました。
同様に「真夏の夜の夢」も検索して、行番号 night を取得して、行を削除します。

night = Cells.Find("真夏の夜の夢").Row
Rows(night).Delete

これで、「ハムレット」と「真夏の夜の夢」を消すことができました。

最終的なコードはこちらです。

Sub find_delete()
'シートをコピーして名前を付ける
ActiveSheet.Copy after:=ActiveSheet
ActiveSheet.Name = "削除済み"

'ハムレットを検索して、検索結果の行番号を取得
ham = Cells.Find("ハムレット").Row
'取得した行番号を元に、その行を削除
Rows(ham).Delete

night = Cells.Find("真夏の夜の夢").Row
Rows(night).Delete

End Sub

答えファイルのダウンロード

エクセルマクロ(EXCEL VBA) その20 検索結果の隣のセルを選択(FindとOffset)

(文:森脇孝/エントレ)

モバイルバージョンを終了