Excel VBA复制动态范围宏运行时出现Out of memory问题求助
解决Excel VBA宏“内存不足”问题
原宏出现内存不足的核心原因是依赖Copy/PasteSpecial通过剪贴板传递数据,数据量较大时会占用过多内存;另外不必要的Activate和Select操作也会额外消耗系统资源。以下是优化后的代码,可彻底解决该问题:
Sub CopyPaste() Dim lRow As Long Dim sourceSht As Worksheet Dim newWB As Workbook Dim newSht As Worksheet ' 引用源工作表 Set sourceSht = ThisWorkbook.Sheets("SQL") ' 获取数据最后一行(以B列为准) lRow = sourceSht.Cells(sourceSht.Rows.Count, 2).End(xlUp).Row ' 创建新工作簿并引用其工作表 Set newWB = Workbooks.Add Set newSht = newWB.Sheets(1) ' 直接将源数据的值传递到新工作表,无需剪贴板 newSht.Range("A1:Q" & lRow).Value = sourceSht.Range("A1:Q" & lRow).Value ' 自动调整列宽 newSht.Columns("A:Q").EntireColumn.AutoFit ' 设置所有单元格居中对齐 newSht.Range("A1:Q" & lRow).HorizontalAlignment = xlCenter End Sub
关键优化点:
- 移除剪贴板依赖:直接通过单元格值赋值传递数据,完全避免剪贴板的内存占用,处理大量数据时优势明显
- 取消冗余操作:删掉
Activate和Select,减少不必要的资源调用,同时避免窗口焦点变化引发的潜在问题 - 显式对象引用:明确引用源工作簿、新工作簿及工作表,避免隐式引用导致的错误和资源浪费
- 批量设置格式:一次性为目标数据区域设置居中对齐,比逐个单元格操作更高效
内容的提问来源于stack exchange,提问作者Josu
相关产品推荐
相关产品推荐

