VBAで「検索」を実装しようとした場合結構大変な作業になりますが、Excelの「検索」機能を使えば簡単に実装できます。
Excelの「検索」機能はFindメソッドでアクセスできます。FindメソッドをVBAで扱うと結構癖が強いですが、全部パターン化させてしまいましょう。
VBAでFindを実装する
VBAのFindは、オブジェクトの知識とDo Loop、Do Whileの知識を組み合わせて実装するのが一番簡潔なので今回はそれを紹介します。
核の部分は変わらず、条件判断の記述などでいくつかパターンがあるので、今回紹介した方法以外でも試してみてください。
1.Findメソッドとは
Findメソッドは多数の引数を持っていますが、重要な引数はRange.Find(What, [After])だけです。見つかったセルをRange型として返し、見つからない場合はNothingを返します。
What は文字列型で検索対象の文字列を指定します。
After はRange型で指定されたセルより、後ろ側のセルを検索します。
ひとまずVBAでサンプルを作ってみましょう。
2.サンプルを作ろう
サンプルデータを入力しました。
Sub sumple1()
Dim FirstCell As Range
Dim TargetCell As Range
Set TargetCell = Cells.Find(“Hello”)
Set FirstCell = TargetCell
Do
If TargetCell Is Nothing Then
Exit Do
Else
TargetCell.Activate
Set TargetCell = Cells.Find(“Hello”, TargetCell)
MsgBox “次のセルに移ります”
End If
Loop While Not (FirstCell.Address = TargetCell.Address)
End Sub
Set FirstCell = TargetCell
Do
If TargetCell Is Nothing Then
Exit Do
Else
TargetCell.Activate
Set TargetCell = Cells.Find(“Hello”, TargetCell)
End If
Loop While Not (FirstCell.Address = TargetCell.Address)
End Sub
まずセル全体から”Hello”を検索し、最初に見つかったセルを代入します。その後TargetCellより後で見つかったセルでTargetCellを上書きしています。
Msgboxは動きを見やすくするために入れました。コメントアウトすると一瞬で終わってしまいます。
Findは一番最後のセルを検索した後、ループして一番最初のセルを返すようになります。While処理をないと無限ループに陥りますので注意してください。
実行した画像がこちらになります。
3.応用してみよう
先程の例は順番に選択するだけでしたが、次はセルのアドレスを全部つなげて出力してみたいと思います。
VBAのコードは以下になります。
Sub sumple2()
Dim FirstCell As Range
Dim TargetCell As Range
Dim Result As String
Set TargetCell = Cells.Find(“Hello”)
Set FirstCell = TargetCell
Do
If TargetCell Is Nothing Then
Exit Do
Else
Result = Result & vbNewLine & TargetCell.Address(False, False)
Set TargetCell = Cells.Find(“Hello”, TargetCell)
End If
Loop While Not (FirstCell.Address = TargetCell.Address)
If TargetCell Is Nothing Then
MsgBox “見つかりませんでした”
Else
MsgBox Result
End If
End Sub
Set FirstCell = TargetCell
Do
If TargetCell Is Nothing Then
Exit Do
Else
Result = Result & vbNewLine & TargetCell.Address(False, False)
Set TargetCell = Cells.Find(“Hello”, TargetCell)
End If
Loop While Not (FirstCell.Address = TargetCell.Address)
MsgBox “見つかりませんでした”
Else
MsgBox Result
End If
End Sub
実行した画像がこちらになります。
本来ならResultの行頭の改行コードを除去すべきですが、サンプルということでご容赦ください。
今回はFindメソッドを解説しました。癖の強いメソッドですが自前で実装するより、速度面でもメンテナンス性でもとても頼りになるメソッドです。
今回のサンプルコードで検索して見つかったセル、一つ一つについて処理できるようになりました。応用の幅はとても広いですので是非チャレンジしてみてください。