在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
,那么为什么在我不这样做时会失败呢?
答案 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