VBA LoadFromFile在大文件上崩溃



我尝试在VBA中加载(真正)大文件的块:

Set dataStream = CreateObject("ADODB.Stream")
dataStream.Type = adTypeBinary
dataStream.Open
dataStream.LoadFromFile localDirectory & "" & objFile.Name
byteBuffer = dataStream.Read(bufferSize)

如果我理解正确的话,在给定时间内唯一需要的内存量是bufferSize。然而,访问在LoadFromFile语句时崩溃。

是否有一个更强大的方式来读取大块从大文件在VBA比ADODB.Stream?

我已经尝试了如何从MS Word插件(VBA)传输大文件到Web服务器?(但这在处理大文件时也有问题。Get异常失败,错误63)。

我是这样解决的

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(localDirectory)
Set sourceFile = objFSO.OpenTextFile(localDirectory & "" & objFile.Name)
strChunk = sourceFile.Read(bufferSize)

,然后将字符串转换为字节数组:

Function StringToByteArray(str As String) As Byte()
Dim i As Long
Dim b() As Byte
ReDim b(Len(str) - 1) As Byte
For i = 1 To Len(str)
b(i - 1) = Asc(Mid(str, i, 1))
Next i
StringToByteArray = b
End Function

通常的StrConv方法不能正常工作!因此方法。

命令数据流。LoadFromFile尝试将整个文件装入RAM。你可以通过任务管理器自己检查。简单的方法提供更多的机会,所以我建议它更简单。下面是我应用于一个50GB文件的代码——我的计算机没有遇到任何问题,除了处理这样一个文件会花费很多时间。但是不会冻结,而且这个过程可以按照你的喜好来控制。

Dim fname As String
Dim fNo As Integer
Const bufferSize = 1024
Dim nextBytes(bufferSize) As Byte
Dim offset As Variant
fname = "C:PathBinaryFile.vdi"
fNo = FreeFile()
Open fname For Binary Access Read As #fNo
offset = 1
Do
Get #fNo, offset, nextBytes
offset = offset + bufferSize
' Do Something
If EOF(fNo) Then Exit Do
Loop
Close #fNo

最新更新