マクロによるINDEX、MATCH
マクロを使う理由
以前の投稿に関数での値参照を纏めましたが、今回はマクロで動かしてみました。
シートにベタ張りの関数よりマクロの方が見栄えが良いとか、長い関数出したくない、EXCEL変にいじられて壊されたくない、、、等。
色々理由や用途で必要な場面があるかもしれないし、無いかもしれない。
今回使うVBA関数について
WorksheetFunction.Index
そのままです。VBAのIndex関数です。
Sub IndexExample()
Dim GetValue '取得データ
GetValue = WorksheetFunction.Index(Range("A1:C10"), 3, 2)
MsgBox _
"■対象範囲:Range('A1:C10')" & vbLf & _
"■対象の範囲内の行:3" & vbLf & _
"■対象の範囲内の列:2" & vbLf & _
"■取得した値:" & GetValue
End Sub
WorksheetFunction.Match
コレもそのままです。VBAのMatch関数です。
Sub MatchExample()
Dim GetValue '取得データ(行数)
GetValue = WorksheetFunction.Match(Range("A1"), Range("B2:B11"), 0)
MsgBox _
"■検索対象:Range('A1')" & vbLf & _
"■検索対象範囲(列):Range('B2:B11')" & vbLf & _
"■取得した値(行):" & GetValue
End Sub
※検索対象がなかった場合、エラーが吐かれますので、エラー処理を設定してやってください。
マクロによるINDEX、MATCH
この2つの関数を用いて値を取得してみます。
何度も繰り返す作業を想定して行列で繰り返しを入れました。
Sub IndexMatch(intRow, intCol)
Dim GetValue
Dim GetValueRow
Dim GetValueAll
Dim intRow
Dim intCol
For intRow = 3 To 23 '対象の行カウント(3行目から検索文字入りと想定、今回約20単語とした)
For intCol = 1 To 10 '対象の列カウント(何列対象とするかによって変える、今回は10列分を対象)
'空の検索はしない(このIF文はフォーマット次第で入れない方が早いかも)
If Sheets("検索する単語を入れるシート").Range("A" & intRow & "").Value = "" Then
Else
GetValue = _
WorksheetFunction.Index(Sheets("検索範囲のシートA").Range("C" & intRow + 2 & ":BC3000"), _
WorksheetFunction.Match(Sheets("検索する単語を入れるシート").Range("A" & intRow), _
Sheets("検索範囲のシートB").Range("C5:C3000"), 0), intCol + 1)
GetValueRow = GetValueRow & GetValue & ","
End If
Next
GetValueAll = GetValueAll & GetValueRow & vbLf
intCol = 1
Next
MsgBox GetValueAll
End Sub



