検索値と同じ値のセルすべて取得する方法
ユーザーにインプットボックスに検索値を入力してもらい、使用されているセル範囲を検索して検索値が見つかった場合は見つかった検索値の数と検索値の値のセルを赤で塗りつぶす方法についてご紹介します。
実行イメージ
実行イメージ(空白を検索)
コードと解説
Sub 検索() Dim 検索値 As Variant Dim 検索結果 As Range Dim 最初結果 As Range Dim 結果範囲 As Range Dim データ範囲 As Range Set データ範囲 = ActiveSheet.UsedRange 検索値 = InputBox("検索する文字列を入力してください") Set 検索結果 = データ範囲.Find _ (What:=検索値, LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByColumns, MatchCase:=True, MatchByte:=True) If 検索結果 Is Nothing Then MsgBox 検索値 & "はみつかりません。" Exit Sub Else Set 最初結果 = 検索結果 Set 結果範囲 = 検索結果 End If Do Set 検索結果 = データ範囲.FindNext(検索結果) If 検索結果.Address = 最初結果.Address Then Exit Do Else Set 結果範囲 = Union(結果範囲, 検索結果) End If Loop MsgBox 検索値 & "は" & 結果範囲.Count & "件みつかりました。" & vbCrLf & _ "セルを赤で塗りつぶします。" 結果範囲.Interior.Color = RGB(255, 0, 0) End Sub
インプットボックスを使用してユーザーから受け取った検索値を格納する変数「検索値」をバリアント型(Variant)で宣言します。
3行目【Dim 検索結果 As Range】
Find【ファインド】メソッドで検索された検索されたセルを格納する変数「検索結果」をオブジェクト型(Range)で宣言します。
4行目【Dim 最初結果 As Range】
Find【ファインド】メソッドで最初に検索されたセルを格納する変数「最初結果」をオブジェクト型(Range)で宣言します。
5行目【Dim 結果範囲 As Range】
最終的に検索されたすべてのセルを格納する変数「結果範囲」をオブジェクト型(Range)で宣言します。
6行目【Dim データ範囲 As Range】
UsedRange【ユーズドレンジ】プロパティで取得した使用されたセル範囲を格納する変数「データ範囲」をオブジェクト型(Range)で宣言します。
7行目【Set データ範囲 = ActiveSheet.UsedRange】
Worksheet【ワークシート】オブジェクトのUsedRange【ユーズドレンジ】プロパティを使用して使用されているセル範囲を取得してオブジェクト変数「データ範囲」にSetキーワードを使用して代入します。
8行目【検索値 = InputBox(“検索する文字列を入力してください”)】
InputBox【インプットボックス】関数を使用してユーザーに検索値を入力してもらい変数「検索値」に代入します。
9行目~11行目【Set 検索結果 = データ範囲.Find _
(What:=検索値, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, MatchCase:=True, MatchByte:=True)】
変数「データ範囲」に対してFind【ファインド】メソッドを使用して検索値を設定する引数What【ワット】に変数「検索値」の値を設定して、変数「検索値」に格納されている値と一致する値が入力されているセルを検索してオブジェクト変数「検索結果」にSetキーワードを使用して代入します。
12行目~14行目【If 検索結果 Is Nothing Then
MsgBox 検索値 & “はみつかりません。”
Exit Sub】
If【イフ】ステートメントを使用して条件分岐をします。オブジェクト比較演算子のIs【イズ】演算子を使用してオブジェクト変数「検索結果」がNothing【ナッシング】のときを定義します。つまり、オブジェクト変数「検索結果」の中が空の状態(Findメソッドで検索したが一致した値がなかった)だったときを定義して条件が成立した場合13行目のMsgBox関数を使用してユーザーにメッセージを表示し14行目のExit【エグジット】ステートメントでSub【サブ】プロシージャーを途中で終了します。
15行目~17行目【Else
Set 最初結果 = 検索結果
Set 結果範囲 = 検索結果】
Else【エルス】キーワードを使用して条件が成立しなかった場合つまり、オブジェクト変数「検索結果」がNothingではない場合の処理をします。変数「最初結果」に変数「検索結果」をSetキーワードを使用して代入します。変数「結果範囲」に変数「検索結果」をSetキーワードを使用して代入します。つまり、各オブジェクト変数に検索値と一致した最初のセルを代入します。
19行目【Do】
Do Loop【ドゥループ】ステートメントを使用して繰り返し処理のはじまりです。ここでは繰り返しを抜ける条件は設定しません。
20行目【Set 検索結果 = データ範囲.FindNext(検索結果)】
Range【レンジ】オブジェクトのFindNext【ファインドネクスト】メソッドを使用して直前に実行したFind【ファインド】メソッドと同じ条件で引数に設定したオブジェクト変数「検索結果」に格納されている最初に検索値と一致したセルの次に検索値と一致したセルを検索してオブジェクト変数「検索結果」に代入します。
21行目~22行目【If 検索結果.Address = 最初結果.Address Then
Exit Do】
If【イフ】ステートメントを使用して条件分岐をします。繰り返し処理の中でオブジェクト変数「検索結果」に代入される検索値に一致したセルが最初に一致したセルが格納されているオブジェクト変数「最初結果」と一致した場合を定義します。
この一致の判断はセルの値ではなくAddress【アドレス】プロパティを使用してセル番地を取得して同じセルだった場合を定義します。
つまり、繰り返し処理ですべての対象セルを検索し終えたときになり、条件が成立したときにExit【エグジット】ステートメントを使用して繰り返し処理を途中で終了します。
23行目~24行目【Else
Set 結果範囲 = Union(結果範囲, 検索結果)
End If
Loop】
Else【エルズ】キーワードを使用して条件が成立していない場合、つまりすべてのセルを検索し終えていない場合、Application【アプリケーション】オブジェクトのUnion【ユニオン】メソッドを使用して繰り返し処理の中で一致するセルを各オブジェクト変数に格納して集合体としてオブジェクト変数「結果範囲」に代入します。
37行目~28行目【MsgBox 検索値 & “は” & 結果範囲.Count & “件みつかりました。” & vbCrLf & _
“セルを赤で塗りつぶします。”】
18行目~19行目の条件分岐で条件が成立した場合つまり、繰り返し処理ですべての対象セルを検索し終えたときにMsgBox関数を使用してメッセージを表示します。変数「検索値」に格納されているユーザーがインプットボックスに入力した文字列とRange【レンジ】オブジェクトのCount【カウント】プロパティで取得したオブジェクト変数「結果範囲」に格納されているセルの数(検索値と同じ値のセル)を表示します。
29行目【結果範囲.Interior.Color = RGB(255, 0, 0)】
オブジェクト変数「検索結果」に格納されているセル、つまり検索値と一致したセルの集まりの背景を表すInterior【インテリア】オブジェクトのColor【カラー】プロパティにRGB関数で赤色を設定して、検索値と一致した値のセルを赤色に塗りつぶします。
以上で、使用されているセル範囲の指定した値のセルを取得する方法についての解説を終了します。ありがとうございました。