Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


48956 / 76732 ←次へ | 前へ→

【32702】Re:条件付でVLOOKUP関数を適用する
回答  Kein  - 05/12/21(水) 2:47 -

引用なし
パスワード
   そーいう処理なら、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列の全てのセルに入力する必要があるため、
なおさら重くなる、と判断しています。ま、普通のマクロにするなら数式を使った
コードにしなくても出来るのですが、そのへんは微妙な問題で、数式による判定も
適切に行えば速度が期待できるため、あえてこのようなコードを組んでみた
というわけです。
0 hits

【32701】条件付でVLOOKUP関数を適用する mai×2 05/12/21(水) 1:21 質問
【32702】Re:条件付でVLOOKUP関数を適用する Kein 05/12/21(水) 2:47 回答
【32703】Re:条件付でVLOOKUP関数を適用する Kein 05/12/21(水) 2:52 発言
【32704】Re:条件付でVLOOKUP関数を適用する Kein 05/12/21(水) 2:59 発言
【33265】おそくなってしまい、大変申し訳ございませ... mai×2 06/1/6(金) 12:47 お礼

48956 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free