【问题标题】:VBA Write Very large stringVBA写入非常大的字符串
【发布时间】:2019-07-02 18:46:56
【问题描述】:

所以我有一个很大的 vba 字符串,我试图将其作为二进制文件写入文件。我有一个非常漂亮的功能。我有一个很长的字符串,可以说大约 80k。该字符串正确地从文件中读取,正确地传递函数,正确地打印到屏幕上。但无论我做什么,以任何形式或形式,我都可以在文件中获得超过 39k 的内容。我已将字符串拆分为较小的位,认为这是 VBA 限制。然后一次将它传递给我的函数 42 个字符。 Seek(LOF) +1 put 是我在打开 bin 之后所做的,但是......我怎么称呼它似乎并不重要。二进制,ASCI,一次写完。我只得到最后的39k。这是我用来写入文件的函数。据我所知,这是一个内存限制而不是语法错误,并且可能与我的代码形式几乎没有关系,就像我似乎没有得到的东西一样。

sub IBorrowedThis(hex_val as string)

dim output() as string
dim handle as long
output = Split(hex_val, "|")
handle = FreeFile
open "fp" for binary as #handle

For i = LBound(output) to Unbound(output)

seek #handle,LOF(handle) + 1
  put #handle, , cbyte("&H" & output(i))
next i

close #handle

end sub

所以我已经对这一切进行了测试,一切正常。附加到包含的末尾。只是不适用于大文件。

【问题讨论】:

  • Dim i as Long,否则为 Variant 和 Integer。写Ubound 而不是Unbound
  • 我无法使用提供的代码复制它。将i 更改为Long,修复了UBound 中的错字,在单个String 中生成了价值100KB 的管道分隔字节,然后将其传递给您? “IBorrowedThis”程序。这创建了一个预期大小的新文件,当再次运行时,附加没有问题。我怀疑问题出在调用代码中。
  • @Comintern 你删除了他的无礼规则,但我记得其中一条“欢迎举例,不欢迎意见。”。由于他已经“对这一切进行了分段测试”,因此他可能会在其他地方获得更好的帮助。
  • @Asger 我上面的评论不是意见。这是事实。 ;-)
  • 使用Option explicit并编译!

标签: vba binary hex basic


【解决方案1】:

另一种更简单的将二进制字符串写入文件的方法:

SUB WriteBinaryStringToFile (hex_val AS STRING)
    DIM handle AS LONG
    handle = FREEFILE
    OPEN "binary2.tst" FOR BINARY AS #handle
    SEEK #handle, LOF(handle) + 1
    PUT #handle, , hex_val
    CLOSE #handle
END SUB

【讨论】:

    【解决方案2】:

    将二进制字符串写入文件的简单方法:

    SUB WriteBinaryStringToFile (hex_val AS STRING)
        DIM c AS STRING * 1
        DIM I AS LONG
        DIM handle AS LONG
        handle = FREEFILE
        OPEN "fp" FOR BINARY AS #handle
        FOR I = 1 TO LEN(hex_val)
            c = MID$(hex_val, I, 1)
            SEEK #handle, LOF(handle) + 1
            PUT #handle, , c
        NEXT I
        CLOSE #handle
    END SUB
    

    【讨论】:

    • 字符串的最大长度为 2,147,483,647 字节。
    • 如果你不对字符串做任何事情(比如 OP 和 Split,因为他的字符串显然包含 |),那么你可以只用 Put #handle, , hex_val 得到相同的结果!就像微软说的:“Put 写入不是用户定义类型元素的可变长度字符串,没有 2 字节长度描述符。写入的字节数等于字符串中的字符数。”
    • 那么,您是说如果我以二进制文件的形式打开文件,我可以放入整个字符串?
    • 是的,用“1234567890”试试吧:) docs.microsoft.com/de-de/office/vba/language/reference/…
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多