• ベストアンサー

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

  • ExcelのVBA。Staticな変数について

    あるプロシージャやfunctionで定義したstaticな変数は、その定義したsubやfunctionで有効です。今回、例えば、static a as integer とSub AAA 内で、定義し、その AAA が呼び出す BBB という ユーザーフォームの中でも staticな変数である a に値を代入したり、変更したりし、その後 sub AAAにまた入ったとき、BBBで変更した内容を保持することができるのでしょうか。

  • ExcelVBA 変数を使ってセルの番地を表す

    Exce2000のlVBAで Sub Macro11() Dim LastColumn As Integer Dim LastRow As Integer LastColumn=5 LastRow=1 Range(("LastColumn"), ("LastRow")).Select End Sub と打ち込むとエラーが出ます. 変数を使ってセルの番地を指定して セルを選択できないでしょうか?

  • [C#]Public変数の使い方

    今までVBを使っており、C#は初心者です。 VBでは、各関数にまたがって使う変数は、 private Hensu as integer Sub Kansuu1() Hensu = 2 Call Kansuu2() End Sub Sub Kansuu2() MsgBox Hensu End Sub と宣言すれば、使えますが、C#でそのような使い方はできないのでしょうか? 変数Hensu3をMainとMain2双方で使いたいとき、 using System; namespace ns1 { static class Program { public string Hensu3; static void Main(string[] args) { ・・・ } static void Main2() { ・・・ } } } と書きましたが、ビルドエラーになります。

  • [ExcelVBA] Module1で定義した変数の(代入した)値を、Module2でも使う方法

    基本中の基本のことで誠に申し訳ございません。 ある標準Moduleで宣言した変数に値を代入します。 その後、別のModuleでその変数を使用しますが、 その変数の中の値が消えてしまいます。 たとえば下記のように、プログラムを書きます。 test1を実行すると、続いてtest2も実行されます。 この場合、変数の値が0になってしまいます。 このような場合どうやったらいいのでしょうか? Hensuu1の値をセルに一度出力させて、 別のModuleで、セルの値をもう一度変数に代入させて使用する という方法で何とかしていたのですが、大変で困っています。 Module1に記載------------ dim Hensuu1 as integer sub test1() Hensuu1 = 100 test2 end sub ------------------------- Module2に記載------------- sub test2 range("A1") = Hensuu1 end sub --------------------------

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

  • エクセルでpublic変数が使えない!

    突然、私のパソコンで、エクセルのpublic変数が使えなくなりました。なぜか、public変数そのものが機能しなくなったみたいです。たとえば、 public a as integer と宣言し、aの値を別のbookに渡して使おうとします。ユーザフォームにCommandButton1を貼り付けて、クリックし、次のイベントプロシージャを実行させ、デバックモードのウォッチ式で、aの値を追跡すると、”あるセルの値”は一旦、aに代入されるのですが、End Subのところで、値が<対象範囲外>、型がemptyとなってしまうのです。 Private Sub CommandButton1_Click() a = ”あるセルの値” End Sub 何か設定が変わってしまったのでしょうか? それまで使っていた、プログラムが使えなくなって困っています。 どなたか、回答よろしくおねがいします。

  • excel/vba/public変数

    excel VBAで下記のようなコードを書きました。 他のプロシージャでも共通の変数を使用したいと思っています。 その為、public変数を宣言して使用したいと設定しましたが。 うまくいきません。 testmainを実行し、iに何も入っていないことを確認しました。 その後『1』を代入し、testmainは終了します。 testsubをその後実行し、iに先ほど代入された値を確認しようとしても何も代入されていない状態です。 全プロシージャでその変数を使用したいと思っているのですが、 何か方法、もしくはこのような使用方法ではないのでしょうか? public変数を使用してもプロシージャが終了すれば変数はクリアされるのでしょうか? 構造化の方法の問題上参照渡しや、戻り値など、指定する方が複雑になっていきます。 ご指導よろしくおねがいします。 Public i As Variant Sub testmain() MsgBox test i = 1 End Sub Sub testsub() MsgBox i End Sub

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • 全ての変数を一気にリセットする方法はありますか?

    全ての変数を一気にリセットする方法はありますか? Sub test() Dim i As Integer Dim int1 As Integer Dim int2 As Integer int1 = 1 int2 = 2 For i = 1 To 100 'プロシージャー int1 = 0 'リセット int2 = 0 'リセット Next End Sub みたいなコードがあり、 ループが終わる度に変数をリセットしたい場合 int1 = 0 'リセット int2 = 0 'リセット のように一つ一つ変数に値を入れてリセットするしかないですか? 例のコードは二つしか変数が有りますが 実際100個くらいの変数が有る場合も、 一個一個リセットするしかないのでしょうか? 理想としては、VBAを中断したら全ての変数がリセットされますが それと同じようなコードが有れば、楽だなと思います。

  • Evaluate()に数式を代入した変数を渡すには

      VB.NETでEvaluate()関数を使って、プログラム実行中に決まる数式を評価させたいのですが、(1)のように数式をリテラルのまま渡せば正しく評価されるのですが、(2)のように数式を変数に代入して渡すとうまくいきません。数式の構造自体がプログラムの実行中に決まるので、数式を代入した変数を引数として渡す必要がありますが、このような場合、どのようにすればよいのでしょうか。 (1) 引き渡す数式がリテラルの場合 Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim x As Integer   x = 1   MsgBox(xlApp.Evaluate(x = 1)) '期待 True  実際 True  結果 OK   MsgBox(xlApp.Evaluate(x <> 1)) '期待 False  実際 False  結果 OK  End Sub End Module (2) 引き渡す数式が代入された変数の場合 Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim x As Integer   Dim term1 As String   Dim term2 As String   x = 1   term1 = "x = 1"   term2 = "x <> 1"   MsgBox(xlApp.Evaluate(term1)) '期待 True  実際 -2146826259 結果 NG   MsgBox(xlApp.Evaluate(term2)) '期待 False  実際 -2146826259 結果 NG  End Sub End Module よろしくお願いします(WindowsXP,VS2010)

専門家に質問してみよう