ES000009_VBAエキスパート(ExcelVBAスタンダード)合格講座/第九回:セルの検索

VBAエキスパート(ExcelVBAスタンダード)合格講座/第九回:セルの検索 ExcelVBA Standard

このページの内容について

このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第九回記事です。公式テキスト第6章「セルの検索」の内容について解説します。自分でも手を動かしながら読み進めてください。主に講座受講者の復習での利用を想定しています。

Findメソッド

Excelにはセルの値や式を検索する機能があります。RangeオブジェクトのFindメソッドはこの機能をマクロで呼び出すことができます。

文法

引数役割
WhatVariant検索したい値を指定します
AfterVariant(Range)セルを指定すると、そのセルより後ろを検索対象とします。
LookInVariant(XlFindLookIn)xlFormulas ・・ 数式
xlValues ・・ 値
xlComments ・・ メモ
xlCommentsThreaded ・・ コメント
LookAtVariant(XlLookAt)xlWhole ・・ 完全一致
xlPart ・・ 部分一致
SearchOrderVariant(XlSearchOrder)xlByRows ・・ 行方向検索
xlByColumns ・・ 列方向検索
SearchDirectionVariant(XLSearchDirection)xlNext ・・ 次を検索
xlPrevious ・・ 前を検索
MatchCaseVariant(Boolean)True ・・ 大文字と小文字を区別する
False ・・ 大文字と小文字を区別しない
MatchByteVariant(Boolean)True ・・ 半角と全角を区別する
False ・・ 半角と全角を区別しない
SearchFormatVariant(Boolean)Application.FindFormatで指定した書式を検索条件に含めることができます。

基本の使い方

Findメソッドには、多くの引数がありますが公式テキストの説明範囲に従い、ここでは「What」「LoolAt」以外の引数は使用しません。Findメソッドは検索したセルが見つかった場合は、Rangeオブジェクトを返します。

サンプルコード(クリックでコピー)
Private Sub Test_Find()

Dim ws As Worksheet
Dim rng_obj As Range
Dim search_word As String
Dim r As Long, c As Long

search_word = "検索したいセル"

r = Int((10000 * Rnd + 1))
c = Int((100 * Rnd + 1))

Set ws = ThisWorkbook.Worksheets(1)
ws.Cells(r, c).Value = search_word

Set rng_obj = ws.Range(ws.Cells(1, 1), ws.Cells(10000, 100)).Find(search_word, LookAt:=xlWhole)

Call rng_obj.Activate

End Sub
実行結果

上記サンプルコードは、ランダムな行(1~10,000)とランダムな列(1~100)に値を入力しFindメソッドで検索、返されたRangeオブジェクトを使用し、値が入力されたセルをアクティブにします。

FindメソッドはExcelの検索と置換ウィンドウの機能をそのまま使用します。この検索機能には複数のオプションがあり上述の通り引数は、各オプションの機能に対応しています。そのためマクロで設定したオプションはウィンドウに反映し、ウィンドウから設定したオプションはマクロでも適用されます。

見つからなかったとき

Findメソッドがセルを見つけたときは、Rangeオブジェクトを返しますが、見つからなかったときは、オブジェクト変数の初期値である「Nothing」が返されます。そのためセルが見つからなかった場合、後続の処理でRangeオブジェクトを使用しているとエラーが発生してしまいます。これを回避するために、通常は、戻り値が「Nothing」であるかどうかを判定すること処理を入れます。

サンプルコード(クリックでコピー)
Private Sub Test_NotFound()

Dim ws As Worksheet
Dim rng_obj As Range
Dim search_word As String

search_word = "検索したいセル"

Set ws = ThisWorkbook.Worksheets(1)

Set rng_obj = ws.Range(ws.Cells(1, 1), ws.Cells(10000, 100)).Find(search_word, LookAt:=xlWhole)

If Not rng_obj Is Nothing Then

rng_obj.Activate

Else

Call MsgBox("見つかりませんでした", vbCritical)

End If

End Sub
実行結果

上記サンプルコードは、マクロを実行中のブックの1番目のシートから「検索したいセル」という文字列を探し、見つかった場合、セルをアクティブにします。見つからなかった場合、メッセージを表示します。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment