使用VBA复制工作表时如何仅复制值而非公式?
解决VBA复制工作表仅保留值的问题
这问题我之前处理过好几次,直接用Copy方法复制工作表确实会连带公式一起过去,要是源公式引用的单元格不在新工作簿里,自然就会出现空值或者#REF!错误。给你几个实用的解决方案,按需选就行:
方法1:复制后一键转值(最简单高效)
先完成工作表复制,再把整个工作表的已用区域直接替换为计算后的值,格式也会完整保留:
' 复制源工作表到新工作簿的最后位置 shtSummary.Copy after:=wbNew.Sheets(wbNew.Sheets.Count) ' 获取刚复制好的目标工作表 Dim targetSht As Worksheet Set targetSht = wbNew.Sheets(wbNew.Sheets.Count) ' 将公式替换为计算后的值 targetSht.UsedRange.Value = targetSht.UsedRange.Value
这种方法代码少,执行速度快,适合需要完整保留工作表结构(比如合并单元格、列宽行高)的场景。
方法2:选择性粘贴值和格式(灵活可控)
如果不需要复制工作表的宏、控件等额外元素,只想要值和基础格式,可以新建工作表后用PasteSpecial精准控制:
' 在新工作簿新建一张空白工作表 Dim targetSht As Worksheet Set targetSht = wbNew.Sheets.Add(After:=wbNew.Sheets(wbNew.Sheets.Count)) ' 复制源工作表的已用区域 shtSummary.UsedRange.Copy ' 粘贴值和数字格式 targetSht.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' 粘贴单元格格式(比如背景色、字体样式) targetSht.Range("A1").PasteSpecial Paste:=xlPasteFormats ' 取消复制状态,避免Excel一直显示剪贴板提示 Application.CutCopyMode = False ' 给新工作表改个和源表一样的名字(可选) targetSht.Name = shtSummary.Name
要是还需要保留条件格式,再加一行targetSht.Range("A1").PasteSpecial Paste:=xlPasteConditionalFormats就行,自由度很高。
方法3:复制后用粘贴值覆盖(传统方式)
和方法1逻辑类似,只是用Copy+PasteSpecial的方式实现,效果完全一致:
shtSummary.Copy after:=wbNew.Sheets(wbNew.Sheets.Count) With wbNew.Sheets(wbNew.Sheets.Count) .UsedRange.Copy .UsedRange.PasteSpecial xlPasteValues Application.CutCopyMode = False End With
这种写法更直观,适合习惯用粘贴操作的开发者。
小提示
- 如果源工作表有隐藏行/列,以上方法都会保留这些隐藏状态;
- 执行代码前建议加上
Application.ScreenUpdating = False,完成后再设为True,能大幅提升运行速度,避免屏幕闪烁。
内容的提问来源于stack exchange,提问作者Ahmed Afifi
相关产品推荐
相关产品推荐

