文字列の検索
今回は文字列の検索についてご紹介します。
例えばこんな表があったとします。
「リア王」を検索して見つけてみましょう。
検索は 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)
(文:森脇孝/エントレ)