我正在研究一个复杂的模型,该模型需要在一系列不同的表中查找值。如果我将所有信息嵌入模型本身,那么文件很快就会变得笨拙。我希望找到一个解决方案,让我可以拥有一系列包含所有查找表的 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 回答