复制/粘贴值而不更改活动工作簿/工作表

问题描述 投票:0回答: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’的方法‘范围’失败”

换掉不与代码一起工作的部分(已注释掉)会导致:

  • Excel 在每张工作表中闪烁(如果数据分布在 wbSource 中的几张工作表上)
  • 如果用户执行更改活动工作表的输入,宏可能会中断(复制/粘贴错误的值)。

换出

wsSource.Range(Cells(1, 1), Cells(2, 2)).Copy

wsSource.Range("A1:B2").Copy

有效,但我需要动态更改行和列。

我试图不在活动工作簿之间交替,因此我不依赖于当前活动的工作簿/工作表(选定的窗口)。

最终我试图避免;用户在宏运行时单击任何会更改活动工作簿/工作表的内容并打乱顺序。

excel vba copy range cell
1个回答
0
投票

当通过 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
© www.soinside.com 2019 - 2024. All rights reserved.