VBA复制和粘贴仅在激活图纸时有效

VBA复制和粘贴仅在激活图纸时有效,vba,copy-paste,Vba,Copy Paste,我正在复制工作表之间的一些范围,我不知道为什么只有在复制或粘贴工作表之前激活该工作表时才会起作用。这项工作: s.Activate s.Range(Cells(2, 8), Cells(lrow, 8)).Copy d.Activate d.Range(Cells(2, 3), Cells(lrow, 3)).PasteSpecial xlPasteValues 这并不是: s.Range(Cells(2, 8), Cells(lrow, 8)).Copy d.Range(Cells(2, 3

我正在复制工作表之间的一些范围,我不知道为什么只有在复制或粘贴工作表之前激活该工作表时才会起作用。这项工作:

s.Activate
s.Range(Cells(2, 8), Cells(lrow, 8)).Copy
d.Activate
d.Range(Cells(2, 3), Cells(lrow, 3)).PasteSpecial xlPasteValues
这并不是:

s.Range(Cells(2, 8), Cells(lrow, 8)).Copy
d.Range(Cells(2, 3), Cells(lrow, 3)).PasteSpecial xlPasteValues

如果我已经用变量“s”和“d”指定了工作表,为什么VBA需要激活它们?感谢这是因为当
范围(…)
单元格(…)
方法不合格时,它们会在活动工作表上操作

s、 激活

s、 范围(单元格(2,8),单元格(lrow,8))。复制

如果
s
不是活动工作表,则您将从
s
请求一个不属于该工作表的单元格范围,而是另一个活动工作表的单元格范围。因为

       Cells(2, 8)     <==>   ActiveSheet.Cells(2, 8) 
       Cells(lrow, 8)  <==>   ActiveSheet.Cells(lrow, 8) 

这是正确的做法,;每当你发现自己在使用
激活
选择
之类的东西时,要明白你很可能做错了什么。在良好的实践中,您几乎不需要使用这些内容。

您需要限定所有范围对象:
s.range(s.Cells(2,8),s.Cells(lrow,8))。复制
也作为注释,跳过剪贴板并直接指定值<代码>d.Range(d.Cells(2,3),d.Cells(lrow,3))。值=s.Range(s.Cells(2,8),s.Cells(lrow,8))。值。这真的很有帮助!令人惊叹的。我以前遇到过这个问题,但不知道为什么。谢谢
 s.Range(s.Cells(2, 8), s.Cells(lrow, 8)).Copy