2017-03-17 27 views
5

私はお互いに独立した複数のサブがあるExcelファイルを作成しています。しかし、彼らは依然として常に同じ値を持つ同じ変数を使用します。したがって、私は変数をグローバルに定義したいと思いますが、私が非常に簡単に見つけたのは、変数をグローバルに宣言することだけでした。私は何をしなければならないのですか?私は変数を最初からすぐに値で埋めることもできますか?下の例のように、変数を最初から定義することは可能ですか? (私はそれが不可能であると私は間違っていると信じていますか?)値を持つVBAのグローバル変数

私はあなたの助けに感謝します!

トーマス

(シートはMSのVisual Basic Editorで記載されています)
Public s1, s2, s3 As Worksheet 
Public array1, array2 As Variant 

s1 = ThisWorkbook.Worksheets("Sheet 1") 
s2 = ThisWorkbook.Worksheets("Sheet 2") 
s3 = ThisWorkbook.Worksheets("Sheet 3") 
array1 = Array(3, 5, 6, 7, 5) 
array2 = Array(8, 9, 10, 11, 12) 

Sub code1() 
... 
End Sub 

Sub code2() 
... 
End Sub 
+1

1つのオプションは、クラスでそれらを配置すること、および 'に、Class_Initialize()'でそれを初期化します。あなたのサブシステムがマクロとして使用されることを意図されている場合、クラス機能のための "ラッパー"としてそれらを使用することができます。 – Comintern

+1

Workbook open eventまたはauto_open subが行います。 – cyboashu

+1

FWIWでは、ワークシートの参照を格納するのではなく、ワークシートのCodeNamesを使用することもできます。つまり、 's1.Foo'の代わりに' Sheet1.Foo'を使用します。オブジェクトモデルはそれらを無料で提供します。 – Comintern

答えて

3

あなたはパブリック変数としてモジュールでそれらを定義してからはThisWorkbookモジュールでのWorkbook_Openでそれらを設定することができます。

Public Sub Workbook_Open() 
    Set s1 = ThisWorkbook.Worksheets("Sheet 1") 
    Set s2 = ThisWorkbook.Worksheets("Sheet 2") 
    Set s3 = ThisWorkbook.Worksheets("Sheet 3") 
    array1 = Array(3, 5, 6, 7, 5) 
    array2 = Array(8, 9, 10, 11, 12) 
End Sub 

このメソッドは、スプレッドシートを初めて開くときに実行されます。

+1

どういうわけかVBAは変数s1、s2などが好きではありません。彼らはサブに移されていません。私はx = 5の単なる変数を試してみましたが、サブの中にxの値はありません。私は "ThisWorkbook"の "workbook_open"関数からsubsに何らかの形で呼び出さなければなりませんか? – Thomas

+0

s1を 'Public s1 as WorkSheet'として別のモジュールに定義することができます(同様に、すべてのグローバル変数に対して同様に行います)。このように定義されたら、ワークブックのどこからでもアクセスできます。 – Amorpheuses

+0

基本的には、新しいモジュール(「GlobalVarDecl」と言う)を作成し、すべてのグローバル変数宣言(「Public s1 As Worksheet」など)をそこに初期化しないでください。すべてのグローバル変数を初期化するWorkbook_Openにあります。また、あなたのコードの先頭に「Option Explicit」を入れるのは良い習慣です。後者の行では、変数を宣言していないとExcelがエラーを生成します。私を信頼してください。これはデバッグに役立ちます。 – Amorpheuses

3

Workbook_Openイベントの中に入力してください。 はThisWorkbookモジュールに移動し、書き込み:

Private Sub Workbook_Open() 
[fill variables here] 
End Sub 

このイベントは、開いているブックときと呼ばれています。

+0

コメントありがとう!私はWorkbook_Open関数が好きなものを探していました。 – Thomas

5

サブ変数を記述することなく変数を最初から定義することは可能でしょうか?

いいえ、サブプロシージャまたは関数内の変数の値の取得/設定のみが可能です。サイドノートでは


、あなたの現在のコード:

Public s1, s2, s3 As Worksheet 
Public array1, array2 As Variant 

WorksheetとしてVariants3としてs1s2を宣言 - それはあなたが、同じタイプの複数の変数を宣言することができVBAでの一般的な誤解ですこの方法では。

VBAで1行にこれを行うための正しい方法は次のようになります。

Public s1 As Worksheet, s2 As Worksheet, s3 As Worksheet 

私は2番目の行のために同じことを言うだろうが、とにかくそのバリアントとして宣言しました。

+0

そのコメントをありがとう、何かを学んだ:D – Thomas

+0

いいえ心配... :) –

0

あなたは、あなたがまだThisWorkbookクラスのprivateメンバーとしてそれらを定義し、値をretunsと値が定義されることを保証getプロパティを実装することができ、同じ値のすべての時間を持つことになりますconstantsのようなこれらの値を使用したい場合。

このソリューションの利点は、ThisWorkbookオブジェクト以外の誰もこの変数の値を変更できないことです。これは公共のグローバル変数の場合には当てはまりません。誰かが誤って例えば次のようになる可能性があります。 workbook1Nothingに設定し、最初にWorkbook_Openが1回だけ実行されるため、workbook1にアクセスするとエラーが発生します。IMOはglobal変数を使用することは、ほとんどの場合はお勧めできません。 HTH

はThisWorkbookクラスモジュール:ワークブックのどこでもその後

Option Explicit 

Private m_worksheet1 As Worksheet 
Private m_array1 As Variant 

Public Property Get Worksheet1() As Worksheet 
    If m_worksheet1 Is Nothing Then _ 
     Set m_worksheet1 = ThisWorkbook.Worksheets("Sheet 1") 
    Set Worksheet1 = m_worksheet1 
End Property 

Public Property Get Array1() As Variant 
    If Not IsArray(m_array1) Then _ 
     m_array1 = Array(3, 5, 6, 7, 5) 
    Array1 = m_array1 
End Property 

だけThisWorkbook例えば上のプロパティを呼び出しますこのような。

Debug.Print UBound(ThisWorkbook.Array1) 
Debug.Print ThisWorkbook.Worksheet1.Name 

出力:

4 
Sheet 1 
関連する問題