web-dev-qa-db-ja.com

ワークシートオブジェクトをExcelVBAでグローバルに宣言できますか?

Excel 2003ブックの多数のモジュールをリファクタリングしており、各モジュールの各プロシージャで同じワークシートのセットが宣言されています。グローバルに一度だけ宣言したいのですが。ワークシート名をリテラルとして設定できます。例:

Public Const xlwkGSModel = "gs_model" As String

そして、手順で使用します:

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

ただし、ワークシートオブジェクトを宣言して、プロシージャ内のコードを次のようにする方法はありますか。

...xlwkGSModel.Cells(1,1)
8
Alistair Knock

'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)
11
orwell

かなり前のことですが、今までにないほど遅くなっています;-)それがExcel 2003で機能するかどうかはわかりません(2007でテスト済み):

ワークシートはすでに宣言されているため、コードで宣言する必要はありません。ドイツ語版のExcelを使用しており、「Tabelle1.Cells(...)...」と入力してワークシートにアクセスできます。英語版では「Table1」や「Sheet1」のようなものだと思います。

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

5
Wysmaster

可能ですが、もっとグローバル変数が本当に必要ですか?次のようなパブリックプロパティ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
4
Gary McGill

ワークシートは、VBA-Project-Explorerで定義されている「MicrosoftExcelオブジェクト」です。

Worksheet Properties editing

上記の画面で、ワークシートにデータシートという名前を付けたので、コード内から直接アクセスできます。

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

デフォルトでは、ワークシートには、言語に応じて「Sheet1」、「Sheet2」、aso ...という名前が付けられます。

2
felvhage

または、Excelイベントを使用したくない場合は、ワークシートを公開して宣言し、サブを作成して値を設定することもできます。各サブの先頭でそのサブを呼び出して、値を初期化します。 (私はオーウェルの答えからこれをしました。)


Public WSRawData As Worksheet

Public Sub RawDataWSInit()

Set WSRawData = Worksheets(RawData)

End Sub

Sub Main()

Call RawDataWSInit

End Sub

2
shijie

編集: Alistair Knockのコメントは正しいので、質問をよく読んでおく必要があります。もちろん、私の答えはオブジェクトには無効で、文字列や整数などのタイプにのみ有効です。オブジェクトの場合、インスタンスを作成する関数またはサブが必要です。


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

おそらく最善のアプローチは、個別のモジュールGlobalsを用意してそこに配置することです。

0
Treb