VBA 只有激活 sheet 才能复制和粘贴

VBA copy and paste only work if I activate the sheet

我正在复制 sheet 之间的一些范围,我不知道为什么只有在我复制或粘贴它们之前激活 sheet 时它才有效。这有效:

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

为什么 VBA 需要激活 sheet,如果我已经用变量 "s" 和 "d" 指定了它们?谢谢

那是因为当Range(...)Cells(...)方法没有限定时,他们操作在Active Worksheet.

s.Activate

s.Range(Cells(2, 8), Cells(lrow, 8)).Copy

如果 s 不是活动的 sheet,您将从 s 请求一系列不属于它但属于另一个的单元格,活跃工作sheet。因为

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

为避免此麻烦,始终限定您的范围和单元格:

 s.Range(s.Cells(2, 8), s.Cells(lrow, 8)).Copy

这是正确的做法;每当您发现自己使用 ActivateSelect 之类的东西时,请理解您很可能做错了什么。在良好的实践中,您几乎永远不需要使用这些东西。