• ベストアンサー

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

  • ACCESSで変数の保持

    ACCESSを使っていますが、いまいち分からない点があります。 フォームのイベントで、変数に値を代入するのですが、 フォームAの変数AをフォームBのイベントで確認したいのですが、うまくいきません。 良く分からない表現で申し訳ありませんが、どのようにしたら良いのでしょうか。 よろしくお願いします。

  • VBA コンボボックスで選んだ値を取得するには

    ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。 コンボボックスのコードで Private Sub ComboBox1_Change() moji1 = ComboBox1.Text Range("A1").Value = moji1 のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。 マクロ1にて、上記と同じ Range("A1").Value = moji1 というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。 原因をご存知の方はお教えください。

  • 変数に入った値を変数として扱う方法はありますか?

    変数に入った値を変数名として扱える関数などはありますでしょうか。 例えば hensu1 = "hensu2" 何か関数(hensu1) = "XYZ" と記述すると 変数「hensu2」に"XYZ"の値が入っているというものです。 宜しくお願い致します。

  • Visual StudioC#で、変数を見る機能

    Visual StudioC#には、作ったプログラムを実行しているときに変数がどんな値になっているのかを見る機能って無いのでしょうか? Microsoft Visual Studio 2010 Expressを使っています。 例えば、 ボタン1を押す→A=1代入 ボタン2を押す→B=2代入 ボタン3を押す→C=3代入 上のだと、今までだとテキストボックス3つに各変数の値を表示していました。でもいちいち全てをそんなデバッグするの面倒です・・・実行中に直接、Visual Studio上で変数の値を見ることってできないのでしょうか? よろしくお願いします。

  • EXCELのVBAについて

    エクセルのVBAでユーザーフォームに作ったテキストボックスに入力した値を、コマンドボタンによる「実行」とともに別に作った標準モジュールの変数として代入するにはどうすれば良いでしょうか? 具体的な流れは、 マクロ実行  ↓ ユーザーフォーム出現  ↓ テキストボックスに数字を代入→「実行」  ↓ 変数を代入された標準モジュールによる処理完了 というものです。 ご教授お待ちしております。

  • Access2000でTextBox変数の代入

    Access2000でTextBox変数を作成し、条件に応じて フォーム上に配置した2つのテキストボックスをその変数に代入したいのですが、うまくいきません。 Public tBox as TextBox If i = 1 Then Set tBox = テキスト1 ElseIf i = 2 Then Set tBox = テキスト2 End if ※ テキスト1、テキスト2はフォーム上に配置した テキストボックスの名称 このコードを実行すると、テキスト1は テキスト1.Textと解釈され、Textプロパティに何も設定 されていない場合、tBoxにはNULLが代入されます。 Textプロパティの値ではなく、テキストボックスオブジェクトそのものを変数に代入するにはどうすればよいのでしょうか。 ご教授お願いします。 環境は OS:Windows2000 Professional   Access2000 です。

  • 基本ですがVBA教えてください。

    access2000を使っています。Aというフォームにボタンをつくり、Bというフォームを開きたいと思っています。Bというフォームは、単票式でつくってあり、[社員ID][社員名][グループ名]となっております。 このとき、Aのフォームの【高木さん】というボタンを押すと、Bのフォームの高木さんのページが開くようにしたいです。どうやってコードを書いていいのかわかりません。。。教えてください。

  • [Access]あるフォームのクラスモジュールで値を入れた変数を他のフォームでそのまま利用したい

    モジュールとクラスモジュール(イベントプロシージャ)に違いがあることや、モジュールを超えて変数を利用したいときは、Publicで宣言する、という辺りを本を読んでおおまかに理解しました。 帳票管理フォームというフォームに受付CDという主キーの番号があります。そのフォーム上に帳票の詳細な事項を入力するフォームを呼び出すボタンがあります。フォームのイベントプロシージャの一番上のOption Compare Database,Option Explicitの直下行にPublic UketukeCD as Integerと宣言し、 ボタンのイベントプロシージャで、 UketukeCD = Me![受付CD].Value などと記述しました。 新規入力データの受付CDが例えば452ならUketukeCDには452が代入されればいいんです。 帳票の詳細な事項を入力するフォーム(報告書フォームとします)の「読みこみ時」のイベントプロシージャに以下のように記述しました。 こちらのモジュールの一番上にもPublic UketukeCD as Integerと宣言し、(←これは必要なんでしょうか?) Me![受付CD].Value = UketukeCDと書きました。 過去のデータを検索するときはレコードソースのテーブルの受付CDのデータを受付CDフィールドに持ってき、新規入力の場合は、受付CDは帳票管理フォームのものを代入するという設計で、UketukeCDの値(例:452)を報告書フォーム内の受付CDフィールド内に出力する、という感じですが、なぜかUketukeCDにはいつも0が代入されています。 変数は他のモジュールで利用できても代入された値までは移行されないのですか? イベントプロシージャだからできないんですか? 字数の制限上、コードをかなり省略しています。 足りない部分は補足で補いますのでおっしゃって下さい。

  • テキストボックスの値を変数に代入したい。

    テキストボックスの値を変数に代入したいのですが、どういうコードを書けばいいですか? 例えばTextBox1の値を変数xに代入したいのですが。

  • EXCEL2010 VBA 変数への代入

    EXCEL2010のVBAを使用しています。 処理で繰り返しの処理があります。 繰り返しのたびに変数Aに変数A+セルの番地(A1等)を代入していきたいのですがうまくいきませんどうすればよいでしょうか? 説明が下手ですみません。 ようするに変数の中の値を上書きせずに、現在の値を後ろに追加したいということです。 (例) 変数Bは最初は「1」 繰り返し1回目  変数A =変数A&Cells(1,変数B)   ’変数Bは繰り返しのたびに1ずつ増えます 繰り返し2回目  変数A =変数A&Cells(1,変数B) 一回目は変数AにはA1が入る 2回目の処理時にはA1B1というふうになり、上書きされず追加で代入される。 というようなイメージです。