|
そーいう処理なら、VLOOKUP関数とかFunctinプロシージャを使わなくても、普通の
マクロ(Subプロシージャ)でやった方が軽いし簡単です。コードは↓こんな感じです。
Sub Get_MyData()
Dim Sh1 As Worksheet, Sh2 As Worksheet
Dim C As Range
Dim Rnm As Long
Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet2")
Sh1.Range("B:D, AA:AA").ClearContents
With Sh1.Range("A2", Sh1.Range("A65536").End(xlUp)).Offset(, 26)
.Formula = _
"=IF(ISNA(MATCH($A2,Sheet2!$A:$A,0)),FALSE,MATCH($A2,Sheet2!$A:$A,0))"
On Error Resume Next
Intersect(.SpecialCells(3, 4).EntireRow, Sh1.Range("D:D")) _
.Value = "該当なし !"
On Error GoTo 0: On Error GoTo ELine
For Each C In .SpecialCells(3, 1)
Rnm = C.Value
C.Offset(, -25).Resize(, 3).Value = _
Sh2.Range(Sh2.Cells(Rnm, 2), Sh2.Cells(Rnm, 4)).Value
Next
ELine:
.ClearContents
End With
Set Sh1 = Nothing: Set Sh2 = Nothing
End Sub
* Sheet1 の1行目は項目という前提にしていますが、もしデータが入力されて
いるのなら
With Sh1.Range("A1", Sh1.Range("A65536").End(xlUp)).Offset(, 26)
.Formula = _
"=IF(ISNA(MATCH($A1,Sheet2!$A:$A,0)),FALSE,MATCH($A1,Sheet2!$A:$A,0))"
というように修正して下さい。
なおご覧のとおり、このコードは数式をセルに埋めて判定する形になってますが、
MATCH関数はVLOOKUP関数に比べて軽いので、データ数が増えるほど差が出るはず
です。しかも VLOOKUPなら B〜D列の全てのセルに入力する必要があるため、
なおさら重くなる、と判断しています。ま、普通のマクロにするなら数式を使った
コードにしなくても出来るのですが、そのへんは微妙な問題で、数式による判定も
適切に行えば速度が期待できるため、あえてこのようなコードを組んでみた
というわけです。
|
|