2009-07-24 7 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モジュール内のワークシートの公開変数を次のように宣言します。

'3アプリケーションのロードイベントでこのパブリック変数をインスタンス化することは

Sub Workbook_Open() 

    Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model") 

End Sub 

dim x as string 

x = xlwkGSModel.Cells(1,1) 
0

編集:アリスターによってコメントノックが正しい、私は徹底的に質問を読んでいる必要があります - もちろん、私の答えはノーです文字列や整数などの型のオブジェクトに対してのみ有効です。オブジェクトの場合は、インスタンスを作成する関数またはサブが必要です。


はい、私は最近しました。定義をPublicと定義した場合は、それらを他のモジュールで直接使用することができます(同じブック内でもちろん使用できます)。

おそらく、最良の方法は、個別のモジュールを持つことです。グローバルを入れてください。

+0

おそらく、モジュールレベルで定義を行うことができますが、値は手順で割り当てられる必要があります。 Workbook_Open()で?定数にはオブジェクトが含まれていない可能性があるので... –

4

もっと多くのグローバル変数が必要ですか?あなたはのいずれかを参照できるようにしても

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

注:

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

...その後、あなたのコードを実行できます。このように、ModelWorksheet(標準モジュール内)パブリックプロパティを作成しないのはなぜ直接現在のワークブックのワークシート、あなたが行うことができますシート1と呼ばれるシートがありますので、もし:

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

これについて考える...私はそれをお勧めするかどうかは分かりません。プロパティの問題は、オブジェクトのように見えることです。ループ内にある15000個のセルを1つずつ更新する場合、これは各サイクルで実行される多くの追加の間接処理です。ワークシート参照をYMMVで直接使用するほうがよいと思います。私はまだ、ワークシート/セットsht = ModelWorksheet()/ sht.Cells(1,1)としてDim Shtに行く方が良いと思っています...そして、ModelWorksheet関数にシートグラブを置いてください。私はそれが関与する行の数を減らさないことは分かっていますが、グローバル化するのは通常はあまり勧められません。 –

+0

@goodgai:全面的に同意しました。実際に私はWithステートメントを使用してプロパティを2回参照しないようにしていますが、より明示的にすべきでした。そして、このメソッドでさえも、ループ内であまり役立たないことが正しいです(With ... End Withはループ全体をラップしない限り)。 –

+2

はい私はあなたの答えにWithsを気付き、あなたがしていたことを見ましたが、私のコメントで文字がなくなった=)今私は今言いたいことを、簡潔に:防御的プログラミング - 事故によってパフォーマンスアイドルに入る可能性は低い。 –

5

それだ昔、より良いために「今、あなたはxlwkGSModel変数

でgs_modelワークシートを参照することができます」遅くないこと;-) Excel 2003で動作するかどうかわかりません(2007年にテスト済み):

すでに宣言されているため、コード内のワークシートです。私はドイツ語版のExcelで作業しており、「Tabelle1.Cells(...)...」と入力してワークシートにアクセスできます。英語版では、 "Table1"や "Sheet1"のようなものです。

これらの名前を変更することもできます。 Visual Basic Editorで、VBAプロジェクトのMicrosoft Excelオブジェクトを見てください。 (これらは、VBAプロジェクトビューのモジュールとユーザーフォームのすぐ上にあります)。あなたのワークブックのワークシート - オブジェクトがあります。シートを選択し、プロパティツールウィンドウをアクティブにします。そこでは、シートの名前を編集し、コード内のその名前でアクセスすることができます。

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のオブジェクト" です:

0私は今、私はコード内から直接アクセスすることができ、私のワークシートデータシート命名した上記の画面で

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

デフォルトで、あなたのワークシートは、「シート1」、「シート2」という名前になります、 aso ...あなたの言語によって。

関連する問題