Excel VBA 検索値と同じ値のセルをすべて取得する

スポンサーリンク
スポンサーリンク

検索値と同じ値のセルすべて取得する方法

ユーザーにインプットボックスに検索値を入力してもらい
使用されているセル範囲を検索して
検索値が見つかった場合は見つかった検索値の数と
検索値の値のセルを赤で塗りつぶす方法についてご紹介します。

実行イメージ

実行イメージ(空白を検索)

コード例

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

コードの解説

2行目
【Dim 検索値 As Variant】

インプットボックスを使用して
ユーザーから受け取った検索値を格納する
変数「検索値」を
バリアント型(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関数で赤色を設定して
検索値と一致した値のセルを赤色に塗りつぶします。


以上で
使用されているセル範囲の指定した値のセルを取得する
方法についての解説を終了します。
ありがとうございました。

スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク