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