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
关键改动说明
- 给
Range和Cells加上工作表限定,避免因当前活动工作表切换导致的引用错误 - 替换原
Copy Destination逻辑为仅复制值的操作:- 方法一用
PasteSpecial xlPasteValues指定仅粘贴值 - 方法二直接通过
.Value属性赋值,跳过剪贴板操作
- 方法一用
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

