0

我正在研究一个复杂的模型,该模型需要在一系列不同的表中查找值。如果我将所有信息嵌入模型本身,那么文件很快就会变得笨拙。我希望找到一个解决方案,让我可以拥有一系列包含所有查找表的 CSV 文件,然后让我的 VBA 代码根据需要快速读取每个 CSV 文件并返回适当的值。我最初的想法是根据需要读取工作内存中的每个 CSV 文件,查找必要的值,然后在查找完成后丢弃信息。这是最有效的方法吗?

4

2 回答 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 回答