Excel VBA运行时错误438:跨工作表复制粘贴值至指定位置求助
解决VBA运行时错误438:对象不支持该属性或方法
错误根源
你触发438错误的直接原因是代码里这行的写法错误:
Sheets("Recharges Template").Cells(Rows.Count, "D").End(xlUp).Offset(1). _ Selection.PasteSpecial ...
Cells(...).Offset(1)返回的是一个Range对象,但它没有Selection属性,硬加这个属性就会报“对象不支持该属性或方法”的错误。
另外原代码里一堆Select操作完全没必要,既拖慢运行速度,还容易因为选中状态变化出问题。
修正后的代码
下面是能实现你需求的正确代码:把「1.4 Non Standard Changes」里A-K列(从A17开始)的数据复制成硬值,粘贴到「Recharges Template」中D列下一个空行的C列起始位置:
Sub NonStandardChangesMacro() Dim sourceSheet As Worksheet Dim targetSheet As Worksheet Dim sourceRange As Range Dim targetStartCell As Range ' 直接绑定工作表,不用反复切换选中状态 Set sourceSheet = ThisWorkbook.Sheets("1.4 Non Standard Changes") Set targetSheet = ThisWorkbook.Sheets("Recharges Template") ' 动态获取源数据范围:A17到K列最后一行有内容的行 With sourceSheet Set sourceRange = .Range("A17:K" & .Cells(.Rows.Count, "A").End(xlUp).Row) End With ' 定位目标起始单元格:D列最后一行非空行的下一行,再左移1列到C列 Set targetStartCell = targetSheet.Cells(targetSheet.Rows.Count, "D").End(xlUp).Offset(1, -1) ' 复制并粘贴为硬值 sourceRange.Copy targetStartCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub
几个关键改进
- 删掉了所有
Select操作,直接通过对象引用操作单元格,稳定性和效率都更高 - 动态计算源数据的最后一行,不会把大量空行也复制过去
- 用
Offset(1, -1)精准定位到C列的目标起始位置,满足你“从C列开始粘贴、覆盖D列原有数据”的需求 - 保留
xlPasteValues确保粘贴的是硬值,不带公式或格式
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

