VBA中Open For Random语句搭配动态数组报内存不足错误的原因是什么?
问题原因分析
VB/VBA 的随机文件访问模式下,Get 语句设计上要求接收读取内容的变量为编译期可确定长度的固定长度类型:
- 你最初使用的固定长度字节数组,内存大小在声明时就已经确定,
Get可以直接识别长度,匹配Open语句指定的Len参数将数据写入内存,因此运行正常。 - 动态字节数组属于运行时才分配内存的可变长度类型,变量本身存储的是指向数组内存区的指针,而非直接存储数组内容。
Get语句在随机模式下无法识别动态数组运行时ReDim分配的实际长度,会错误地尝试读取不符合预期长度的数据甚至非法分配内存,最终触发「内存不足」的运行时错误,和设备实际剩余内存无关。
解决方法
推荐改用更灵活的二进制访问模式实现需求,二进制模式的Get语句原生支持动态字节数组作为接收变量,同时可以完全兼容原有的按记录读取的逻辑:
Dim rec_len As Long: rec_len = 4 ' 自定义记录长度 Dim rec_position As Long: rec_position = 23 ' 目标记录号 Dim buff() As Byte ReDim buff(0 To rec_len - 1) ' 改用二进制模式打开文件 Open "C:\MyFile.bin" For Binary Access Read As #file_nr ' 计算目标记录的起始偏移(和原随机模式读取位置完全一致) Dim start_offset As Long: start_offset = (rec_position - 1) * rec_len + 1 ' 直接读取数据到动态数组 Get #file_nr, start_offset, buff Close #file_nr
如果确实需要保留随机访问模式,可以将接收变量改为对应长度的定长字符串,读取后再转为字节数组即可,但定长字符串的长度要求为常量,灵活性不如二进制模式方案。
内容的提问来源于stack exchange,提问作者Guille
相关产品推荐
相关产品推荐

