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

Excel VBA技术问询:如何复制单元格显示值而非底层公式?

修改VBA代码实现仅复制单元格显示值

原代码使用Copy方法会默认复制单元格的公式、格式等内容,要实现仅复制显示值,可通过以下两种方式修改:

方法一:使用PasteSpecial粘贴值

这种方式保留复制操作的基础逻辑,通过粘贴时指定仅复制值:

Sub SaveData()
    Dim i As Long
    Dim lastrow As Long
    Dim erow As Long
    lastrow = Sheets("Invoice").Range("A" & Rows.Count).End(xlUp).Row
    For i = 7 To lastrow
        erow = Sheets("Sale_Register").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
        ' 指定源工作表复制区域,避免活动工作表切换导致的错误
        Sheets("Invoice").Range(Sheets("Invoice").Cells(i, 1), Sheets("Invoice").Cells(i, 3)).Copy
        ' 仅粘贴值到目标位置
        Sheets("Sale_Register").Cells(erow, 1).PasteSpecial xlPasteValues
        ' 清除剪贴板状态,避免后续操作受影响
        Application.CutCopyMode = False
    Next i
    
    MsgBox "Data Saved Successfully", vbOKOnly + vbInformation, "Alert"
End Sub

方法二:直接赋值(推荐)

这种方式跳过剪贴板,直接将源单元格的值赋值给目标单元格,运行效率更高,尤其适合数据量较大的场景:

Sub SaveData()
    Dim i As Long
    Dim lastrow As Long
    Dim erow As Long
    Dim sourceWs As Worksheet
    Dim targetWs As Worksheet
    
    ' 定义工作表对象,简化代码同时避免活动工作表依赖
    Set sourceWs = ThisWorkbook.Sheets("Invoice")
    Set targetWs = ThisWorkbook.Sheets("Sale_Register")
    
    lastrow = sourceWs.Range("A" & sourceWs.Rows.Count).End(xlUp).Row
    For i = 7 To lastrow
        erow = targetWs.Range("A" & targetWs.Rows.Count).End(xlUp).Offset(1, 0).Row
        ' 直接赋值源区域的值到目标区域
        targetWs.Range(targetWs.Cells(erow, 1), targetWs.Cells(erow, 3)).Value = _
            sourceWs.Range(sourceWs.Cells(i, 1), sourceWs.Cells(i, 3)).Value
    Next i
    
    MsgBox "Data Saved Successfully", vbOKOnly + vbInformation, "Alert"
End Sub

关键改动说明

  1. 给Range和Cells加上工作表限定,避免因当前活动工作表切换导致的引用错误
  2. 替换原Copy Destination逻辑为仅复制值的操作:
    • 方法一用PasteSpecial xlPasteValues指定仅粘贴值
    • 方法二直接通过.Value属性赋值,跳过剪贴板操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:57:22