エクセルマクロ(EXCEL VBA)

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

文字列の検索

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

作品リスト

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

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

と打ち込んでください。

Findの書き方

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

これを実行すると、

リア王が選択された

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

コピーに変える

これを実行すると、

リア王がコピーされた

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

 
さらに変形して、

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

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

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

行番号をB4に入れる

これを実行すると、

行番号が取得できていた

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

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

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

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

リア王のある行を削除できた

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

 
Findの注意点

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

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

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

リア王が2つある

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

上にある方が選ばれる

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

もし、こうだったら、

リア王が5つ

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

D1が選ばれた

どうやら、まず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
先程の表を別シートにコピーし、「ハムレット」と「真夏の夜の夢」を削除した表を作ってください。

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

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

関連記事一覧