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

时间:2009-07-24 10:00:49

标签: excel vba excel-vba

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

Public Const xlwkGSModel = "gs_model" As String

然后在程序中使用:

...ActiveWorkbook.Worksheets(xlwkGSModel).Cells(1,1)

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

...xlwkGSModel.Cells(1,1)

6 个答案:

答案 0 :(得分:11)

“1。插入模块

“2。在模块中声明工作表公共变量如下

Public xlwkGSModel As Worksheet

“3。在应用程序加载事件

中实例化此公共变量
Sub Workbook_Open()

   Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model")

End Sub

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

'例如

dim x as string

x = xlwkGSModel.Cells(1,1)

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

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

Public Property Get ModelWorksheet As Worksheet
    Const ModelWorksheetName As String = "gs_model"
    Set ModelWorksheet = ActiveWorkbook.Worksheets(ModelWorksheetName)
End Property

...那么你的代码可以做到:

With ModelWorksheet
    .Cells(1,1).Value = "foo"
    .Font.Bold = True
End With

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

With Sheet1
    .Cells(1,1).Value = "foo"
    .Font.Bold = True
End With

答案 3 :(得分:2)

或者,如果您不想使用Excel事件,您还可以公开声明工作表,然后创建一个子设置值。在每个sub的开头调用该sub来初始化该值。 (我是从奥威尔的回答中做到的。)


Public WSRawData As Worksheet

Public Sub RawDataWSInit()

Set WSRawData = Worksheets(RawData)

End Sub

Sub Main()

Call RawDataWSInit

End Sub

答案 4 :(得分:1)

您的工作表是VBA-Project-Explorer中定义的“Microsoft Excel对象”:

Worksheet Properties editing

在上面的屏幕中,我已经命名了我的工作表数据表,所以现在我可以直接从代码中访问它:

Set SomeRange = DataSheet.Range("A3:B6")

默认情况下,您的工作表将被命名为“Sheet1”,“Sheet2”,aso ...取决于您的语言。

答案 5 :(得分:0)

编辑: Alistair Knock的评论是正确的,我应该彻底阅读这个问题 - 当然我的答案对于对象无效,只适用于字符串或整数等类型。对于对象,您需要一个创建实例的函数或子。


是的,你可以,我最近做到了。如果您将定义定义为Public,则可以直接在其他模块中使用它们(当然,在同一工作簿中)。

也许最好的方法是拥有一个单独的模块 Globals 并将它们放在那里。