ゼロスタートで1BTC達成  (`・ω・´)σ  普通の会社員がコツコツ資産運用で生活向上するBlog

【Excel VBA】検索の基本 Find ,FindNext|条件に一致するセルを検索する色々なマクロの書き方を苺で解説

  • 2022-04-03
  • 2024-02-21
  • Excel

VBAを学びたいけれど、色々なサイトを見ても難しくて頭に入って来ないと諦めそうになっていませんか?

(*’ω’*)σ VBA指南サイトって文字ビッシリで解読不能な暗号に見えてくるものが多いですよね。

このサイトでは図解を豊富に交えて初心者でもすんなりVBAの世界に入り込めるような解説をしています。エキスパート向けではありませんが、基本を押さえたい方にはぴったりの内容です。

▼ 本記事でわかる事

  •  特定の範囲内からある値を含むセルを探したい
      ↳ セル範囲や列を指定した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

VBAのFindメソッドで該当するセルに対して処理を行ったExcel画面の画像

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ファイル固有の検索設定が適用されてしまう

検索設定は、ホームタブ→検索と置換→検索→オプションで確認できます。思ったような検索ができない場合、引数を使って検索方法を指定する必要があります。

Excelの検索設定のオプション項目と役割一覧の図解

Findメソッドを使用するたびに、引数 LookIn、LookAt、SearchOrder、MatchByte の設定は保存されます。ここの基本設定と違う方法で検索したい場合は、引数を使って指定する必要があります。

2.引数Afterで指定した検索開始位置に条件に当てはまるセルがあっても検索されない

これは引数の説明通り、検索開始位置の次のセルから検索されるからです。引数Afterを省略した場合も同様で、一番左上に条件に当てはまるセルがあっても検索されません

3.Findメソッドは検索結果が無かった時にエラーが出る

エラーにならないために検索結果が無かった時の処理を組み込んでおくことが必要です。

FindNextメソッドの基本構造

オブジェクト.FindNext(After)

FindとFindNextの違い

Findメソッドは検索範囲で最初に見つけた1つのセルを返します。
FindNextメソッドは、Findメソッドで見つけたセルの次から検索し、指定範囲をすべて検索し終えたら最初に戻ります。

VBAのFindとFindNextの違いを説明する図解

FindNextの使用例

表の単価の列から「700」を検索してみます。通常は検索範囲ならmyRangeなどの表記にする方が多いとは思いますが、分かりやすいように日本語多めでいきます笑。

VBAのFindNextを使って該当するセルを全て検索していく処理を実行したExcel画面の画像

使用例  単価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

VBAのFindNextを使って該当するセルを全て検索していく処理を実行したExcel画面の画像の続き

スタート位置のC4セルに700がありますが、検索されるのはスタート位置の次のセルからなので、1つめに見つかったセルはC8です。次がC11、次がC4、そして次がC8で最初に戻ったところで処理が終了します。なのでメッセージボックスに表示される順番が8行目→11行目→4行目となっています。

少し分かりづらいかもしれませんが、該当するセルを追いながらコードをよく見て下さい。
諦めそうになっても、もう1回!

°˖✧◝(⁰▿⁰)◜✧˖°「なるほどー!」って理解できた時の感動を味わいましょう。
絶対分かる時が来るので、大丈夫です!

部分一致で検索をしてみる

今度は品種に「ベリー」がつくイチゴを検索します。先程の単価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か所だけです。

VBAのFindメソッドを使って、部分一致する文字列を検索するExcel画面の画像

「ベリー」と付く品種のイチゴが何行目にあるか表示されました。
今回は基本なので簡素なプロシージャで説明しましたが、Findは他の処理と組み合わせると活躍度が増し増しになります。

▶Findを応用した超速見積フォームの記事はこちらから