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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:32:25