- ベストアンサー
Form1からForm2へ変数を送る
VBの初心者です。 下のようにコードを記述してみました。 ・Form1のdNameをForm2へ送り、ラベルに表示。 ・変数dNameは標準モジュールで定義。 **Form1** dName = delname.Text Form2.Show **Form2** Label.Caption = dName **標準モジュール** Dim dName As String しかし、ラベルにdNameの値が表示されません。 なにか良い解決策を教えてください。 あと、標準モジュールについてわかりやすく教えて下さい。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#1です。ちょっと補足です。 質問者さんの提示したコードでは何が起こっていたのかを書きます。 まずForm1での変数dNameへのdelname.Textの代入ですが、 Form1からは標準モジュールでDimとして宣言されたdNameは見えません。 見えないのでVBが自動的にForm1用に変数dNameを作ります。 Form1のコードに自動的にDim dNameを書き込むイメージです。 Dim dNameという風にAs Stringなどの型宣言を抜きにすると自動的にAs Variantと宣言したことになります。 そしてForm1用に用意されたdNameにテキストが代入されてForm2を表示させて、 Form2でもdNameがありますが、このdNameもForm2からはForm1や標準モジュールのdNameは見えないのでまたまたVBが自動的にDim dNameとしてVariant型のdNameをForm2用に作ります。 しかしそこでdNameは何も値が入っていません。なにしろ作られたばかりですから、つまり空っぽの状態です。 そしてLabel.Captionに空っぽの文字、つまり何も表示されないということになっていたのです。 今回のような変数に起因するトラブルを未然に防ぐにはとてもよい方法があります。 メニューのツール→オプション→編集タグとたどって、 コードの設定というところに 「変数の宣言を強制する」 というチェックボックスがありますのでそれをオンにして下さい。 これで次回からは使用する変数は必ずDimなりPublicなりで宣言しなければなりません。 たとえば今回の場合これをやっていたら、Form1でdNameに代入しようとした時点で 「変数dNameが宣言されていない」 と警告してくれます。
その他の回答 (5)
- oshietechodai
- ベストアンサー率35% (105/298)
#4です。 大事な箇所が抜け落ちておりました。 皆さんが言われているように、 Dimではなく「Public」で定義ですね。 Publicとするとアプリケーション全体から参照できます。
お礼
Publicは全体から参照できる。 頭に叩き込みました。ありがとうございました。
- oshietechodai
- ベストアンサー率35% (105/298)
Form2のコードはどのイベントに書いているの? 貼り付ける対象のイベントが間違っていると、希望したような動作になりませんよ。 Form2のコードを、 希望するタイミングのイベント (たとえばフォームが表示されるときならLoadイベント、 コマンドボタンをクリックしたときならclickイベントなど)に貼り付けてください。 標準モジュールは、 アプリケーション全体から呼び出す可能性のあるルーチンや変数・関数をおいておく場所として便利です。 例で言えば、dNameをForm1からもForm2からも参照するような場合に、 標準モジュールで定義しておくと、どちらのフォームからも呼び出すことができます。
お礼
Form2のコードはFormLoadのイベントに書いてあります。 標準モジュールって便利なんですね。もっと勉強して使いこなしたいです。ありがとうございます。
- shironekoxxx
- ベストアンサー率26% (218/832)
私もVBA初心者なので自信ありませんが。 Private Sub UserForm_Initialize() という関数を記述してそこにラベルキャプションの式を入れれば良いのではないでしょうか?
お礼
ん~と。 よく意味がわからないのですが・・・。 Private Sub UserForm_Initialize() これはいったい何をしてるのですか? とりあえずは、他の方のおっしゃった方法(DimじゃなくてPublicで宣言)でいきたいと思います。
- Kate077
- ベストアンサー率37% (23/62)
Public dName As String と宣言すればうまく行きますよ。 Dimは、簡単に言うと、そのFormや標準モジュールの中のみ有効。 標準モジュールはForm1、Form2で共通して仕様することができるといった イメージなので、質問のような使い方をしたいところですが、 宣言が、この中でしか使わない。となっている為に参照されないのです。 簡単にですが、こんな感じで解りますか?
お礼
よく解りました。 簡単にして教えてくださってありがとうございます。
- tochanx
- ベストアンサー率37% (12/32)
標準モジュールでのdNameの宣言を変更すればうまくいきました。 Public dName As String として下さい。 Publicとは変数をプログラム全体から見えるようにするための修飾子です。 PublicをつけずにDimとやってしまうとPrivate扱いになってしまい、 標準モジュールの中からしか見えなくなってしまいます。
お礼
DimはPrivate扱いになってしまうんですか。 勉強になりました。 ありがとうございます。
お礼
丁寧で簡単にわかりやすく説明してくださってありがとうございます。 VBって勝手に変数つくっちゃうんですね。初めて知りました。 変数の宣言を強制することができるんですか。さっそく利用してみます。 ありがとうございました。