如何将 CSV 数据导入多个数组并通过 VBA 中的函数或子函数返回多个数组?

Posted

技术标签:

【中文标题】如何将 CSV 数据导入多个数组并通过 VBA 中的函数或子函数返回多个数组?【英文标题】:How to import CSV data into multiple arrays and to return the multiple arrays via a function or sub in VBA? 【发布时间】:2019-07-19 10:34:59 【问题描述】:

我想创建一个导入 CSV 文件的 VBA 加载项,将数据列拆分为单独的数组,并将这些多个数组返回给调用此加载项的子程序。不知道解决这个问题的最佳方法是什么。

例如,我的数据文件夹包含许多 CSV 文件,每个文件有 5 列数据(第一列是日期,其余列是数字数据。有一行标题)。

我还有几个不同的工作簿,它们对这些 CSV 文件执行不同类型的分析。因此,我不想在每个工作簿中重复使用相同的导入 csv 数据函数或子函数,而是想创建一个加载项来执行此导入函数。

理想情况下,此加载项将为每个 CSV 文件返回 5 个单独的数组。如果没有,如果它返回一个 5 列的数组就可以了。

代码将类似于(其中 SomeAnalysis Sub 位于其中一个工作簿中,ImportCSV 是加载项函数或 Sub,ncsv 是要评估的 CSV 文件的数量):

Sub SomeAnalysis()

  For n = 1 to ncsv
    [arr1,arr2,arr3,arr4,arr5]=ImportCSV(filename(n))
    'Perform the analysis
  next n

End Sub

【问题讨论】:

【参考方案1】:

最后通过我在网上找到的一些代码改编解决了它。希望这对你们中的一些人有用。

Option Explicit
Option Base 1

'Import CSV file function: Returns an array of data or multiple arrays
Public Function ImportCSV(filename As String, Optional splitarray As Boolean = True, Optional incheaders As Boolean = True) As Variant()
Dim fnum As Integer                         'file number
Dim datafile As String                      'raw datafile
Dim lines As Variant                        'breaking the file into lines
Dim one_line As Variant                     'temp data rows to split in loop
Dim nrows As Long, ncols As Integer         '# data rows and columns
Dim arr() As Variant                        'jagged data array (i.e. array of arrays)
Dim colarr() As Variant                     'component arrays in arr()
Dim h As Integer                            'flag for include header option
Dim r As Long, c As Integer                 'counters

'Load file
fnum = FreeFile
Open filename For Input As fnum
datafile = Input$(LOF(fnum), #fnum)
Close fnum

'Break file into lines
lines = Split(datafile, vbCrLf)

'Dimension the array
h = IIf(incheaders, 0, 1)
nrows = UBound(lines) - h
one_line = Split(lines(0), ",")
ncols = UBound(one_line)

'Choice to use jagged arrays to split data columns
If splitarray = True Then
    ReDim arr(1 To ncols + 1)
    For c = 0 To ncols
        ReDim colarr(1 To nrows)
        arr(c + 1) = colarr
    Next c
    'Copy data into array
    For r = 0 To nrows - 1
        If Len(lines(r)) > 0 Then
            one_line = Split(lines(r + h), ",")
            For c = 0 To ncols
                arr(c + 1)(r + 1) = one_line(c)
            Next c
        End If
    Next r
Else
    ReDim arr(nrows, ncols + 1)
    'Copy data into array
    For r = 0 To nrows - 1
        If Len(lines(r)) > 0 Then
            one_line = Split(lines(r + h), ",")
            For c = 0 To ncols
                arr(r + 1, c + 1) = one_line(c)
            Next c
        End If
    Next r
End If
ImportCSV = arr
End Function

【讨论】:

以上是关于如何将 CSV 数据导入多个数组并通过 VBA 中的函数或子函数返回多个数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 vba/macros 将多个 CSV 文件中的特定列导入 Access 2013

如何使用 VBA 从混乱的 CSV 导入数据

从 D3 中的多个 csv 文件导入数据

excel vba自动图片导入

VBA批量导入文本文件,如何转换二维数组?

使用 VBA 将 CSV 文件导入 Access