2017-07-21 12 views
0

VBAマクロで辞書を使用してvlookupを実行しようとしています。私はインターネットの周りのいくつかの例を見てきましたが、彼らは主に非常に具体的で、私はより多くの "裸の骨"のコードを支援することを望んでいます。私が達成したいものの単純な例を使用する:「注文」ワークシートのセルB2のダイナミックレンジ開始内の各セルであることVBAマクロで辞書を使用する単純なVLOOKUP

  • ルックアップ値(下段が変化する)

  • 表アレイは、セルE2に開始し(下の行は異なる)「レポート」ワークシートの列Lに延在するダイナミックレンジになるように

  • インデックス数が8であることがある

    カラム(列L)

  • レンジルクーpが偽

私の現在のコードすることは以下です:

Sub DictionaryVLookup() 
Dim x, y, z(1 To 10) 
Dim i As Long 
Dim dict As Object 
Dim LastRow As Long 

LastRow = Worksheets("Report").Range("B" & Rows.Count).End(xlUp).Row 


x = Sheets("Orders").Range("B2:B" & LastRow).Value 
y = Sheets("Report").Range("E2:E" & LastRow).Value 'looks up to this range 
Set dict = CreateObject("Scripting.Dictionary") 
For i = 1 To UBound(x, 1) 
    dict.Item(x(i, 1)) = x(i, 1) 
Next i 

For i = 1 To UBound(y, 1) 
    If dict.exists(y(i, 1)) Then 
     z(i) = y(i, 1) 
    Else 
     z(i) = "NA" 
    End If 
Next i 
Worksheets("Orders").Range("Z2:Z" & LastRow).Value = Application.Transpose(z) 'this is where the values are placed 

End Sub 

私は「検索」の部分が欠けているように見える、現在これはエラーなしで実行され、シンプルな場所「発見された値"を参照してください。しかし、戻り値をどのようにオフセットするかは分かりません(この例では列Lを返す)。

はまた、私はこのコードの一部の「フランケンシュタイン」の仕事をしてくれました - ので、これが存在している私はなぜわからない:

Dim x, y, z(1 To 10) 

(1〜10)私が推測する動的なものになるでしょう。

これは、このような方法で辞書を使用する私の最初の試みです。この単純な例を通して基本的な理解を得て、もっと複雑な状況に実装することができます。

私が記述していることを実行する他の方法はありますが、辞書について特に学びたいと思っています。

ありがとうございました!このような

+0

両方のシートが行の同じ番号を持っていますか?あなたは1つの 'LastRow'変数しか持っていません...あなたがここで何をしているのかがはっきりしていません。 –

+0

@TimWilliams単純な例では、両方のシートに同じ数の行があります。そうでない場合は、2番目のシートに「LastRowTwo」を追加します。辞書を使用して基本的なVLOOKUPを実行しようとしています – RugsKid

+0

ルックアップをしようとしていますが、コードではわかりません –

答えて

1

何か:

Sub DictionaryVLookup() 

    Dim x, x2, y, y2() 
    Dim i As Long 
    Dim dict As Object 
    Dim LastRow As Long, shtOrders As Worksheet, shtReport As Worksheet 

    Set shtOrders = Worksheets("Orders") 
    Set shtReport = Worksheets("Report") 
    Set dict = CreateObject("Scripting.Dictionary") 

    'get the lookup dictionary from Report 
    With shtReport 
     LastRow = .Range("E" & Rows.Count).End(xlUp).Row 
     x = .Range("E2:E" & LastRow).Value 
     x2 = .Range("L2:L" & LastRow).Value 
     For i = 1 To UBound(x, 1) 
      dict.Item(x(i, 1)) = x2(i, 1) 
     Next i 
    End With 

    'map the values 
    With shtOrders 
     LastRow = .Range("B" & Rows.Count).End(xlUp).Row 
     y = .Range("B2:B" & LastRow).Value 'looks up to this range 
     ReDim y2(1 To UBound(y, 1), 1 To 1) '<< size the output array 
     For i = 1 To UBound(y, 1) 
      If dict.exists(y(i, 1)) Then 
       y2(i, 1) = dict(y(i, 1)) 
      Else 
       y2(i, 1) = "NA" 
      End If 
     Next i 
     .Range("Z2:Z" & LastRow).Value = y2 '<< place the output on the sheet 
    End With 

End Sub 
関連する問題