一連の個別のテーブルで値を検索する必要がある複雑なモデルに取り組んでいます。モデル自体にすべての情報を埋め込むと、ファイルはすぐに扱いにくくなります。すべてのルックアップ テーブルを含む一連の CSV ファイルを作成し、VBA コードで必要に応じて各 CSV ファイルをすばやく読み取って適切な値を返すことができるソリューションを見つけたいと考えています。私の最初の考えは、必要に応じて作業メモリ内の各 CSV ファイルを読み取り、必要な値を検索し、検索が完了したら情報を破棄することです。それはそれを行うための最も効率的な方法ですか?
質問する
10554 次
2 に答える
1
これはあなたにとってうまくいくかもしれないアイデアです.csvファイルが最初に必要になったときにバリアント配列にロードすると、その後の呼び出しでキャッシュされたデータが使用されます。任意の列の値を検索し、他の列から対応する値を返すことができます。
編集: CSV ファイルからルックアップ配列を設定する方法を示すように更新されました
Sub Tester()
Dim arr1, arr2
arr1 = CsvToArray("D:\Analysis\tmp\Data1.csv")
arr2 = CsvToArray("D:\Analysis\tmp\Data2.csv")
Debug.Print TestLookup(arr1, "lookup1", 2, 1)
Debug.Print TestLookup(arr2, "lookup2", 3, 1)
'bunch more lookups...
End Sub
Function TestLookup(arr, val, lookincol As Integer, returnfromcol As Integer)
Dim r
r = Application.Match(val, Application.Index(arr, 0, lookincol), 0)
If Not IsError(r) Then
TestLookup = arr(r, returnfromcol)
Else
TestLookup = "Not found" 'or some other "error" value
End If
End Function
Function CsvToArray(filepath As String) As Variant
Dim wb As Workbook
Application.ScreenUpdating = False
Set wb = Workbooks.Open(filepath)
CsvToArray = wb.Sheets(1).Range("A1").CurrentRegion.Value
wb.Close False
End Function
于 2012-06-21T21:17:24.910 に答える
0
あなたが本当にExcelでそれをしなければならないなら、これは方法です:
Function GetData(This As String, ResultCol As Integer)
Dim LastRow As Long
Application.ScreenUpdating = False 'Turn off screen refreshing
Workbooks.Open Filename:="E:\my_files\tables.csv" 'Open the CSV file
LastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'used for range in vlookup
GetData = Application.WorksheetFunction.VLookup(This, Range(Cells(1, 1), Cells(LastRow, ResultCol)), ResultCol, False)
Workbooks("Tables.csv").Close 'Close the CSV file
Application.ScreenUpdating = True 'Turn on screen refreshing
End Function
于 2012-06-21T21:19:30.290 に答える