【问题标题】:Issue in reading and processing text file using VBA使用 VBA 读取和处理文本文件的问题
【发布时间】:2017-07-06 18:38:04
【问题描述】:

我是 VBA 的新用户,正在尝试读取一个很大的文本文件。有时也是一些 MB 大小的文本文件。

数据由不同时间戳的某个数字的打印结果组成。

我需要存储值的时间戳如下:

步骤时间已完成 1.00,总时间已完成 1.00

那么打印出来的数据如下:

90000354   1        -3.9630E-02 -3.5410E-02 -0.2695      0.4523       2.424      0.5630

现在,我想查找数字 90000354,需要将这些数字 -3.9630E-02、-3.5410E-02 和 -0.2695 复制并粘贴到 Excel 工作表中。现在,我正在使用以下代码,但它给出了问题。请帮助解决此问题。

非常感谢。

Option Explicit

Private Sub CommandButton1_Click()

Dim text As String, MyData As String, strData() As String, myFile As String, textLine As String

Dim v As Variant

Dim numIde As Long, i As Long

myFile = Application.GetOpenFilename("Dat Files (*.dat), *.dat")

Open myFile For Input As #1

MyData = Space$(LOF(1))

Do Until EOF(1)

    Line Input #1, textLine

    MyData = MyData & textLine & vbCrLf

Loop

Close #1

strData() = Split(MyData, vbCrLf)

numIde = 90000354

For i = LBound(strData) To UBound(strData)

    If InStr(1, strData(i), numIde, vbTextCompare) Then

        Cells(2, 2).Value = Mid(numIde, numIde + 20, 11)

        Cells(2, 3).Value = Mid(numIde, numIde + 32, 11)

        Cells(2, 4).Value = Mid(numIde, numIde + 44, 11)

        Exit For
    End If
Next i

结束子

运行代码最终报错如下:

“运行时错误'54':文件模式错误”

在尝试调试时,它在此代码行“Get #1, , MyData”处停止

【问题讨论】:

  • 很好的问题,但是您需要提供有关问题所在的信息,如果您可以更明确地说明您遇到的错误以及何时可以帮助某人回答
  • 感谢您的建议@Gary Evans。运行代码后我忘了添加输出。错误是“运行时错误'54':错误文件模式”。在尝试调试时,它在此代码行“Get #1, , MyData”处停止。

标签: vba excel


【解决方案1】:

Get 用于读取二进制数据,而您要读取文本。使用Line Input

编辑:更新 - 这应该会更好。阅读每一行,然后检查它。不必为split 函数而烦恼,该函数可能会或可能不会识别 vbCRLF,具体取决于操作系统等。

做这样的事情:

私有子命令按钮1_Click()

Dim text As String, MyData As String, strData() As String, myFile As String
Dim numIde As Integer
Dim i As Long

numIde = 90000354
myFile = Application.GetOpenFilename("Dat Files (*.dat), *.dat")

Open myFile For Input As #1

Do Until EOF(1)
    Line Input #1, textline
    If InStr(1, textline, numIde, vbTextCompare) Then
        Cells(2, 2).Value = Mid(textline, numIde + 20, 11)
        Cells(2, 3).Value = Mid(textline, numIde + 32, 11)
        Cells(2, 4).Value = Mid(textline, numIde + 44, 11)
    End If
Loop
Close #1

如果您更喜欢它的完成方式,那么我之前发布的代码有一点问题。它是将每一行文本附加到单个字符串,而不是将其添加为新行,因此 Split() 函数不起作用。此处更新的代码应该可以工作。

Do Until EOF(1)
Line Input #1, text
    MyData = MyData & text & vbCrLf  '<-need to append the vbCRLF
Loop
Close #1
strData = Split(MyData, vbCrLf)

【讨论】:

  • 谢谢。实施修改后,现在没有错误了。但是输出是空白的。请帮忙。
  • 再次感谢@ainwood。我修改了代码,但现在弹出一个新错误,如“运行时错误'9':下标超出范围”。如果尝试调试,它会指出“If”循环(从代码底部开始的第 6 个生命)。请检查。
  • 请使用修改后的代码更新您的帖子。 Instr() 不应给出下标超出范围的错误。我在中间代码中看到了一个错误 - 将“文本”更改为文本行。
  • 我已经更新了代码,请检查。它没有输出。
  • OK - 建议您在以“Cells”开头的行之一上放置一个断点,以证明它正在查找您正在搜索的 numIde。另外:您正在尝试输出到“单元格”,但没有告诉它哪些单元格。使用(例如)Thisworkbook.Sheets(1).Cells(2,2).value 对其进行限定。其次,Mid 函数正在查找 numIde,即 90000354。它通过 Mid(numIde, numIde + 20, 11) 执行此操作,它将搜索字符串 90000354,并返回从字符号 90,000,354 开始的字符。我假设您的意思是mid(strdata(i),len(numIde),11)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多