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

VBA复制多列时出现Range Memory Overflow问题求助

问题原因与解决方案

你的宏报错并非剪贴板内存问题,而是Range地址字符串长度超出了VBA的限制。当拼接的列范围地址过长(超过约255字符),VBA无法解析这个长字符串,导致运行错误。另外原代码存在小语法错误:Dim sourceWs1, dstWsDiff1, As Worksheet里的多余逗号会让前两个变量被声明为Variant类型,而非Worksheet,需要修正。

以下是两种可行的解决方案:

方案一:使用Union合并区域(保留完整复制内容)

通过Union方法逐个合并需要复制的列区域,避免生成过长的地址字符串,同时保留复制格式、公式等完整内容的能力:

Sub CopyValuesDiff()
    Dim sourceWs1 As Worksheet, dstWsDiff1 As Worksheet
    Dim dtToday As String
    Dim copyRange As Range
    
    dtToday = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")
    Set sourceWs1 = Sheets("Size_1")
    Set dstWsDiff1 = Sheets("Diff_1")
    
    ' 初始化并逐个添加要复制的列区域到Union集合
    Set copyRange = sourceWs1.Range("H6:H300")
    Set copyRange = Union(copyRange, sourceWs1.Range("J6:J300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("L6:L300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("N6:N300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("AF6:AF300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("AH6:AH300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("AJ6:AJ300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("AL6:AL300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("BD6:BD300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("BF6:BF300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("BH6:BH300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("BJ6:BJ300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("CB6:CB300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("CD6:CD300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("CF6:CF300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("CH6:CH300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("CZ6:CZ300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("DB6:DB300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("DD6:DD300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("DF6:DF300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("DX6:DX300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("DZ6:DZ300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("EB6:EB300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("ED6:ED300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("EV6:EV300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("EX6:EX300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("EZ6:EZ300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("FB6:FB300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("FT6:FT300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("FV6:FV300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("FX6:FX300"))
    Set copyRange = Union(copyRange, sourceWs1.Range("FZ6:FZ300"))
    
    copyRange.Copy Destination:=dstWsDiff1.Range("B2")
    
    dstWsDiff1.Range("A3").Value = dtToday
    Application.CutCopyMode = False
End Sub

方案二:直接赋值(仅复制值,效率更高)

如果只需要复制单元格的值(不需要格式、公式等),可以跳过剪贴板直接赋值,这种方法不仅避免地址长度问题,还能提升运行效率:

Sub CopyValuesDiff()
    Dim sourceWs1 As Worksheet, dstWsDiff1 As Worksheet
    Dim dtToday As String
    Dim colList As Variant
    Dim i As Integer
    Dim srcCol As Range, dstCol As Range
    
    dtToday = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")
    Set sourceWs1 = Sheets("Size_1")
    Set dstWsDiff1 = Sheets("Diff_1")
    
    ' 存储需要复制的列名数组
    colList = Array("H", "J", "L", "N", "AF", "AH", "AJ", "AL", _
                    "BD", "BF", "BH", "BJ", "CB", "CD", "CF", "CH", _
                    "CZ", "DB", "DD", "DF", "DX", "DZ", "EB", "ED", _
                    "EV", "EX", "EZ", "FB", "FT", "FV", "FX", "FZ")
    
    ' 循环逐个列复制值
    For i = LBound(colList) To UBound(colList)
        Set srcCol = sourceWs1.Range(colList(i) & "6:" & colList(i) & "300")
        ' 目标列从B开始,对应数组索引依次往后
        Set dstCol = dstWsDiff1.Range(Chr(66 + i) & "2:" & Chr(66 + i) & "296")
        dstCol.Value = srcCol.Value
    Next i
    
    dstWsDiff1.Range("A3").Value = dtToday
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:07:04