2016-08-29 9 views
0

Googleからこのルックアップvbaが見つかりました。私はいくつかの変更を行いました。 しかし、私は同じタスクのコーディングを複製する問題を解決する方法を理解するのが難しいです(下記を参照してください) 私の目的は、一度に一つの値を検索し、倍数の値を返すことです。 以下は私のステップのいくつかされていますVBAのVlookup機能の繰り返しタスクがある

  1. 生データテーブル(データ分析)はC8からO399

    にある
  2. ルックアップ値はA172するA5からのものであり、戻り結果がにT5に配置されますT172

  3. は、その後、私はわずかに異なる列

  4. I明確再び生データと検査ステップ1におけるコード及び2を複製することにより、ルックアップ次再び繰り返す(シート名「グラフ」で) I399へのC8からテーブル(データ分析) - *第一段階とは異なる列

  5. ルックアップ値A172と、結果を返すために、A5からあるV172にV5に配置されたが(シート名で「グラフ」)

  6. 私は(約15の値の周りの)すべての複数の戻りをルックアップし終えるまで、私は再び1と2を繰り返す

列とテーブルの値があるように、私はループにこれを置くために苦労していますルックアップごとに変更されます。

生データのルックアップテーブルの2つの列は、すべてのルックアップタスクのみを許可します(これは特定の列を探すために必要なvkloopとは異なります)。 追加したい点は、数千行に上って、私はこのコードが店舗用の "コレクション"を使用しているのを見ています。私はこれが何のためにわからない。

は、以下のコードどれが大幅に高く評価されるのに役立ちます

Sub VLookupValues(lookupCategory As Range, lookupValues As Range, vlookupCol As Object) 
    Dim i As Long, resArr() As Variant 
    ReDim resArr(lookupCategory.Rows.Count, 1) 
    For i = 1 To lookupCategory.Rows.Count 
     resArr(i - 1, 0) = vlookupCol.Item(CStr(lookupCategory(i))) 
    Next i 
    lookupValues = resArr 
End Sub 

です。おかげさまで

Sub TestVBA() 
OptimizeVBA True 
Dim startTime As Single, endTime As Single 
startTime = Timer 

Dim testnames As Range, testvalues As Range 
Dim lookupTestNames As Range, lookupTestValues As Range 
Dim vlookupCol As Object 



Set testnames = Worksheets("Data Analysis").Range("C8:C399") 
Set testvalues = Worksheets("Data Analysis").Range("O8:O399") 
    Set lookupTestNames = Worksheets("Graph").Range("A5:A172") 
Set lookupTestValues = Worksheets("Graph").Range("T5:T172") 

'Set testvalues = Worksheets("Data Analysis").Range("I8:I" & 399) 
'Set lookupTestNames = Worksheets("Graph").Range("A5:A172") 
'Set lookupTestValues = Worksheets("Graph").Range("U5:U172") 

'Build Collection 
Set vlookupCol = BuildLookupCollection(testnames, testvalues) 

'Lookup the values 
'VLookupValues lookupTestNames, lookupTestValues, vlookupCol 
VLookupValues lookupTestNames, lookupTestValues, vlookupCol 
endTime = Timer 
Debug.Print (endTime - startTime) & " seconds have passed [VBA]" 
OptimizeVBA False 
Set vlookupCol = Nothing 

'For Lower Test Spec**************************************************************** 
Set testnames = Worksheets("Data Analysis").Range("C8:C" & 399) 
Set testvalues = Worksheets("Data Analysis").Range("I8:I" & 399) 
Set lookupTestNames = Worksheets("Graph").Range("A5:A172") 
Set lookupTestValues = Worksheets("Graph").Range("U5:U172") 

'Build Collection 
Set vlookupCol = BuildLookupCollection(testnames, testvalues) 

'Lookup the values 
VLookupValues lookupTestNames, lookupTestValues, vlookupCol 
endTime = Timer 
Debug.Print (endTime - startTime) & " seconds have passed [VBA]" 
OptimizeVBA False 
Set vlookupCol = Nothing 

'For Upper Test Spec**************************************************************** 

Set testnames = Worksheets("Data Analysis").Range("C8:C" & 399) 
Set testvalues = Worksheets("Data Analysis").Range("J8:J" & 399) 
Set lookupTestNames = Worksheets("Graph").Range("A5:A172") 
Set lookupTestValues = Worksheets("Graph").Range("V5:V172") 

'Build Collection 
Set vlookupCol = BuildLookupCollection(testnames, testvalues) 

'Lookup the values 
VLookupValues lookupTestNames, lookupTestValues, vlookupCol 
endTime = Timer 
Debug.Print (endTime - startTime) & " seconds have passed [VBA]" 
OptimizeVBA False 
Set vlookupCol = Nothing 
+0

'BuildLookupCollection'は何ですか? –

+1

ルックアップ値と戻り値の順序がない場合は、ルックアップ列と戻り値列の配列を作成してみる必要があります。したがって、各ループで必要な列を検索して必要な列を返すことができます。 –

答えて

0

アリには正しいアプローチがあります。列のペアを持つルックアップ配列は、ループを簡単にします。


Sub TestVBA2() 
    OptimizeVBA True 
    Dim startTime As Single 
    Dim cSet, vlookupCol As Object 

    For Each cSet In Array(Array("I", "T"), Array("J", "U"), Array("O", "V")) 
     startTime = Timer 

     With Worksheets("Data Analysis").Rows("8:399") 
      Set vlookupCol = BuildLookupCollection(.Columns("C"), .Columns(cSet(0))) 
     End With 

     With Worksheets("Graph").Rows("5:172") 
      VLookupValues .Columns("A"), .Columns(cSet(1)), vlookupCol 
     End With 

     Debug.Print Timer - startTime, "Data Analysis Column:"; cSet(0), "Graph Column:"; cSet(1) 
    Next 

    OptimizeVBA False 

End Sub 
関連する問題