用于读取CSV文件的Excel用户定义函数?

用于读取CSV文件的Excel用户定义函数?,excel,vba,csv,Excel,Vba,Csv,我正在寻找一个VBA用户定义函数,该函数将读取.csv文件的内容,并将结果作为数组返回,以填充工作表的单元格,例如: =CSV_Read("path/to/file.csv") 我已找到但看起来是专有/共享软件。有人知道其他的选择吗?或者,在VBA中运行我自己的脚本的最佳方法是什么?在VBA代码中,添加对“Microsoft脚本运行时”的引用。 添加一个模块,粘贴以下代码 Option Explicit Public Function CSV_Read(ByVal path As Str

我正在寻找一个VBA用户定义函数,该函数将读取.csv文件的内容,并将结果作为数组返回,以填充工作表的单元格,例如:

   =CSV_Read("path/to/file.csv")

我已找到但看起来是专有/共享软件。有人知道其他的选择吗?或者,在VBA中运行我自己的脚本的最佳方法是什么?

在VBA代码中,添加对“Microsoft脚本运行时”的引用。
添加一个模块,粘贴以下代码

Option Explicit
Public Function CSV_Read(ByVal path As String) As Variant
Dim fso As Scripting.FileSystemObject
Dim tsm As Scripting.TextStream

Dim data

Dim text As String
Dim allRowsInArray As Variant
Dim currentLineToArray As Variant

Dim columnCount As Integer
Dim columnCounter As Integer

Dim rowCounter As Integer
Dim rowCount As Integer

Set fso = New Scripting.FileSystemObject
Set tsm = fso.OpenTextFile(path, ForReading)

rowCounter = 0
If Not tsm.AtEndOfStream Then
    text = tsm.ReadAll

    tsm.Close
    Set tsm = Nothing
    Set fso = Nothing

    allRowsInArray = Split(text, vbCrLf)
    rowCount = UBound(allRowsInArray)

    Do While rowCounter < (rowCount + 1)
        currentLineToArray = Split(allRowsInArray(rowCounter), ",")

        If Not IsArray(data) Then
            columnCount = UBound(currentLineToArray)
            ReDim data(rowCount, columnCount)
        End If

        For columnCounter = 0 To columnCount
            data(rowCounter, columnCounter) = currentLineToArray(columnCounter)
        Next

        rowCounter = rowCounter + 1
    Loop
End If

CSV_Read = data
End Function
查看数据,它有7列4行

现在,转到单元格A1并选择从单元格A1到G4的范围。
在单元格A1中键入公式(
=CSV\u Read(“CSV文件的完整路径”)
(保持当前选择)

重要提示:

键入公式后,按CTRL+SHIFT+ENTER。这是数组公式。

在VBA代码中,添加对“Microsoft脚本运行时”的引用。
添加一个模块,粘贴以下代码

Option Explicit
Public Function CSV_Read(ByVal path As String) As Variant
Dim fso As Scripting.FileSystemObject
Dim tsm As Scripting.TextStream

Dim data

Dim text As String
Dim allRowsInArray As Variant
Dim currentLineToArray As Variant

Dim columnCount As Integer
Dim columnCounter As Integer

Dim rowCounter As Integer
Dim rowCount As Integer

Set fso = New Scripting.FileSystemObject
Set tsm = fso.OpenTextFile(path, ForReading)

rowCounter = 0
If Not tsm.AtEndOfStream Then
    text = tsm.ReadAll

    tsm.Close
    Set tsm = Nothing
    Set fso = Nothing

    allRowsInArray = Split(text, vbCrLf)
    rowCount = UBound(allRowsInArray)

    Do While rowCounter < (rowCount + 1)
        currentLineToArray = Split(allRowsInArray(rowCounter), ",")

        If Not IsArray(data) Then
            columnCount = UBound(currentLineToArray)
            ReDim data(rowCount, columnCount)
        End If

        For columnCounter = 0 To columnCount
            data(rowCounter, columnCounter) = currentLineToArray(columnCounter)
        Next

        rowCounter = rowCounter + 1
    Loop
End If

CSV_Read = data
End Function
查看数据,它有7列4行

现在,转到单元格A1并选择从单元格A1到G4的范围。
在单元格A1中键入公式(
=CSV\u Read(“CSV文件的完整路径”)
(保持当前选择)

重要提示:

键入完公式后,按CTRL+SHIFT+ENTER。这是数组公式。

这看起来很棒,谢谢。但我必须修改行分割,以处理带有逗号的值。@RichardH:当然。我想它可能有一些错误,我考虑得不够。我希望它在代码中可以直接使用数组f这个方法的前提是你知道txt文件的大小import@brettdj:你能用一个例子来解释(假定文本文件的大小)吗?+1自从看到Richard H提到的例子后,我认为我的评论不太相关-如果excel数组太大,那么额外的结果只会在“备用”中出错我确实需要对我的测试做一个小改动
rowCount=UBound(allRowsInArray)-1
以使代码在我的测试中正常工作。一个建议-使用可选的用户偏移量,以便将数据从左上角的记录中移动。但是做得很好-很好,看起来很棒,谢谢。但是我必须修改行分割,以处理带有逗号的值。@RichardH:当然。我想它可能有一些错误,我想得不够多。我希望它在代码中可以直接使用,使用数组公式。这种方法的前提是您知道txt文件的大小import@brettdj:你能解释一下吗(预设文本文件的大小),举例说明?+1在看过Richard H提到的例子后,我认为我的评论不太相关-如果excel数组太大,那么额外的结果只会在“空闲”单元格中出错。我确实不得不对测试
rowCount=UBound(allRowsInArray)做一些小的更改-1
让代码为我的测试工作。一个建议-可选的用户偏移量如何,以便将数据从左上角的记录中移动。但是做得很好-很好的CSV文件,顾名思义应该是逗号分隔的,Excel完全能够用导入向导处理这些文件,为什么需要VBA过程?请注意acuse它远没有一个功能那么优雅,它可以直接读取中的内容,并且可以通过简单的转换进行刷新-f9@Richard“外部数据”工具栏有一个刷新按钮,可从向导中重新导入数据。若要添加到JP,您甚至可以根据需要在工作簿上进行刷新,甚至可以进行追加。这将为您提供一个数据源您可以使用.CSV文件做任何事情,正如名称所示,它应该是逗号分隔的,Excel完全能够使用导入向导处理这些文件,为什么需要VBA过程?因为它远不如一个可以直接读取中的内容并可以通过简单的移位刷新的函数优雅-f9@Richard“外部数据”工具Bar有一个刷新按钮,可以从向导中重新导入数据。若要添加到JP,您甚至可以在工作簿上打开该按钮进行刷新,甚至可以根据需要进行追加。这为您提供了一个数据源,您可以对其执行任何操作。