两部分问题
1. 为什么这不起作用? 我可以通过先激活工作表来复制单元格,但是我不应该能够在不激活工作表的情况下复制它吗?
Sub test()
Dim wbSource, wbTarget As Workbook
Dim wsSource As Worksheet
Set wbSource = ThisWorkbook
Set wsSource = wbSource.Worksheets(1)
Set wbTarget = Workbooks.Add
Set wsTarget = wbTarget.Worksheets(1)
'Doesnt work
wsSource.Range(Cells(1, 1), Cells(2, 2)).Copy
'Works
'wsSource.Activate
'Range(Cells(1, 1), Cells(2, 2)).Copy
wsTarget.Cells(1, 1).PasteSpecial
End Sub
我得到的错误是: “运行时错误‘1004’:” “对象‘_Worksheet’的方法‘Range’失败”
换掉不与代码一起工作的部分(已注释掉)会导致 Excel 在每个工作表中闪烁(如果数据分布在 wbSource 中的多个工作表上),并且如果用户执行更改活动工作表的输入,宏可能会中断(复制/粘贴错误的值)。
2. 我想做的是不需要在活动工作簿之间交替,所以我不依赖于当前活动的工作簿/工作表(选定的窗口)。 最终,我试图避免的是,如果用户单击任何内容,并在宏运行时更改活动工作簿/工作表并弄乱顺序。
当通过 Cells 对象定义 Range 时,它们也必须像编辑的代码中那样进行限定
Sub test()
Dim wbSource, wbTarget As Workbook
Dim wsSource As Worksheet
Set wbSource = ThisWorkbook
Set wsSource = wbSource.Worksheets(1)
Set wbTarget = Workbooks.Add
Set wsTarget = wbTarget.Worksheets(1)
'Doesnt work 'edited
wsSource.Range(wsSource.Cells(1, 1), wsSource.Cells(2, 2)).Copy
'Works
'wsSource.Activate
'Range(Cells(1, 1), Cells(2, 2)).Copy
wsTarget.Cells(1, 1).PasteSpecial
End Sub