You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel VBA将CSV文件读取为二维数组?

问题分析与解决方案

你的代码存在两个核心问题:

  • 循环中每次给ColumnsArray赋值都会覆盖之前的结果,最终仅保留最后一行的拆分数据;如果CSV文件末尾有换行符,最后一行会是空字符串,拆分后自然得到空数组。
  • 你没有构建真正的二维数组,只是反复覆盖一维数组,最终返回的也只是单行数据。

要生成符合需求的二维数组,需要先确定数组的行数和列数,再逐步填充数据,具体修正如下:

修正后的完整代码

Public Function ReadCSVFileInToArray(FilePath As String) As Variant
    Dim FileContent As String
    Dim RowsArray() As String
    Dim DataArray() As String
    Dim FinalArray() As Variant
    Dim rowCount As Long, colCount As Long
    Dim i As Long, j As Long
    
    ' 读取文件全部内容
    Open FilePath For Input As #1
    FileContent = Input(LOF(1), 1)
    Close #1
    
    ' 按换行拆分得到行数组
    RowsArray = Split(FileContent, vbCrLf)
    
    ' 清理末尾空行(处理文件结尾多余的换行符)
    rowCount = UBound(RowsArray)
    Do While rowCount >= 0 And RowsArray(rowCount) = ""
        rowCount = rowCount - 1
    Loop
    If rowCount < 0 Then
        ReadCSVFileInToArray = Empty ' 处理空文件情况
        Exit Function
    End If
    
    ' 以第一行数据确定列数(假设CSV每行列数一致)
    DataArray = Split(RowsArray(0), ",")
    colCount = UBound(DataArray)
    
    ' 初始化二维数组
    ReDim FinalArray(0 To rowCount, 0 To colCount)
    
    ' 循环填充二维数组
    For i = 0 To rowCount
        DataArray = Split(RowsArray(i), ",")
        ' 兼容行内列数不一致的情况(可选)
        For j = 0 To UBound(DataArray)
            If j <= colCount Then
                FinalArray(i, j) = DataArray(j)
            End If
        Next j
    Next i
    
    ReadCSVFileInToArray = FinalArray
End Function

关键说明

  1. 清理空行:避免文件末尾的换行符拆分出空元素,导致行数统计错误。
  2. 维度初始化:通过第一行拆分结果确定列数,结合清理后的有效行数,初始化二维数组的维度。
  3. 数据填充:逐行拆分后,将每列数据赋值到二维数组对应位置,同时处理了行内列数不一致的边界情况。
  4. 空文件处理:如果文件为空,直接返回空值避免报错。

注意事项

  • 确保传入的FilePath是完整有效路径(如C:\Documents\test.csv)。
  • 该代码适用于字段不含逗号的简单CSV;如果CSV中有带逗号的字段(如"张三,李四"),需要添加引号解析逻辑才能正确处理。

内容的提问来源于stack exchange,提问作者Bert Onstott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:41