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