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
No.6ベストアンサー
- 回答日時:
質問者さんの話から少し離れて、専門的になってしまうのですが、
#5さんの引用先の
Microsoft サポートの中「 Public 宣言された変数の有効期間」の
「モジュールの編集、プロジェクトの構造の変更、コンパイルエラーの発生、参照設定の変更、デザインモードへの切り替え、コントロールを削除して [元に戻す] を実行するなどのタイミングで変数が破棄される場合があります。」
これ話自体はごもっともというか、実務的にはあまり意味がありません。一般的に問題になるのは、コンパイルエラーじゃなくて、たぶん、Runtime Error やEndメソッドです。
Rumtime Error は、On Error Goto ErrHandler 等のエラートラップで回避できますが、しかし、End メソッドは使えません。
要するに、Sub ---> End Sub や Function ---> End Function という括りを終えないと、モジュールレベル変数やPublic 変数が飛んでしまうわけです。だから、End メソッドが使えません。
以下は、二回以上繰り返します。End をコメント・ブロックしたりしなかったりして、違いを比べてみるとよいです。
Dim i As Variant
Sub Main2R()
If i = "" Then
SubTest2
End If
MsgBox i
End '←End メソッドがあると、変数が確保できません。
End Sub
Sub SubTest2()
i = 1
MsgBox "Let " & i
End Sub
変数というものは、代入された値であって、その都度変化するものですから、ひとつのルーチンの中で確保されればよいはずです。それ以上のスパンを考えないほうが良いのかもしれません。参照渡してもよいのですが、例えば、プロシージャからUserForm に渡す場合などは、Public変数のほうが楽なのです。
定数なら、Public Const にすればよいのであって、わざわざ、変数に置く必要はないです。変化するもので固定的に置きたいなら、格好は悪いですが、私は、CustomPropertiesに置いたり、iniファイルに置いたり、秘匿性のものなら、レジストリに置いたりします。まだ、一般の人には分からない場所もあります。人によっては、PERSOANAL.XLS(b)の非表示のシートに置いているようですが、PERSONAL.XLS(b)は、脆弱性があるのでお勧めしません。MSでも、アドインの中のシートひとつを書き込みはしないものの値を置いているものもあるようです。(書き込みはしないはずです。書き込みをすると、デジタル署名が壊れるはずです)なお、私は、シートや非表示シートを使うことは滅多にしません。あくまでも、VBAはVBAの領域の中で処理しようとします。Excelは、他のOfficeと違って、標準モジュールを使い、そのモジュールとそのプロシージャは、分離して使うことがあるから、グローバル変数を多用するのだと思います。
No.5
- 回答日時:
これは、かなり有名な問題だったと思います。
[VBA] Public 宣言された変数の有効期間
http://support.microsoft.com/kb/408871/ja
Access では、普通に対策しておけば、あまりお目にかかりませんが
Excel では頻繁に遭遇してしまいます。
対策としては、ブックを開いている間有効にしたい変数は
ワーク用の非表示シートを作成し、そこに書き込むようにしています。
No.3
- 回答日時:
testmain()を実行した後に該当ファイルを保存したりすると変数の値はリフレッシュされますがいかがでしょうか
ところで
MsgBox test
は何を表示しようとしたのでしょうか?
No.2
- 回答日時:
>public変数を使用してもプロシージャが終了すれば変数はクリアされるのでしょうか?
>構造化の方法の問題上参照渡しや、戻り値など、指定する方が複雑になっていきます。
Public ステートメントは基礎レベルですから、ここでつまずいてしまうと、その先の組み立ては難しいかと思います。
サンプルコードとしては、VBAの試験では以下のような内容が出てきます。
標準モジュールで、Public ステートメントは、主に明示的に入れるわけです。
Dim i As Variant
Sub Main1()
MsgBox i '(1)
SubTest1
MsgBox i '(2)
End Sub
Sub SubTest1()
i = 1
End Sub
'では、上のコードを具体的に使えるようなコードにする場合は、
'すでに変数を宣言されているとします。
Sub Main2()
If i = "" Then
SubTest2
End If
MsgBox i
End Sub
Sub SubTest2()
i = 1
End Sub
>public変数を使用してもプロシージャが終了すれば変数はクリアされるのでしょうか?
そういうことはないけれども、エラーなどが発生したりすると、モジュールレベルやグローバルの変数等は抜けることがあるので、実際のコードでは、上記のMain2()のように常に抜けを確認しなくては使い物にはなりません。
意外に厄介なコードになります。これを確実にするなら、Class を利用することになりますが、VBA等では、読みにくくなるかもしれません。
参照渡しのほうが確実ですが、それは、内容にもよります。
No.1
- 回答日時:
testsubのmsgboxで「1」と表示されます。
testmainで、i=5とすれば、
testsubのmsgboxで「5」と表示されます。
これでいいのではないですか。
もし、うまくいかないとすれば、
このコードのせいではなさそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
コーピングについて教えてください
皆さんはストレスを感じたとき、どのような方法や手段、テクニックで対処していますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
再度,ExcelVBA,public変数が消える
Visual Basic(VBA)
-
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
-
4
VBA public変数はどのようなことをしたら解放されますか?
Visual Basic(VBA)
-
5
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
6
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
7
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
8
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
9
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
10
Excel VBAで、ユーザーフォームをモードレス表示している間、処理を止めるには?
Visual Basic(VBA)
-
11
Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。
Visual Basic(VBA)
-
12
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
13
フォーム上の現在アクティブなコントロールの取得
Access(アクセス)
-
14
VBAでダブルコーテーション入りの数式をセルにセットしたい
Visual Basic(VBA)
-
15
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
16
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
17
VBAで別モジュールへの変数の受け渡し方法
Visual Basic(VBA)
-
18
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
19
特定のファイルのみリボンの非表示、ウィンドウサイズの固定
Excel(エクセル)
-
20
Excel vba ListBoxについて
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
Excel VBAで「プログラム実行」...
-
Accessでグローバル変数を宣言...
-
Access2016 VBA ボタンのイベン...
-
VBAのプロシージャー間で、変数の受...
-
Access VBA ラベル印刷開始位置...
-
VBA プロシージャの名前の取得
-
callで順に実行されるプロシー...
-
PL/SQLのエラーについて
-
sp_executesqlを実行してもテー...
-
或るプロシージャの呼び出し元判定
-
excel/vba/public変数
-
イベントプロシージャが動作しない
-
【Excel VBA】 WorksheetやRa...
-
ACCESS マクロをモジュールに変...
-
vbaでブックを開いたときにコン...
-
アクセスのVBについて
-
Statement ignored というエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
callで順に実行されるプロシー...
-
VBA プロシージャの名前の取得
-
【Excel VBA】 WorksheetやRa...
-
或るプロシージャの呼び出し元判定
-
Excel VBAで「プログラム実行」...
-
OutlookVBAで作成したマクロに...
-
Accessでグローバル変数を宣言...
-
ACCESS2007インポート時の空白...
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
excel/vba/public変数
-
エクセルVBAが対応できるプログ...
-
Accessのプロシージャ名が勝手...
-
ブックオープン時にテキストボ...
-
ACCESS マクロをモジュールに変...
-
Excel97のVBAで、出てくるPubli...
-
DB2でのストアドプロシージャの...
-
VBAのプロシージャー間で、変数の受...
おすすめ情報