- ベストアンサー
ExcelVBA Static変数の初期化
Static変数はファイルを一旦終了しないと0にリセットできないのでしょうか? 出来ないとすればStatic変数に代わりそういうことができる方法はありますか?(セルに番号を代入するのは無しで) Sub 番号てすと() Static g As Integer MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>「同じ範囲内で宣言が重複しています」という「コンパイルエラー」がでました。 #5の方の言われる通りです。 変数の宣言は、普通最初にします。 宣言する前に使っているので、 自動的に宣言したことになり、 その後で、Staticの宣言があるので、 2度宣言していると解釈されます。 #4のサンプルは、ちょっと不親切だったかもしれません。 すみません。m(_ _)m
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>Sub aaa()からでないとSub 番号てすと(Optional reset As Boolean = False)が動かせないのですが(マクロの一覧に無くて)、どうしてでしょう? マクロの一覧には引数のあるSub(プロシジャー:手続き)は、表示されない様です。 一覧から選ぶだけなので、引数が指定できないからだと思います。(ちょっと余計なお世話なところもありますけど) なので、現在やられているように、間接的に呼び出すようにして、メニューに表示するようにするしかないと思います。
お礼
よくわかりませんが、そうなんですか。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
順序が違いますね。 Sub 番号てすと(Optional reset As Boolean = False) Static g As Integer ←最初に置く If (reset) Then g = 0 MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub
お礼
ありがとうございました。 こんどは大丈夫でした。 でも、Sub 番号てすと(Optional reset As Boolean = False) が、マクロの一覧に出てこないのはどうしてでしょう?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
関数の中に確保したstaticな変数は、関数の中だけで有効なので、外からリセットすることはできません。 なので、関数呼び出しの際に、変数の値によってリセットするようにすれば良いかも知れません。 Sub 番号てすと(Optional reset As Boolean = False) If (reset) Then g = 0 通常の処理 end sub call 番号てすと の様に通常どおり呼び出した場合は、普通に実行されます。 call test(reset:=true) リセットを指定して関数を呼び出すと、gを初期化してから通常の処理を実行します。
補足
Sub 番号てすと(Optional reset As Boolean = False) If (reset) Then g = 0 Static g As Integer MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub Sub zzzzzzzz() Call 番号てすと(reset:=True) End Sub 「同じ範囲内で宣言が重複しています」という「コンパイルエラー」がでました。
- iiikkk
- ベストアンサー率37% (92/247)
#1です。 であればグローバル変数にすればよいです。 モジュールの頭に、Static ではなく Dim g As Integer としてください。 私的にはどこでも書き換え可能なんてのはしませんが。 最悪でも、引数渡しにしますね。
お礼
グローバル変数ですか?! また新しい呪文が出てきました・・・。 Static変数との違いがわかりました。ありがとうございます。 > 引数渡しにしますね。 引数渡しってどんなんでしょう?
- Wendy02
- ベストアンサー率57% (3570/6232)
それは、Static 変数自体を使うことが違っているからです。 プロシージャ・レベルではなく、モジュールレベルで、変数を置き、 例: Dim g As Integer Sub 番号てすと() MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub として、 例えば、 Sub HennsuClear() g = 0 End Sub とします。
お礼
ありがとうございます。 おかげさまで解決いたしました。 モジュールレベルで、変数を置けるんですね。 勉強になりました。
- iiikkk
- ベストアンサー率37% (92/247)
好きなときに、 g = 0 とすれば初期化できます。
補足
説明が足りませんでした。 Sub 番号てすと() Static g As Integer MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub には触らずに、他のプロシージャからリセットしたいのです。 他のプロシージャに Sub 番号クリア() Static g As Integer g = 0 End Sub とやってもクリア出来なかったので・・・・。
お礼
> #4のサンプルは、ちょっと不親切だったかもしれません。 > すみません。m(_ _)m とんでもない! そんなことも知らないわたしがお馬鹿なんですよ。 ありがとうございました。 以下でうまく行きました。 ただ、Sub aaa()からでないとSub 番号てすと(Optional reset As Boolean = False)が動かせないのですが(マクロの一覧に無くて)、どうしてでしょう? 何度も質問してすみません。 Sub 番号てすと(Optional reset As Boolean = False) Static g As Integer If (reset) Then g = 0: Exit Sub MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub Sub zzzzzzzz() Call 番号てすと(reset:=True) End Sub Sub aaa() Call 番号てすと End Sub