【问题标题】:Input Txt file lines to array using vba使用 vba 将 Txt 文件行输入到数组
【发布时间】:2021-03-29 00:31:57
【问题描述】:

我有一个 txt 文件,我需要将它输入到一个字符串数组中,其中每一行是数组中的一项。

我以前使用过 vba,但从未编辑过 Word 和 Excel 以外的文件,所以这对我来说是新的。

以下是我的部分内容(从网上某处复制,所以我不太明白)

Sub TxtFileToArray(FilePath As String, LineArray As Variant, Optional Delimiter As String = vbCrLf)
'adapted from https://www.thespreadsheetguru.com/blog/vba-guide-text-files
Dim TextFile As Integer
Dim FileContent As String
    
'Open the text file in a Read State
  TextFile = FreeFile
  Open FilePath For Input As TextFile
  
'Store file content inside a variable
  FileContent = Input(LOF(TextFile), TextFile)

'Close Text File
  Close TextFile

它在FileContent = Input(LOF(TextFile), TextFile) 行上失败。错误信息是:

运行时错误“62”:
输入文件末尾

变量Textfile = 1 和LOF(Textfile) = 4480

我该怎么办?

编辑:
该文件充满了 xml 数据(它实际上是一个已转换为 .txt 的 .odc 文件)。我应该做些什么来将它全部转换为字符串?也许我可以以某种方式将它作为一个巨大的字符串导入,然后将其拆分为数组?

【问题讨论】:

  • 您是否仔细检查过您的 txt 文件中没有任何“奇怪”的值,例如空格、错位的分隔符等?因为错误表明代码已到达文件末尾,但仍在寻找输入值。
  • 该文件可能是二进制而不是文本,试试Open FilePath For Binary Access Read As TextFile - 如果它有效,那么就是这样。
  • 文件中充满了 xml 数据 - 有问题吗?这是否意味着它不会作为字符串打开?
  • @AlexK。你是对的,它有效!随意提交作为答案而不是评论,以便我可以正确接受它

标签: excel vba input text txt


【解决方案1】:

文本文件到数组

  • 这只是对可能即将发布的答案的补充,以展示如何使用函数来完成任务(我不知道 binarybinary file 到底是什么)。
  • 在我的简短调查中,它使用json 文件进行了测试。对我来说有趣的是它可以与InputBinary 一起使用,并且它需要vbLf 而不是vbCrLf 作为Delimiter
  • 请注意,如果您选择了错误的分隔符,您可能会在数组中得到一个值,就像在这种情况下发生的那样。
  • 测试过程会将行(数组中的值)写入ActiveSheetA 列中的单元格。

守则

Option Explicit

Sub TESTtextFileToArray()
    Const FilePath As String = "F:\Test\2020\TXT\test.json"
    Dim TextLines As Variant
    ' Note the 'vbLf' instead of 'vbCrLf'.
    TextLines = TextFileToArray(FilePath, vbLf)
    If Not IsEmpty(TextLines) Then
        ' Note that 'Transpose' has a 65536 limit per dimension.
        Range("A1").Resize(UBound(TextLines) + 1).Value _
            = Application.Transpose(TextLines)
        'Debug.Print Join(TextLines, vbLf)
        MsgBox "Found " & UBound(TextLines) + 1 & " lines."
    Else
        MsgBox "No lines found."
    End If
End Sub

' The result is a 0-based 1D array.
Function TextFileToArray( _
    ByVal FilePath As String, _
    Optional Delimiter As String = vbCrLf) _
As Variant
    
    Const ProcName As String = "TextFileToArray"
    On Error GoTo clearError

    Dim TextFile As Long
    TextFile = FreeFile
    
    Open FilePath For Input Access Read As TextFile
    On Error Resume Next
    TextFileToArray = Split(Input(LOF(TextFile), TextFile), Delimiter)
    On Error GoTo clearError
    Close TextFile

ProcExit:
    Exit Function

clearError:
    Debug.Print "'" & ProcName & "': Unexpected Error!" & vbLf _
              & "    " & "Run-time error '" & Err.Number & "':" & vbLf _
              & "        " & Err.Description
    Resume ProcExit

End Function

【讨论】:

    【解决方案2】:

    最简单的方法是使用 Scripting.Dictionary 和 FileSystemObject。

    Public Function GetAsStrings(ByVal ipPath As String) As Variant
    
        Dim myFso  As Scripting.FileSystemObject
        Set myFso = New Scripting.FileSystemObject
    
        Dim myfile As TextStream
        Set myfile = myFso.OpenTextFile(ipPath, Scripting.IOMode.ForReading)
            
        Dim myStrings  As Scripting.Dictionary
        Set myStrings = New Scripting.DIctionary
        
        Do Until myfile.AtEndOfStream
    
            myStrings.Add mystrings.count, myfile.ReadLine
     
        Loop 
            
        myfile.Close
        Set GetAsStrings = myStrings.Items
       
    End Function
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多