• ベストアンサー

Publicで宣言しているから起きる現象?

Option Explicit Public i As Long Sub test1() i = i + 1 Debug.Print i End Sub これを数回実行すると イミディエイトウインドウには 1 2 3 4 5 と記載されていきます。 なぜEnd Subで終わっているのにiの値がリセットされないのでしょうか? 「Public」で宣言しているからですか? Publicで宣言しつつ、1から開始したい場合は Sub test2() i=0 i = i + 1 Debug.Print i End Sub とするべきなのでしょうか? またtest1のiの値はどこかに保存されているのでしょうか? よろしくお願いします。

  • xcmcxm
  • お礼率100% (320/320)

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

Public宣言した変数は、ファイルを閉じるまで値を保持します。 これは異なるマクロでの値の共通化や、 同一のマクロの繰り返し使用でのカウントアップに使うためです。 そのマクロ内だけで完結する場合は、 初期値にリセットする。:i = 0 マクロ内で変数宣言:Dim I As Long(パブリックは使用しない) のどちらかになると思います。

xcmcxm
質問者

お礼

ファイルを閉じるまで値が保持されるのですね。 ありがとうございます。参考になりました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

VBの基礎であって、(プログラミング言語一般の基礎でもある)Googleで「VB Public変数とは」とかで照会すれば、沢山の解説が有る。 またVBの解説書には必ず最初のほうに解説が有る事項。そういうものを1読してみましたか。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_p02.htm Public Static 変数のスコープ グローバル変数 ローカル変数

xcmcxm
質問者

お礼

ありがとうございます。調べてみます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>Publicで宣言しているから起きる現象? 関係ありません。 Publicの場合は、他のモジュールからもこの変数を参照出来るだけです。 Privateの場合は、他のモジュールから変数を参照する事はできません。 >Public i As Long として、プロシージャー外でグローバル変数として宣言しているので、実行の都度加算されて行きます。 http://www.k1simplify.com/vba/tipsleaf/leaf330.html

xcmcxm
質問者

お礼

グローバル変数ですか。 調べてみます。 ありがとうございます。

関連するQ&A

  • 変数を続けて宣言した場合はEmpty型になる?

    Sub test1() Dim Int1, Int2 As Long Debug.Print "---------- test1の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub Sub test2() Dim Int1 As Long Dim Int2 As Long Debug.Print "---------- test2の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub を実行すると、 ---------- test1の実行結果 ---------- Empty Long ---------- test2の実行結果 ---------- Long Long の結果が得られます。 test1のInt1がEmpty型になりますが、変数の型にEmptyはないですよね? どういうことなのでしょう???

  • 変数iもjも同じく値を保持できるからどちらを使って

    このサンプルコードは、 変数iもjも同じく値を保持できるから、test1を使ってもtest2を使っても一緒なのでしょうか? Option Explicit Dim i As Integer Sub test1() Static j As Integer j = j + 1 Debug.Print j End Sub Sub test2() i = i + 1 Debug.Print i End Sub ご回答よろしくお願いします。

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • 「Debug.Print i = i + 1」がFalseになる。

    Sub test() Dim i As Long i = 0 Debug.Print i = i + 1 End Sub を実行すると False がイミディエイトウインドウに表示されます。 理由が知りたいです。 よろしくお願いします。

  • VBA 100億になると#が自動で付く

    下記のコードを見てください。 Option Explicit Sub test1() Dim i As Long i = 1000000000 End Sub Sub test2() Dim i As Long i = 10000000000# End Sub test2の#は私が付けたものではありません。 test1より一つ多く0を付けたら勝手に付きました。 どうしてなのでしょう? 不思議です。

  • 定数の宣言ってdimは使えないのですか?

    VBAです。 標準モジュールに Option Explicit Public Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub はできるのですが、 Option Explicit dim Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub は、エラーになってしまいます。 Option Explicit Sub aaaa() dim Const フォルダ名 As String = "新しいフォルダー" End Sub もダメみたいです。 定数を使うときは、必ずPublicで宣言しなけらばいけないのでしょうか?

  • Variant型で宣言してるのにEmptyになる

    エクセルVBA2003について質問です。 Sub aaa1() Dim a As Variant Debug.Print TypeName(a) End Sub を実行してイミディエイトウインドウで確認すると Emptyが返ってきます。 Variantが返ってこない理由は何でしょうか? また、変数の方の宣言をしない場合は Variant型になるはずなのに Sub aaa2() Dim a Debug.Print TypeName(a) End Sub を実行すると、同じくEmptyが返ってきます。 Variantが返らない理由を教えてください。よろしくお願いします。

  • lenは文字数を取得する関数ですよね?

    vbaで Sub test() Dim i As Long Debug.Print Len(i) End Sub とすると、4が返るのですが、なぜなのかまったくわかりません。 iには0が入っているので、一文字だから1が返ると思うのですが・・・

  • イミディエイトウインドウの最高表示数は199行?

    当方XP&Office2003です。 Sub test() Dim i As Long For i = 1 To 200 Debug.Print i Next i End Sub を実行すると、 2 3 ・ ・ ・ 200 と、表示され、最初の1が消えてしまいます。 イミディエイトウインドウでは、199行までしか表示できないのでしょうか? 私がoffice2003だからですか?

  • VB2010で、変数の宣言がわかりません。

    VB2010で、変数の宣言がわかりません。 Option Explicit Public i, j, k, l As Long Public ii, jj, kk, ll As Long Public lngFileSuu As Long Public strTemp As String ・ ・ ・ と標準モジュールに宣言すると エラーがでています。 VB6.0とは宣言方法が違うのでしょうか? 教えてください。よろしくお願いします。

専門家に質問してみよう