Static変数はファイルを一旦終了しないと0にリセットできないのでしょうか?
出来ないとすればStatic変数に代わりそういうことができる方法はありますか?(セルに番号を代入するのは無しで)

Sub 番号てすと()
Static g As Integer
MsgBox "今のG= " & g
g = g + 1
MsgBox "次のG= " & g
End Sub

A 回答 (7件)

>「同じ範囲内で宣言が重複しています」という「コンパイルエラー」がでました。


#5の方の言われる通りです。
変数の宣言は、普通最初にします。
宣言する前に使っているので、
自動的に宣言したことになり、
その後で、Staticの宣言があるので、
2度宣言していると解釈されます。
#4のサンプルは、ちょっと不親切だったかもしれません。
すみません。m(_ _)m
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/22 09:20

>Sub aaa()からでないとSub 番号てすと(Optional reset As Boolean = False)が動かせないのですが(マクロの一覧に無くて)、どうしてでしょう?


マクロの一覧には引数のあるSub(プロシジャー:手続き)は、表示されない様です。
一覧から選ぶだけなので、引数が指定できないからだと思います。(ちょっと余計なお世話なところもありますけど)
なので、現在やられているように、間接的に呼び出すようにして、メニューに表示するようにするしかないと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/24 23:25

順序が違いますね。


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
    • good
    • 0
この回答へのお礼

ありがとうございました。
こんどは大丈夫でした。

でも、Sub 番号てすと(Optional reset As Boolean = False)
が、マクロの一覧に出てこないのはどうしてでしょう?

お礼日時:2005/04/22 09:11

関数の中に確保した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

「同じ範囲内で宣言が重複しています」という「コンパイルエラー」がでました。

補足日時:2005/04/21 15:12
    • good
    • 0

#1です。



であればグローバル変数にすればよいです。

モジュールの頭に、Static ではなく
Dim g As Integer
としてください。

私的にはどこでも書き換え可能なんてのはしませんが。

最悪でも、引数渡しにしますね。
    • good
    • 0
この回答へのお礼

グローバル変数ですか?!
また新しい呪文が出てきました・・・。

Static変数との違いがわかりました。ありがとうございます。

> 引数渡しにしますね。

引数渡しってどんなんでしょう?

お礼日時:2005/04/21 15:04

それは、Static 変数自体を使うことが違っているからです。


プロシージャ・レベルではなく、モジュールレベルで、変数を置き、

例:
Dim g As Integer
Sub 番号てすと()
 MsgBox "今のG= " & g
 g = g + 1
 MsgBox "次のG= " & g
End Sub

として、
例えば、
Sub HennsuClear()
 g = 0
End Sub

とします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
おかげさまで解決いたしました。

モジュールレベルで、変数を置けるんですね。
勉強になりました。

お礼日時:2005/04/21 15:00

好きなときに、



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

とやってもクリア出来なかったので・・・・。

補足日時:2005/04/21 13:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報