• ベストアンサー

Access-VBAのPublic変数について =基本的な事です=

フォームAのテキストボックスに入力された値をフォームBで使用したいのですが、調べるとPublic変数に値を代入しておけばフォームAを閉じても値を保持できるとの事でした。 そこで、 (1) 標準モジュール(My_Moduleという名前)を作成しそこに1行Public Hensu as Long と定義しました。 (2) フォームAにボタンを作成し、そのクリックイベントに、 Hensu=Text1.Value というコードを記述しました。 (3) フォームBにボタンを作成し、そのクリックイベントに、 Text1.Value=Hensu というコードを記述しました。 フォームBのボタンをクリックすると、Text1に値が代入されるかと思いましたが、意に反しHensuの中身はNullでした。 どのようにすればフォームBで変数の値を取得することが出来るのでしょうか? ちなみにフォームAからPublic Hensuには値が代入されているようで、イミディトウインドウで?Hensuとするとちゃんと代入された値が表示されます。

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

念のため確認しましたが、Option Explicitなしでも、 質問のソースの書き方で Public 変数を参照出来ました。 My_Module.Hensu とした方が確実みたいですが、 今回の不具合の原因では無さそうですね。 ・フォームAにPublic変数を作成して解決  フォームBのソースは正常だった? ・イミディトウインドウで?Hensuと入力しEnterを押すとNull  Public変数でもなく、新規のローカル変数でもなく、  何か別の変数を参照している? 謎が多いですね。(^^; 以下、Access2000での検証結果を書いておきます。 ----My_Module---- Option Compare Database Public Hensu As Long ---------------- ----フォームA---- Option Compare Database Private Sub コマンド0_Click()  Hensu = 100 End Sub ----------------- ----フォームB---- Option Compare Database Private Sub コマンド0_Click()  MsgBox "Type: " & TypeName(Hensu) & " / Value: " & Hensu End Sub ----------------- フォームAでボタンをクリック後、 フォームBのボタンをクリックすると。 Type: Long / Value: 100

souta_n
質問者

お礼

ありがとうございます。 このコードで試してみます。 沢山アドバイスいただきまして恐縮です。

その他の回答 (3)

  • tomo316
  • ベストアンサー率35% (51/142)
回答No.3

考え方はあっているが、実装方法がまずいのでは? >(2) フォームAにボタンを作成し、そのクリックイベントに、 >Hensu=Text1.Value >というコードを記述しました。 >(3) フォームBにボタンを作成し、そのクリックイベントに、 >Text1.Value=Hensu >というコードを記述しました。 Option Explicit を入れていないために、ローカル変数Hensuが勝手に作られているのかなと思います。 (2)で「Hensu=Text1.Value」とありますが、標準モジュールのHensuを参照するためには、「My_Module.Hensu=Text1.Value」となるはずです。 (3)も同じで「Text1.Value=My_Module.Hensu」となります。 必ず、Option Explicitを全てに入れましょう。 基本です。

souta_n
質問者

お礼

お答えありがとうございます。 >「My_Module.Hensu=Text1.Value」となるはずです。 >「Text1.Value=My_Module.Hensu」となります。 なるほどそういうように記述するものなのですね。勉強になりました。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

>考え方というかコードの書き方などは問題が無いということでしょうか? 肝心な事を書きませんでしたね。(^^; 質問のコードの書き方で、問題ないと思います。 (Access2000で確認してみましたが、正常でした) 何らかのミスがあったのだと思います。 >ちなみにフォームBのコードウインドウのイミディトウインドウで?Hensuと入力しEnterを押すとNullという表示が還って来たので、変数のつづり間違いで勝手に誤字によるバリアント型変数が出来た可能性は大です。 う~ん。Null と表示されたのですね? であれば、つづり間違いではないと思います。(^^; つづりを間違えて、存在しない変数を使った場合、値は Empty で、 空行が表示されるはずです。Null ではありません。 これをテキストボックス等に代入すると Null に変換されますが、 変数の方は Empty のままです。 謎が深まりますね。(^^; ?TypeName(Hensu) としてみれば、何か分かったかも知れないですが、 もうソースは残ってないですよね? 真相は闇の中かな・・・ >Option Explicit ステートメントは使用していませんでした。 特別なこだわりがあって、使用していないなら別ですが、 通常は使用する事が推奨されます。 理由は、今回の様なバグを防ぐためです。 これを機会に、利用することを検討してみて下さい。 下記など参考になるかな。 http://www.nbcom.co.jp/PC-Support/FAQ/acc/ht/acc102002ht002.shtml http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_030.html

souta_n
質問者

お礼

再度のかいとうありがとうございました。 Option Explicitは基本中の基本と旨にします。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

>意に反しHensuの中身はNullでした。 まず、Long型で宣言した変数が Null になることはありません。 Hensu = Null とするとエラーになるはずです。 Nullを代入できるのは Variant 型です。 まず、本当に Null なのか確認して下さい。 本当に、Hensu の値が Null であれば、別の変数を参照しています。 下記の可能性が高いと思います。 ・フォームBで Hensu と言う名前が使われている。  Private で宣言した変数や、フォームに貼り付けたコントロールなどに、  同名の物があれば、そちらが優先して使われます。 次に怪しいのは、下記。 ・Option Explicit ステートメントを使用せず、変数名を間違えた場合  新しい変数が作成されます。(型は Variant 値は Empty)  Text1.Value に Empty を代入すると、値は Null になります。 ----------------------------------------------------------- 上記で解決しない場合、原因を特定するために・・・ ・Hensuの名前を変更してみて下さい。 ・Option Explicit ステートメントを使用して下さい ・デバッグ機能(ブレークポイント、ウォッチ式など)活用して下さい   フォームBの代入行にブレークポイントを指定して止め、   その状態で、ウォッチ式に Hensu を追加してみる、など。 ----------------------------------------------------------- 念のため、Public変数に関する注意事項・・・ ・起動時に初期化される ・End ステートメントを実行すると初期化される ・何かエラーが発生し、中断した場合も初期化される  (初期化されると、Long型の場合は 0 になります) 結構簡単に消えるデータなので、ご注意下さい。 一時的なデータ保存に利用するのは問題ないと思いますが、 多用は禁物です。 ----------------------------------------------------------- >フォームAのテキストボックスに入力された値をフォームBで使用したい ご存知かもしれませんが、フォームAが開いているなら、 Forms![フォームA]![Text1] で、フォームの値を直接利用する方法もあります。

souta_n
質問者

お礼

いろいろな面でアドバイス頂きありがとうございました。 考え方というかコードの書き方などは問題が無いということでしょうか? その後標準モジュールではなくフォームAにPublic変数を作成しフォームBに読み取らせるということで何とか目的は果たせました。 > Option Explicit ステートメントを使用せず、~ Text1.Value に Empty を代入すると、値は Null になります。 Option Explicit ステートメントは使用していませんでした。 ちなみにフォームBのコードウインドウのイミディトウインドウで?Hensuと入力しEnterを押すとNullという表示が還って来たので、変数のつづり間違いで勝手に誤字によるバリアント型変数が出来た可能性は大です。 いずれにせよ親切な回答ありがとうございました。

関連するQ&A