2016-08-17 8 views
1

Excel-VBA。私は後でいくつかのサブシステムで使用する変数を作成したいと思います。この上の他の質問に続いて、私は私が同じサブでテストしようとした場合、サブVBA:他のサブシステムにパブリック変数を使用する

Sub Count() 
Set sh2= ActiveWorkbook.Sheets("Sheet2") 
Set sh1 = ActiveWorkbook.Sheets("Sheet1") 
Dim rng As Range 
Dim trng As Range 
Set trng = sh2.Range("A4:HV4") 

For Each rng In trng 
    If rng.Value = "Name" Then 
    Counter = Range(rng, rng.End(xlToLeft)).Columns.count 
    End If 
Next rng 

を使用して変数に値を与えることを進め、その後、変数公に

Public Counter As Integer 

を宣言した値の数例えば

sh1.range("B1").value = counter 

私は正しい番号を取得します。

しかし、いったん別のサブで呼び出すと、値は0になります。

Sub Test() 

Range("F1").Value = counter 

end sub 

私のテストサブのCountサブアドレスを呼び出すことも試みましたが、結果もありませんでした。

アイデア?ありがとう!

+1

私はいつも「過度の」approcahを使用しています。専用モジュール(私は_Global_Var_と呼んでいます)を追加するだけで、すべてのグローバル変数が宣言されます。あなたの例では、グローバルカウンタは整数です。 –

+1

ここに含まれているコードの部分に明白なエラーはないので、問題はあなたがやっていることの他の部分にあります。しかし、私はCounterが他の場所ではなく、ある場所で大文字にされていることに気付きました。あなたが間違ってコピーしたか、コード表示パーサが異なる変数だと思っています。 – david

答えて

2

@ShaiRadoはすでにコメントで指摘しています。以下は、その周辺の詳細です:

Publicタイプでは、オブジェクト参照がなくても、少なくともVBAプロジェクトの可視性はありません。したがって、ワークシートオブジェクト\ UserForm \ Class内に変数Publicを宣言する場合は、その変数の完全参照を使用する必要があります。たとえば、CounterがSheet1の内部で宣言されている場合は、Sheet1.Counterを使用します。

Global一方、変数はVBAプロジェクトを通じてアクセス可能です。参照のために親オブジェクト名を呼び出す必要はありません。ちょうど1つのキャッチは、Global変数は標準モジュール内でのみ宣言できます。 object \ UserForm \ Classでは、内部でグローバル変数宣言を行うことはできません。

プロジェクトワイドアクセスの要件の場合は、常にGlobalと宣言してください。

もう一つは、あなたの代わりに予期しない出力/動作のため、あなたのコードでそれを持っていた場合は、

レンジ(「F1」)でhighlihgted coddeでエラーVariable not definedを持っているwoud、Option Explicitです。バリュー= counter

これは、デバッグをはるかに簡単にしているはずです。 :)

-1

私は単純に私の新しいサブの前に関数を呼び出して解決しました!

Sub Test() 
Call count() 
Range("F1").Value = counter 

end sub 
関連する問題