Worksheet.cells有效,workheet.range在工作簿未激活时失败

时间:2016-03-10 20:44:16

标签: vba excel-vba excel-2010 excel

在Excel 2010中,我有以下代码

Private Sub PrintCustExpHeaders(ByRef Report As Worksheet, ByRef StartRow As Integer, ByVal ClinicList As ProcessClinic, ByVal CES As CareExpSettings)

  With Report.Cells(StartRow, CES.CEClinicCol)
    .Value = "Title"
    .Font.Size = 18
  End With
  Report.Range(Cells(StartRow, CES.CEFirstCol), Cells(StartRow, CES.CELastCol)).HorizontalAlignment = xlCenterAcrossSelection

如果我正在测试这段代码,它会执行得很好,但是当我测试整个过程时,不同的工作簿在到达Sub时处于活动状态( Report.copy进入新工作簿会使新工作簿可见,我执行newWB.Activate)。

NewWB处于有效状态时,它会正常执行Report.Cells()并分配值,但Report.Range()会出现此错误:

  

运行时错误'1004':
对象'_Worksheet'的方法'范围'失败

如果我激活原始WB(通过OrigWB.Activate或手动),Report.Range()行将执行而不会出现错误。

我的理解是宣称工作簿和工作簿的全部要点。工作表变量是这样的,它们可以在代码中的任何地方引用,而不必使用.Activate.Select,那么为什么在我不这样做时会失败呢?

1 个答案:

答案 0 :(得分:1)

所有范围对象必须分配适当的父母。

Report.Range(Report.Cells(StartRow, CES.CEFirstCol), Report.Cells(StartRow, CES.CELastCol)).HorizontalAlignment = xlCenterAcrossSelection

所以在Cells(...前面放置了工作表变量Report,即使它们位于分配了它的Range对象中。

更简单的方法是使用With Block:

With Report
    .Range(.Cells(StartRow, CES.CEFirstCol), .Cells(StartRow, CES.CELastCol)).HorizontalAlignment = xlCenterAcrossSelection
End With