循环浏览列并复制不断变化的单元格范围,而不激活工作表



我正试图复制一系列在循环中发生变化的单元格。然后将该区域粘贴到另一个工作簿中。我不想每次都激活工作表和工作簿。我的代码现在看起来像这个

For i = 1 to 5
Dim Frontiere As Workbook
Set Frontiere = Workbooks("Frontiere.xlsx")
Dim Summary as Workbook
Set Summary = Workbooks("Summary.xlsx")

Dim Variables As Worksheet
Set Variables = Frontiere.Worksheets("Variables")
Dim Scenarios as Worksheet
Set Scenarios = Summary.Worksheets("Scenarios")
' Copy new variable
Scenarios.Range(Cells(7, i), Cells(57, i + 1)).Copy
Variables.Cells(6, 12).PasteSpecial Paste:=xlPasteValues
Next i

当我尝试此操作时,我会收到错误消息";对象'_Worksheet'的方法'Range'失败,来自行";场景。范围(单元格(7,i(,单元格(57,i+1((;

我真的不想每次都激活工作表,因为我有大约20个其他区域可以为每个循环复制和粘贴。

感谢

您可以在一行中声明工作簿和工作表,以帮助稍微清理一下。如果您需要引用工作簿属性,则此快捷方式可能不值得。你还应该避免在循环中做任何只需要做一次的事情(即不需要连续地Dim你的工作表变量,然后Set它们到每个循环中的同一张表(

我将工作表名称变量调整得更短一些,这样引用就不会占用那么多空间。您也可以只使用With块。

你的主要问题是不合格的对象——当处理许多工作簿时尤其如此;床单。为了避免活动的工作表/书籍对代码产生任何影响,您应该确保所有对象都是合格的。也就是说,所有的工作表都有一个工作簿。所有范围&单元格对象是用工作表限定的。您的问题可能是.Copy行中不合格的两个Cells实例。

Sub Try()
Dim wsV As Worksheet: Set wsV = Workbooks("Frontiere.xlsx").Sheets("Variables")
Dim wsS As Worksheet: Set wsS = Workbooks("Summary.xlsx").Sheets("Scenarios")
Dim i As Long
For i = 1 To 5
wsS.Range(wsS.Cells(7, i), wsS.Cells(57, i + 2)).Copy
wsV.Cells(6, 12).PasteSpecial xlPasteValues
Next i
End Sub

有关不合格Cells错误的更多详细信息,请参阅此解决方案。简而言之,您的Cells指向存在代码的工作表,或者如果您的代码在模块或"ThisWorkbook"中,则指向活动工作表。这听起来都不是正确的工作表,因此,要在工作表未激活的情况下进行复制,必须完全限定对象。

您可以简单地这样做以避免使用剪贴板:

wsV.Cells(6, 12).Value = Scenarios.Range(Cells(7, i), Cells(57, i + 1)).Value

最新更新