VBA - 有效地访问和查找CSV文件中的值

时间:2012-06-21 19:59:31

标签: excel vba csv

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

2 个答案:

答案 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