You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel for Mac 365 VBA运行时错误7(内存不足)求助

解决VBA运行时错误7(内存不足)的方案

关键问题排查与修复

1. 修复行号变量的类型溢出问题

代码中用Integer类型定义lRow、lRowP、lCol、lColP,但Excel最大行数为1048576,远超Integer的上限(32767)。当数据行数超过32767时,变量会溢出,导致后续计算的范围错误,进而触发“内存不足”的假象。

修复代码:
将所有行/列数的变量类型从Integer改为Long:

Dim lRow As Long
Dim lCol As Long
Dim lRowP As Long
Dim lColP As Long

2. 明确限定Range/Cells的父对象

未限定父对象的Range和Cells可能引用错误的工作表(比如当前激活的工作表并非预期目标),导致读取的范围远大于实际数据,占用过多内存。

修复示例:
打开外部工作簿后,用SRC.Worksheets("Sheet1")明确限定操作范围,避免依赖Activate:

Set SRC = Workbooks.Open(Vecnames(1, 5) & Vecnames(2, 1), 0, True, True)
With SRC.Worksheets("Sheet1")
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    lCol = .Cells(lRow, .Columns.Count).End(xlToLeft).Column
    Set rng = .Range(.Cells(2, 1), .Cells(lRow, lCol))
End With
MyDB = rng
SRC.Close False

同理处理第二个外部文件的读取逻辑。

3. 移除低效的Select/Selection操作

Select和Selection会额外占用内存,且容易引发上下文错误。直接操作目标范围即可:
替换原有代码:

Range(Cells(2, 11), Cells(lRow, 11)).Select
Selection.TextToColumns Destination:=Range(Cells(2, 11), Cells(lRow, 11)), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
Selection.NumberFormat = "dd/mm/yyyy;@"

改为:

With ThisWorkbook.Worksheets("Sheet1").Range(Cells(2, 11), Cells(lRow, 11))
    .TextToColumns Destination:=.Cells, DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 4), TrailingMinusNumbers:=True
    .NumberFormat = "dd/mm/yyyy;@"
End With

4. 及时释放对象内存

关闭外部工作簿后,将对象设置为Nothing,彻底释放占用的内存:

SRC.Close False
Set SRC = Nothing

完整修复后的代码示例

Sub ARMABASES()
'
' ARMABASES Macro
' Arma la base de inventario y producción de fianzas
'
' Acceso directo: Ctrl+Mayús+A
'

Dim MyDB As Variant
Dim MyDBP As Variant
Dim Vecnames(1 To 10, 1 To 5) As String
Dim SRC As Workbook
Dim rng As Range
Dim lRow As Long
Dim lCol As Long
Dim lRowP As Long
Dim lColP As Long

'读取配置参数
With ThisWorkbook.Worksheets("DATOS")
    Vecnames(1, 1) = .Range("B5").Value
    Vecnames(1, 2) = .Range("B6").Value
    Vecnames(1, 3) = .Range("B7").Value
    Vecnames(1, 4) = .Range("B8").Value
    Vecnames(1, 5) = .Range("B9").Value
    Vecnames(2, 1) = .Range("B10").Value
    Vecnames(2, 2) = .Range("B11").Value
    Vecnames(3, 2) = .Range("B12").Value
End With

'处理第一个外部文件
Set SRC = Workbooks.Open(Vecnames(1, 5) & Vecnames(2, 1), 0, True, True)
With SRC.Worksheets("Sheet1")
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    lCol = .Cells(lRow, .Columns.Count).End(xlToLeft).Column
    Set rng = .Range(.Cells(2, 1), .Cells(lRow, lCol))
End With
MyDB = rng
SRC.Close False
Set SRC = Nothing

'写入数据并处理日期列
With ThisWorkbook.Worksheets("Sheet1")
    .Range(.Cells(2, 1), .Cells(lRow, lCol)).Value = MyDB
    With .Range(.Cells(2, 11), .Cells(lRow, 11))
        .TextToColumns Destination:=.Cells, DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
                :=Array(1, 4), TrailingMinusNumbers:=True
        .NumberFormat = "dd/mm/yyyy;@"
    End With
End With

Erase MyDB

'处理第二个外部文件
Set SRC = Workbooks.Open(Vecnames(1, 5) & Vecnames(2, 2), 0, True, True)
With SRC.Worksheets("Sheet1")
    lRowP = .Range("A" & .Rows.Count).End(xlUp).Row
    lColP = .Cells(lRowP, .Columns.Count).End(xlToLeft).Column
    MyDBP = .Range(.Cells(2, 1), .Cells(lRowP, lColP)).Value
End With
SRC.Close False
Set SRC = Nothing

'写入第二个文件的数据
With ThisWorkbook.Worksheets("Hoja1")
    .Range(.Cells(2, 1), .Cells(lRowP, lColP)).Value = MyDBP
End With

Erase MyDBP

End Sub

内容的提问来源于stack exchange,提问作者Jose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:55:32