可以在Excel VBA中全局声明工作表对象吗?

Ali*_*ock 7 excel vba excel-vba

我正在重构Excel 2003工作簿中的许多模块,并在每个模块的每个过程中声明相同的工作表集; 我想在全球范围内宣布一次.我可以将工作表名称设置为文字,例如:

Public Const xlwkGSModel = "gs_model" As String
Run Code Online (Sandbox Code Playgroud)

然后在程序中使用:

...ActiveWorkbook.Worksheets(xlwkGSModel).Cells(1,1)
Run Code Online (Sandbox Code Playgroud)

但有没有办法声明工作表对象,以便过程中的代码可以是:

...xlwkGSModel.Cells(1,1)
Run Code Online (Sandbox Code Playgroud)

小智 11

"1.插入模块

"2.在模块中声明工作表公共变量,如下所示

Public xlwkGSModel As Worksheet
Run Code Online (Sandbox Code Playgroud)

"3.在应用程序加载事件中实例化此公共变量

Sub Workbook_Open()

   Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model")

End Sub
Run Code Online (Sandbox Code Playgroud)

'现在,您可以使用xlwkGSModel变量引用gs_model工作表

'例如

dim x as string

x = xlwkGSModel.Cells(1,1)
Run Code Online (Sandbox Code Playgroud)


Gar*_*ill 5

你可以,但是你真的想要更多的全局变量吗?为什么不创建(在标准模块内)公共属性 ModelWorksheet,如下所示:

Public Property Get ModelWorksheet As Worksheet
    Const ModelWorksheetName As String = "gs_model"
    Set ModelWorksheet = ActiveWorkbook.Worksheets(ModelWorksheetName)
End Property
Run Code Online (Sandbox Code Playgroud)

...那么你的代码可以执行以下操作:

With ModelWorksheet
    .Cells(1,1).Value = "foo"
    .Font.Bold = True
End With
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以直接引用当前工作簿中的任何工作表,因此如果有一个名为 Sheet1 的工作表,您可以执行以下操作:

With Sheet1
    .Cells(1,1).Value = "foo"
    .Font.Bold = True
End With
Run Code Online (Sandbox Code Playgroud)

  • 是的,我确实注意到你的回答中的 Withs 并看到了你在做什么,但我的评论中的字符用完了 =) 我简洁地弄清楚了我现在想说的内容:防御性编程 - 通过避免你更少的属性很可能会不小心陷入表演埋伏。 (2认同)

小智 5

这是很久以前的事了,但迟到总比没有好;-)我不知道这是否适用于Excel 2003(用2007测试):

您甚至不需要在代码中声明工作表,因为它们已经被声明.我正在使用德语版的Excel,我可以通过输入"Tabelle1.Cells(...)..."来访问工作表.我假设在英文版中它类似于"Table1"或"Sheet1".

您也可以更改这些名称.在Visual Basic编辑器中,查看VBA项目的Microsoft Excel对象.(它们位于VBA-Project视图中的Modules和UserForms之上).有工作簿的工作表对象.选择工作表并激活"属性"工具窗口.在那里,您可以编辑工作表的名称,并在代码中通过该名称访问它.