• ベストアンサー

ExcelVBA Static変数の初期化

Static変数はファイルを一旦終了しないと0にリセットできないのでしょうか? 出来ないとすればStatic変数に代わりそういうことができる方法はありますか?(セルに番号を代入するのは無しで) Sub 番号てすと() Static g As Integer MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>「同じ範囲内で宣言が重複しています」という「コンパイルエラー」がでました。 #5の方の言われる通りです。 変数の宣言は、普通最初にします。 宣言する前に使っているので、 自動的に宣言したことになり、 その後で、Staticの宣言があるので、 2度宣言していると解釈されます。 #4のサンプルは、ちょっと不親切だったかもしれません。 すみません。m(_ _)m

merlionXX
質問者

お礼

> #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

その他の回答 (6)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

>Sub aaa()からでないとSub 番号てすと(Optional reset As Boolean = False)が動かせないのですが(マクロの一覧に無くて)、どうしてでしょう? マクロの一覧には引数のあるSub(プロシジャー:手続き)は、表示されない様です。 一覧から選ぶだけなので、引数が指定できないからだと思います。(ちょっと余計なお世話なところもありますけど) なので、現在やられているように、間接的に呼び出すようにして、メニューに表示するようにするしかないと思います。

merlionXX
質問者

お礼

よくわかりませんが、そうなんですか。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

順序が違いますね。 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

merlionXX
質問者

お礼

ありがとうございました。 こんどは大丈夫でした。 でも、Sub 番号てすと(Optional reset As Boolean = False) が、マクロの一覧に出てこないのはどうしてでしょう?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

関数の中に確保したstaticな変数は、関数の中だけで有効なので、外からリセットすることはできません。 なので、関数呼び出しの際に、変数の値によってリセットするようにすれば良いかも知れません。 Sub 番号てすと(Optional reset As Boolean = False) If (reset) Then g = 0 通常の処理 end sub call 番号てすと の様に通常どおり呼び出した場合は、普通に実行されます。 call test(reset:=true) リセットを指定して関数を呼び出すと、gを初期化してから通常の処理を実行します。

merlionXX
質問者

補足

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)
回答No.3

#1です。 であればグローバル変数にすればよいです。 モジュールの頭に、Static ではなく Dim g As Integer としてください。 私的にはどこでも書き換え可能なんてのはしませんが。 最悪でも、引数渡しにしますね。

merlionXX
質問者

お礼

グローバル変数ですか?! また新しい呪文が出てきました・・・。 Static変数との違いがわかりました。ありがとうございます。 > 引数渡しにしますね。 引数渡しってどんなんでしょう?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

それは、Static 変数自体を使うことが違っているからです。 プロシージャ・レベルではなく、モジュールレベルで、変数を置き、 例: Dim g As Integer Sub 番号てすと()  MsgBox "今のG= " & g  g = g + 1  MsgBox "次のG= " & g End Sub として、 例えば、 Sub HennsuClear()  g = 0 End Sub とします。

merlionXX
質問者

お礼

ありがとうございます。 おかげさまで解決いたしました。 モジュールレベルで、変数を置けるんですね。 勉強になりました。

  • iiikkk
  • ベストアンサー率37% (92/247)
回答No.1

好きなときに、 g = 0 とすれば初期化できます。

merlionXX
質問者

補足

説明が足りませんでした。 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 とやってもクリア出来なかったので・・・・。

関連するQ&A