Excel 2003ブックの多数のモジュールをリファクタリングしており、各モジュールの各プロシージャで同じワークシートのセットが宣言されています。グローバルに一度だけ宣言したいのですが。ワークシート名をリテラルとして設定できます。例:
Public Const xlwkGSModel = "gs_model" As String
そして、手順で使用します:
...ActiveWorkbook.Worksheets(xlwkGSModel).Cells(1,1)
ただし、ワークシートオブジェクトを宣言して、プロシージャ内のコードを次のようにする方法はありますか。
...xlwkGSModel.Cells(1,1)
'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)
かなり前のことですが、今までにないほど遅くなっています;-)それがExcel 2003で機能するかどうかはわかりません(2007でテスト済み):
ワークシートはすでに宣言されているため、コードで宣言する必要はありません。ドイツ語版のExcelを使用しており、「Tabelle1.Cells(...)...」と入力してワークシートにアクセスできます。英語版では「Table1」や「Sheet1」のようなものだと思います。
これらの名前を変更することもできます。 Visual Basic Editorで、VBAプロジェクトのMicrosoftExcelオブジェクトを確認します。 (これらは、VBA-プロジェクトビューのモジュールとユーザーフォームのすぐ上にあります)。ワークシート-ワークブックのオブジェクトがあります。シートを選択し、プロパティツールウィンドウをアクティブにします。そこで、シートの名前を編集して、コード内のその名前でアクセスできます。
可能ですが、もっとグローバル変数が本当に必要ですか?次のようなパブリックプロパティ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
ワークシートは、VBA-Project-Explorerで定義されている「MicrosoftExcelオブジェクト」です。
上記の画面で、ワークシートにデータシートという名前を付けたので、コード内から直接アクセスできます。
Set SomeRange = DataSheet.Range("A3:B6")
デフォルトでは、ワークシートには、言語に応じて「Sheet1」、「Sheet2」、aso ...という名前が付けられます。
または、Excelイベントを使用したくない場合は、ワークシートを公開して宣言し、サブを作成して値を設定することもできます。各サブの先頭でそのサブを呼び出して、値を初期化します。 (私はオーウェルの答えからこれをしました。)
Public WSRawData As Worksheet
Public Sub RawDataWSInit()
Set WSRawData = Worksheets(RawData)
End Sub
Sub Main()
Call RawDataWSInit
End Sub
編集: Alistair Knockのコメントは正しいので、質問をよく読んでおく必要があります。もちろん、私の答えはオブジェクトには無効で、文字列や整数などのタイプにのみ有効です。オブジェクトの場合、インスタンスを作成する関数またはサブが必要です。
はい、できます、私は最近それをしました。定義をPublic
として定義すると、他のモジュールで直接使用できます(もちろん、同じワークブック内で)。
おそらく最善のアプローチは、個別のモジュールGlobalsを用意してそこに配置することです。