使用二进制访问读取从 .dat 文件中提取所有数据(应用程序定义错误 1004)
Extracting all data from a .dat file using Binary Access Read (Application Defined error 1004)
块引用
有一些 .dat 格式的文件,这些文件包含一些有价值的信息,但是它们可能非常大,尝试在记事本中打开每个文件并提取我需要的信息根本没有效率,因为它需要记事本很长一段时间打开每个文件。我遇到过这个 Binary Access Read 函数,它显然可以打开大文件并允许您非常快速地阅读它们。
Sub ReadEntireFileAndPlaceOnWorksheet()
Dim X As Long, FileNum As Long, TotalFile As String, FileName As String, Result As Variant, Lines() As String, rng As Range, i As Long, used As Range, MyFolder As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Show
MyFolder = .SelectedItems(1)
End With
FileName = Dir(MyFolder & "\*.*")
Do While FileName <> ""
FileName = Dir()
FileNum = FreeFile
Open FileName For Binary As #FileNum
TotalFile = Space(LOF(FileNum))
Get #FileNum, , TotalFile
Close #FileNum
Lines = Split(TotalFile, vbNewLine)
ReDim Result(1 To UBound(Lines) + 1, 1 To 1)
For X = 1 To UBound(Result)
Result(X, 1) = "'" & Lines(X - 1)
Next
Set used = Sheet1.Cells(1, Sheet1.Columns.Count).End(xlToLeft).Columns
Set rng = used.Offset(0, 1)
rng.Resize(UBound(Result)) = Result
Loop
End Sub
。问题基本上是我想要的一切,所以它可以到此为止,但如果这种情况继续发生,它不是很实用,有什么解决方案的想法吗?
脚本的结果是这样的:
MDF 3.00 TGT 15.0
Time: 04:47:24 PM
Pre-trigger Time: 20[s]
Recording Duration: 00:01:39
Database: dpdtoolp
Experiment: __140910_RB
Workspace: 13
Devices: ETKC:1,THMM(25362),THMM(25361),ADMM(448),CalcDev
Program Description: Module_ivupd2
WP: _AWD_1
RP: _AWD
§@
98 okt
Data: 14E410_299
PU Off
=
E1æ?b¡ClYDZ0C
Eä>
?CÛêB
?C
"CÝåÆB
×#<س½C`C”¯„D-+@‰<ÕCs•D.ÄB)—>"
好的,在 运行 一些测试之后,我很确定问题在于您的文件中有一行被解释为公式,并且该公式无效(错误的语法或其他错误)。
我会修改你的代码如下:
For X = 1 To UBound(Result)
Result(X, 1) = "'" & Lines(X - 1)
Next
注意单引号。
单引号会强制 Excel 将该行视为文本,而不是公式。
另一种可能更快的方法是在写入数组之前将目标范围格式化为文本。 .numberformat = "@"
您可能还遇到单元格中字符过多的单独问题,但这很容易更正。
块引用
有一些 .dat 格式的文件,这些文件包含一些有价值的信息,但是它们可能非常大,尝试在记事本中打开每个文件并提取我需要的信息根本没有效率,因为它需要记事本很长一段时间打开每个文件。我遇到过这个 Binary Access Read 函数,它显然可以打开大文件并允许您非常快速地阅读它们。
Sub ReadEntireFileAndPlaceOnWorksheet()
Dim X As Long, FileNum As Long, TotalFile As String, FileName As String, Result As Variant, Lines() As String, rng As Range, i As Long, used As Range, MyFolder As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Show
MyFolder = .SelectedItems(1)
End With
FileName = Dir(MyFolder & "\*.*")
Do While FileName <> ""
FileName = Dir()
FileNum = FreeFile
Open FileName For Binary As #FileNum
TotalFile = Space(LOF(FileNum))
Get #FileNum, , TotalFile
Close #FileNum
Lines = Split(TotalFile, vbNewLine)
ReDim Result(1 To UBound(Lines) + 1, 1 To 1)
For X = 1 To UBound(Result)
Result(X, 1) = "'" & Lines(X - 1)
Next
Set used = Sheet1.Cells(1, Sheet1.Columns.Count).End(xlToLeft).Columns
Set rng = used.Offset(0, 1)
rng.Resize(UBound(Result)) = Result
Loop
End Sub
。问题基本上是我想要的一切,所以它可以到此为止,但如果这种情况继续发生,它不是很实用,有什么解决方案的想法吗?
脚本的结果是这样的:
MDF 3.00 TGT 15.0
Time: 04:47:24 PM
Pre-trigger Time: 20[s]
Recording Duration: 00:01:39
Database: dpdtoolp
Experiment: __140910_RB
Workspace: 13
Devices: ETKC:1,THMM(25362),THMM(25361),ADMM(448),CalcDev
Program Description: Module_ivupd2
WP: _AWD_1
RP: _AWD
§@
98 okt
Data: 14E410_299
PU Off
=
E1æ?b¡ClYDZ0C
Eä>
?CÛêB
?C
"CÝåÆB
×#<س½C`C”¯„D-+@‰<ÕCs•D.ÄB)—>"
好的,在 运行 一些测试之后,我很确定问题在于您的文件中有一行被解释为公式,并且该公式无效(错误的语法或其他错误)。
我会修改你的代码如下:
For X = 1 To UBound(Result)
Result(X, 1) = "'" & Lines(X - 1)
Next
注意单引号。
单引号会强制 Excel 将该行视为文本,而不是公式。
另一种可能更快的方法是在写入数组之前将目标范围格式化为文本。 .numberformat = "@"
您可能还遇到单元格中字符过多的单独问题,但这很容易更正。