处理工作表而不激活它

时间:2016-10-28 15:22:28

标签: excel vba excel-vba

我想在工作簿的末尾复制一个工作表,而不会让它变为活动状态。

我使用此代码在最后复制我的“模板”表:

ThisWorkbook.Sheets("Template").Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)

然后我的新表“模板(2)”成为活动表。 即使在复制之后我还想继续使用“模板”。

有可能吗?

1 个答案:

答案 0 :(得分:1)

  

有可能吗?

不是。 .Copy激活新工作表,就是这样。但是,在以下情况之后,没有什么能阻止(重新)激活原始工作表:

With ThisWorkbook.Worksheets("Template")
    .Copy after:=ThisWorkbook.Workheets(ThisWorkbook.Worksheets.Count)
    .Activate
End With

注意我在这里使用Worksheets集合。 Sheets集合可以包含非工作表对象,例如Chart表单,通常不是您要查找的内容 - Worksheest集合仅包含实际Worksheet对象

请注意,每次需要使用时,都需要在ThisWorkbook.Worksheets集合中查找模板表,并且使您的代码更加虚弱。

每个Excel对象(实际上是VBA对象)都有(Name)属性(位于Name属性之上,该属性引用工作表标记为的任何属性),您可以在属性中编辑窗格(在编辑器中按 F4 ) - 该名称必须是合法的VBA标识符,VBA使用它做的非常好:它声明了一个具有该名称的全局范围对象变量,如果您为“模板”表TemplateSheet命名,那么您可以这样做:

With TemplateSheet
    .Copy after:=ThisWorkbook.Workheets(ThisWorkbook.Worksheets.Count)
    .Activate
End With

等等每个“静态”工作表(即不是由代码生成的工作表)。通过按Name属性(选项卡标签)引用工作表,只要用户决定将选项卡命名为其他内容,您的代码就会开始失败。通过引用相应的全局范围标识符,您可以随意标记工作表选项卡,代码根本不关心。