マクロを書く際に”Find”を単体で利用することは少ないですが、「○○に当てはまるセルがあれば処理を行う」などのように、指示の一部として使い勝手が良いのが”Find”の特徴です。If分との組合せでよく用いられるので、基本を理解しておくことで応用の幅が広がります。
▼ 本記事でわかる事
- 特定の範囲内からある値を含むセルを探したい
↳ セル範囲や列を指定したFindの使い方を解説 - 条件に当てはまるセルをまとめて操作したい
↳「AまたはB」「AかつB」など、複数条件を設定したセルを指定する方法も解説
こんな時に便利なのがFindメソッドです。
(*’ω’*)σ 今回は色々なマクロの書き方を「イチゴ🍓」で楽しく解説していきます。
Findメソッドの基本構造
「Find」は、特定の範囲内から条件に当てはまるセルを検索する時に使います。
- 基本の形
オブジェクト.Find(What,引数2,引数3・・・) - オブジェクト
=検索対象となるセル範囲(Rangeオブジェクト) - 引数1はWhatを使う(省略不可)
引数2以降は必要に応じて使用する
使用例 表の中から「さがほのか」を検索し、フォントを赤くする。
▼
Sub さがほのか検索()
Dim 該当セル As Range ‘Range型の変数を宣言
Set 該当セル = Range(“A3:E13″).Find(What:=”さがほのか”, LookAt:=xlWhole)
‘セルA3~セルE13の範囲を対象に”さがほのか”と完全一致するデータを探す
‘見つかったら変数(該当セル)に格納
If Not 該当セル Is Nothing Then ‘もし該当セルがあれば
該当セル.Font.ColorIndex = 3 ‘フォントの色を3(赤)にする
Else ‘無ければ
MsgBox “さがほのかが見つかりません”
‘メッセージボックスに”さがほのかが見つかりません”と表示
End If
End Sub
▼ マクロを実行した結果
Findメソッドの引数一覧
どのように検索したいかは引数を使って指定します。
引数 | 用途 | 設定値 | 内容 |
---|---|---|---|
What | 検索するデータ(文字列など)を指定 | 任意のデータ | ※省略不可 |
After | 検索開始のセルを指定 指定した次のセルから検索が開始される 省略すると検索範囲の左上から検索 | 任意のセル | |
Lookin | 検索対象を指定 | xlFormulas | 数式 |
〃 | 〃 | xlValues | 値 |
〃 | 〃 | xlComments | コメント |
LookAt | 検索条件を指定 | xlWhole | 完全一致 |
〃 | 〃 | xlPart | 部分一致 |
SearchOrder | 検索の方向を指定 | xlByRows | 行方向 (1行ごと) |
〃 | 〃 | xlByColumuns | 列方向 (1列ごと) |
SearchDirection | 検索の向きを指定 | xlNext | 次の値を検索 (手前から先へ) |
〃 | 〃 | xlPrevious | 前の値を検索 (先から手前へ) |
MatchCase | 大文字と小文字を区別して検索するか? | True,False | 区別する→True 区別しない→False |
MatchByte | 全角と半角を区別して検索するか? | True,False | 区別する→True 区別しない→False |
SearchFormat | 検索するセルの書式を指定するか? | True,False | 区別する→True 区別しない→False |
Findメソッドの注意点
1. 引数を省略すると、Excelファイル固有の検索設定が適用されてしまう
検索設定は、ホームタブ→検索と置換→検索→オプションで確認できます。思ったような検索ができない場合、引数を使って検索方法を指定する必要があります。
Findメソッドを使用するたびに、引数 LookIn、LookAt、SearchOrder、MatchByte の設定は保存されます。ここの基本設定と違う方法で検索したい場合は、引数を使って指定する必要があります。
2.引数Afterで指定した検索開始位置に条件に当てはまるセルがあっても検索されない
これは引数の説明通り、検索開始位置の次のセルから検索されるからです。引数Afterを省略した場合も同様で、一番左上に条件に当てはまるセルがあっても検索されません。
3.Findメソッドは検索結果が無かった時にエラーが出る
エラーにならないために検索結果が無かった時の処理を組み込んでおくことが必要です。
FindNextメソッドの基本構造
オブジェクト.FindNext(After)
FindとFindNextの違い
Findメソッドは検索範囲で最初に見つけた1つのセルを返します。FindNextメソッドは、Findメソッドで見つけたセルの次から検索し、指定範囲をすべて検索し終えたら最初に戻ります。実務的には広範囲に繰り返し検索をかける”FindNext”を用いる機会が多いと思われます。
FindNextで特定の文字列を検索
表の単価の列から「700」を検索してみます。通常は検索範囲ならmyRangeなどの表記にする方が多いとは思いますが、分かりやすいように日本語多めでいきます笑。
使用例 単価700円のイチゴを検索
Sub 単価700円を検索()
Dim 検索範囲 As Range
Dim 初回検索結果 As Range
Dim keyWord As String
Set 検索範囲 = Range(“C4:C13”) ‘検索範囲はC4セルからC13セル
keyWord = “700” ‘キーワードは700
Set 初回検索結果 = 検索範囲.Find(keyWord, LookAt:=xlWhole)
‘初回検索結果は検索範囲内でキーワード(700)と完全一致する1つ目のセル
If 初回検索結果 Is Nothing Then ‘もし初回検索結果が無ければ
MsgBox keyWord & “はありません”
‘メッセージボックスにキーワード(700)はありませんと表示
Exit Sub ‘プロシージャを抜ける(これで終わり)
End If
Dim msg As String
Dim 次の検索結果 As Range
Set 次の検索結果 = 初回検索結果
Do
msg = msg & keyWord & “は” & 次の検索結果.Row & “行目にあります” & vbCrLf
‘キーワードが見つかった行をメッセージにする
Set 次の検索結果 = 検索範囲.FindNext(次の検索結果)
‘FindNextで検索を継続
Loop Until 次の検索結果.Row = 初回検索結果.Row
‘検索結果が初回検索結果と同じになるまで(最初に戻るまで)処理を繰り返し
‘この記載が無いと無限ループになるので注意が必要です
MsgBox msg ‘メッセージボックスにキーワードが見つかった行を表示
End Sub
▼ マクロを実行した結果
スタート位置のC4セルに700がありますが、検索されるのはスタート位置の次のセルからなので、1つめに見つかったセルはC8です。次がC11、次がC4、そして次がC8で最初に戻ったところで処理が終了します。なのでメッセージボックスに表示される順番が8行目→11行目→4行目となっています。
少し分かりづらいかもしれませんが、該当するセルを追いながらコードをよく見て下さい。
FindNextで部分一致する文字列を検索
今度は品種に「ベリー」がつくイチゴを検索します。先程の単価700を完全一致で検索したプロシージャを少し変更するだけで検索できます。
使用例 品種に「ベリー」がつくイチゴを検索
Sub ベリーを検索()
Dim 検索範囲 As Range
Dim 初回検索結果 As Range
Dim keyWord As String
Set 検索範囲 = Range(“B4:B13”)
keyWord = “ベリー”
Set 初回検索結果 = 検索範囲.Find(keyWord, LookAt:=xlPart)
If 初回検索結果 Is Nothing Then
MsgBox keyWord & “はありませんでした”
Exit Sub
End If
Dim msg As String
Dim 次の検索結果 As Range
Set 次の検索結果 = 初回検索結果
Do
msg = msg & keyWord & “は” & 次の検索結果.Row & “行目にあります” & vbCrLf
Set 次の検索結果 = 検索範囲.FindNext(次の検索結果)
Loop Until 次の検索結果.Row = 初回検索結果.Row
MsgBox msg
End Sub
変更箇所は
①検索範囲、②キーワード、③引数LookAtの設定値を部分一致「xlPart」にする
の3か所だけです。
「ベリー」と付く品種のイチゴが何行目にあるか表示されました。
今回は基本なので簡素なプロシージャで説明しましたが、Findは他の処理と組み合わせると活躍度が増し増しになります。