- ベストアンサー
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)
- オフィス系ソフト
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Public宣言した変数は、ファイルを閉じるまで値を保持します。 これは異なるマクロでの値の共通化や、 同一のマクロの繰り返し使用でのカウントアップに使うためです。 そのマクロ内だけで完結する場合は、 初期値にリセットする。:i = 0 マクロ内で変数宣言:Dim I As Long(パブリックは使用しない) のどちらかになると思います。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17068)
VBの基礎であって、(プログラミング言語一般の基礎でもある)Googleで「VB Public変数とは」とかで照会すれば、沢山の解説が有る。 またVBの解説書には必ず最初のほうに解説が有る事項。そういうものを1読してみましたか。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_p02.htm Public Static 変数のスコープ グローバル変数 ローカル変数
お礼
ありがとうございます。調べてみます。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>Publicで宣言しているから起きる現象? 関係ありません。 Publicの場合は、他のモジュールからもこの変数を参照出来るだけです。 Privateの場合は、他のモジュールから変数を参照する事はできません。 >Public i As Long として、プロシージャー外でグローバル変数として宣言しているので、実行の都度加算されて行きます。 http://www.k1simplify.com/vba/tipsleaf/leaf330.html
お礼
グローバル変数ですか。 調べてみます。 ありがとうございます。
関連する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 ++++++++++++++++++ としたら、エラーになりました。
- ベストアンサー
- Visual Basic
- 「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が返らない理由を教えてください。よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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とは宣言方法が違うのでしょうか? 教えてください。よろしくお願いします。
- ベストアンサー
- Visual Basic
お礼
ファイルを閉じるまで値が保持されるのですね。 ありがとうございます。参考になりました。