マクロによる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