我有一个 Excel 工作簿,里面有一个宏,它几乎可以完成我想要的所有操作。这个宏从一个选项卡上的某个范围复制数据,然后将不同的值粘贴到另一个选项卡上。
我需要帮助的是将宏更改为粘贴为值。复制的数据是公式,格式与目标不同。
下面的宏基于一个加里的学生很好心地创建了这个链接来回答这个问题: 宏将不同的值从一个 Excel 表复制到另一个 Excel 表
Sub Update()
Dim s1 As Worksheet, s2 As Worksheet
Set s1 = Sheets("Copy Tab")
Set s2 = Sheets("Paste Tab")
s1.Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Copy s2.Range("A9")
s2.Range("A8:A" & Cells(Rows.Count, "A").End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
答案1
更改复制行:
s1.Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Copy s2.Range("A9")
为了使价值观相等:
s2.Range("A9").Resize(s1.Cells(s1.Rows.Count, "B").End(xlUp).Row-1).Value = s1.Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Value
现在我们避免使用剪贴板,只移动值。
答案2
您要做的就是录制一个新宏,然后手动执行一次操作,停止录制并查看录制的新宏。它会告诉您确切要使用的代码。
我为什么要告诉你上述内容?它将帮助您成为一名优秀的 VBA 开发人员,而无需在整个互联网上搜索每一点代码。
如果您执行上述操作,您将看到获得以下宏:
Range("A8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
所以你的代码变成:
Sub Update()
Dim s1 As Worksheet, s2 As Worksheet
Set s1 = Sheets("Copy Tab")
Set s2 = Sheets("Paste Tab")
s1.Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Copy s2.Range("A9")
s2.Range("A8:A" & Cells(Rows.Count, "A").End(xlUp).Row).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
答案3
不确定我是否遗漏了什么,但它看起来很简单。
如果您拆分复制行并使用 PasteSpecial,我不明白为什么它不起作用。
s1.Range("B2:B" & .Cells(Rows.Count, "B").End(xlUp).Row).Copy s2.Range("A9")
变成
s1.Range("B2:B" & s1.Cells(Rows.Count, "B").End(xlUp).Row).Copy
s2.Range("A9").PasteSpecial xlPasteValues
这基本上与 Scott Craner 的答案相同,但使用了剪切副本。
如果您将他的答案修改为:
Sub Update()
Dim s1 As Worksheet, s2 As Worksheet
Set s1 = Sheets("Copy Tab")
Set s2 = Sheets("Paste Tab")
s2.Range("A9").Resize(s1.Cells(s1.Rows.Count, "B").End(xlUp).Row - 1).Value = s1.Range("B2:B" & s1.Cells(Rows.Count, "B").End(xlUp).Row).Value
s2.Range("A8:A40").RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
是不是效果更好呢?