2009-07-24 50 views
7

我正在重構Excel 2003工作簿中的許多模塊,並且在每個模塊的每個過程中都聲明瞭同一組工作表;我想只在全球範圍內聲明一次。我可以設置工作表的名稱爲文字,如:Excel VBA中可以全局聲明工作表對象嗎?

Public Const xlwkGSModel = "gs_model" As String 

然後在程序中使用:

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

但有申報工作表對象的方式,以使程序代碼可能是:

...xlwkGSModel.Cells(1,1) 

回答

10

「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) 
0

編輯:由阿利斯泰爾註釋敲是正確的,我應該仔細閱讀的問題 - 當然,我的答案是否定的對於對象有效,僅適用於字符串或整數類型。對於需要創建實例的函數或子對象的對象。


是的,你可以,我最近做到了。如果您將定義定義爲Public,則可以直接在其他模塊中使用它們(當然在同一工作簿中)。

也許最好的辦法是有一個單獨的模塊全局變量並把它們放在那裏。

+0

推測當定義可以在模塊級別進行時,這些值將需要在程序中分配,例如,在Workbook_Open()中?由於常量不能包含對象... – 2009-07-24 10:22:00

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 
+1

想到這個......我不知道我是否會推薦它。一個屬性的問題是它看起來像一個對象,如果你在一個循環中更新,比如說15000個單元格,那麼每個循環都會有很多額外的間接尋址。我認爲直接使用Worksheet引用會更好,但YMMV更好。我仍然認爲最好是使用工作表/設置sht = ModelWorksheet()/ sht.Cells(1,1)...並將工作表抓取到ModelWorksheet函數中。我知道這並不會減少涉及的線路數量,但走向世界通常是不明智的。 – 2009-07-24 11:01:52

5

這是很久以前的事,但更好晚於從未;-) 我不知道是否在Excel 2003中工作(與2007年測試):

你甚至不需要decl是代碼中的工作表,因爲它們已經被聲明。我正在使用德語版的Excel,我可以通過鍵入「Tabelle1.Cells(...)...」來訪問工作表。我在英文版中假設它就像「Table1」或「Sheet1」。

您也可以更改這些名稱。在Visual Basic編輯器中查看VBA項目的Microsoft Excel對象。 (它們正好在VBA-Project視圖中的模塊和用戶窗體之上)。有工作簿的工作表 - 對象。選擇一張紙並激活屬性工具窗口。在那裏您可以編輯工作表的名稱並在代碼中通過該名稱訪問它。

2

或者,如果您不想使用Excel事件,也可以公開聲明您的工作表,然後創建一個子設置它的值。在每個子的開始處調用該子集以初始化該值。 (我這樣做是從奧威爾的答案。)


Public WSRawData As Worksheet 

Public Sub RawDataWSInit() 

Set WSRawData = Worksheets(RawData) 

End Sub 

Sub Main() 

Call RawDataWSInit 

End Sub 

0

你的工作表在您的VBA項目資源管理器中定義的 「Microsoft Excel對象」 :

Worksheet Properties editing

在屏幕上面,我已經叫我的工作表中文手冊,所以現在我可以從代碼中直接訪問它:

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

默認工作表將被命名爲「工作表Sheet1」,「Sheet2的」, aso ...取決於你的語言。

相關問題