• ベストアンサー

Form1からForm2へ変数を送る

VBの初心者です。 下のようにコードを記述してみました。 ・Form1のdNameをForm2へ送り、ラベルに表示。 ・変数dNameは標準モジュールで定義。 **Form1** dName = delname.Text Form2.Show **Form2** Label.Caption = dName **標準モジュール** Dim dName As String しかし、ラベルにdNameの値が表示されません。 なにか良い解決策を教えてください。 あと、標準モジュールについてわかりやすく教えて下さい。

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

  • ベストアンサー
  • tochanx
  • ベストアンサー率37% (12/32)
回答No.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が宣言されていない」 と警告してくれます。

hiromu0103
質問者

お礼

丁寧で簡単にわかりやすく説明してくださってありがとうございます。 VBって勝手に変数つくっちゃうんですね。初めて知りました。 変数の宣言を強制することができるんですか。さっそく利用してみます。 ありがとうございました。

その他の回答 (5)

回答No.5

#4です。 大事な箇所が抜け落ちておりました。 皆さんが言われているように、 Dimではなく「Public」で定義ですね。 Publicとするとアプリケーション全体から参照できます。

hiromu0103
質問者

お礼

Publicは全体から参照できる。 頭に叩き込みました。ありがとうございました。

回答No.4

Form2のコードはどのイベントに書いているの? 貼り付ける対象のイベントが間違っていると、希望したような動作になりませんよ。 Form2のコードを、 希望するタイミングのイベント (たとえばフォームが表示されるときならLoadイベント、 コマンドボタンをクリックしたときならclickイベントなど)に貼り付けてください。 標準モジュールは、 アプリケーション全体から呼び出す可能性のあるルーチンや変数・関数をおいておく場所として便利です。 例で言えば、dNameをForm1からもForm2からも参照するような場合に、 標準モジュールで定義しておくと、どちらのフォームからも呼び出すことができます。

hiromu0103
質問者

お礼

Form2のコードはFormLoadのイベントに書いてあります。 標準モジュールって便利なんですね。もっと勉強して使いこなしたいです。ありがとうございます。

回答No.3

私もVBA初心者なので自信ありませんが。 Private Sub UserForm_Initialize() という関数を記述してそこにラベルキャプションの式を入れれば良いのではないでしょうか?

hiromu0103
質問者

お礼

ん~と。 よく意味がわからないのですが・・・。 Private Sub UserForm_Initialize() これはいったい何をしてるのですか? とりあえずは、他の方のおっしゃった方法(DimじゃなくてPublicで宣言)でいきたいと思います。

  • Kate077
  • ベストアンサー率37% (23/62)
回答No.2

Public dName As String と宣言すればうまく行きますよ。 Dimは、簡単に言うと、そのFormや標準モジュールの中のみ有効。 標準モジュールはForm1、Form2で共通して仕様することができるといった イメージなので、質問のような使い方をしたいところですが、 宣言が、この中でしか使わない。となっている為に参照されないのです。 簡単にですが、こんな感じで解りますか?

hiromu0103
質問者

お礼

よく解りました。 簡単にして教えてくださってありがとうございます。

  • tochanx
  • ベストアンサー率37% (12/32)
回答No.1

標準モジュールでのdNameの宣言を変更すればうまくいきました。 Public dName As String として下さい。 Publicとは変数をプログラム全体から見えるようにするための修飾子です。 PublicをつけずにDimとやってしまうとPrivate扱いになってしまい、 標準モジュールの中からしか見えなくなってしまいます。

hiromu0103
質問者

お礼

DimはPrivate扱いになってしまうんですか。 勉強になりました。 ありがとうございます。

関連するQ&A

  • モジュール→コントロールの操作

    VB6で作られたプログラムをVB2008の言語に直しているのですが、あるモジュールから任意のフォーム(Dfrom)上にあるコントロール(Label1)を操作するプログラム?があります [VB6] Dim DForm as form Dform = TextBox1.text DForm!Label1.Caption = Msg これをVB2008で再現しようと思ったのですが、良い方法が見つかりません。 MsgをPublic変数で定義して、フォーム側からLabel1.Caption = Msgとすれば楽にいけるのですが、できるだけ元の形に近い組み方で記述したいので、良い方法をお持ちの方はご享受ください

  • フォームオブジェクトのコントロール

    あるプログラムを解析していたところ、引数に応じて違うフォームのラベルに文字列を代入し・表示するというVB6で書かれた下のコードがありました。 これをVB2008で置き換えてみようと思ったのですが、 ***クラス 'System.Windows.Forms.Form' には既定のプロパティがないため、インデックス処理を実行できません。*** というエラーが帰ってきてしまいます。どのように書き換えればよろしいのでしょうか?? [VB6] Public Sub MsgBoxE(BType As Integer, MsgH As String, MsgM As String, MsgL As String) Dim DForm As Form Set DForm = Nothing 'ダイアログ選択 Select Case BType Case 0 Set DForm = DialogC Case 1 Set DForm = DialogB Case 2 Set DForm = DialogC End Select On Error Resume Next 'メッセージセット DForm!Label1.Caption = MsgH DForm!Label2.Caption = MsgM DForm!Label3.Caption = MsgL DForm.Show

  • VB6で2つのFormを使ってプログラムについて

    環境:WindowsXp VB6(SP?) 操作:2つのフォーム(1と2)1からエクセルのデータを呼び込み⇒表示⇒さらにデーター追加⇒     コマンドボタンを押して2を表示⇒一部1のデータをラベルに表示してさらにデータ追加⇒     コマンド」ボタンを押して1と2のデータをエクセルの帳票に登録・保存     以上のことを繰り返す。     この間2フォームの登録・保存で2のフォームはアンロードする。 質問:1順目はうまくいくのですが、2順目になると、パブリック変数を使用して、テキストやラベルに表    示された、ものはうまくデーターが反映されるが、それ以外は、フォーム上では表示されていて     もdebug.printすると、データーが空欄になっているため、登録・保存できない。     例:'****Form1***** Public ex As String Form2.Show End Sub '******Form2******** Private Sub Form_Load() Label1 = Form1.ex End Sub このとき、2順目のForm1.exは””でもForm2のLabel1にはデーターが表示されている。             なにがいけないのかが、いろいろネットで調べてもよくわからないので、どなたか教えてくだ      さい。(initilizeとかをせっていすべきなのか?)      ただ、まだVB6をはじめて半年ほどですので、よろしくおねがいいたします。

  • VB6では、Applicationは未定義なのでしょうか?

    VB6を使ってプログラムを書いているのですが、以下のソースの部分で エラーになりました。 Dim winname As String winname = Application.Caption <-- Applicationが未定義?  コンパイルエラー 変数が定義されていません。 というエラーメッセージが表示されます。 VB6では、Applicationは未定義なのでしょうか?

  • クラス間(Form間?)で使える変数の設定方法(VB.NET)

    VB.net(Visual Studio)で現在プログラムの勉強をしています。 現在のスキルとしまして、変数,引数,グローバル変数,サブルーチン等を勉強しました。 残念ながら、他のプログラム言語等は勉強した事がありません。 <目的> 現在1つのアプリケーション内でForm1,Form2,Form3と作り Form1のText.Boxに入力された値を変数としてボタンを押すと各Formのラベルに 変数を渡し表示させたいと考えております。 <問題点> しかしプログラムを作っても波下線が出てプログラムのデバックが開始できません。 おそらくどこかがおかしいと思うのですが判りません。 <質問内容> 下記のサンプルの中でおかしいコードや根本からやり直す必要なコードがあれば ご教授願えますでしょうか? <サンプル> -----Form1------ Public Class Form1 Public TextBox1noNakami as strig Private Sub Button1_click(Byval sender As System.Object,Byval e AS System.EventArgs) Handles Button1_click TextBox1noNakami = TextBox1.text Form2.show() Form3.show() End Sub End Class -----Form2----- Public Class Form2 Public TextBox1noNakami as Form1 Private Sub Form2_Losd(Byval sender As System.Object,Byval e AS System.EventArgs) Handles MyBase.Load label1.text = TextBox1noNakami End Sub End Class -----Form3----- Public Class Form3 Public TextBox1noNakami as Form1 Private Sub Form3_Losd(Byval sender As System.Object,Byval e AS System.EventArgs) Handles MyBase.Load label2.text = TextBox1noNakami End Sub End Class

  • Formの間に値を渡すことについて

    素人の質問が以下のとおりです。 【Form1の設置:】 TextBox1 Button1 【Form2の設置:】 Label1 【要求:】 1. Form1のTextBox1に値(文字)を入力して、Button1をクリックすれば 2. Form2のLabel1からTextBox1に入力された値(文字)を表示される。   要するFormの間に値を渡すことです。 もちろん、ネットでも調べましたが、説明されたことをよくわからなかったのでシンプルなコードが頂きたいです。 自分が作ったNGものもアップします。 ------------------Form1内に記載した内容------------- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim tmpMsg As String tmpMsg = TextBox1.text   Dim frmFrom1 As New Form1 frmFrom1.Show(tmpMsg) End Sub ---------------------------------------------------- ------------------Form2内に記載した内容------------- Public Class Form3 Private Sub Form2_Load(ByRef tmpMsg As String) Label1.Text = tmpmsg End Sub End Class ---------------------------------------------------- 結果として、エラーがなかったが、label1に何も表示されなかったです。 宜しくお願い致します。^@^

  • コードの添削お願いします(変数エラー)

    Option Explicit Private Sub CommandButton1_Click() Dim myStr As String If myStr <> "" Then myStr = TextBox.Value Label1.Caption = LTrim(myStr) Label2.Caption = RTrim(myStr) Label3.Caption = Trim(myStr) Else MsgBox "終了" End If End Sub 変数のエラーが出ますが、何処がおかしいですか? 宜しくお願い致します。

  • Formオブジェクトについて

    Formオブジェクトに関する質問です。 ある関数にフォームオブジェクトを引数として渡してやりたいのですが、何かよい方法はありますでしょうか? 例) Private Sub cmdTest_Click(Index as Integer) Dim frm as Form If Index = 0 then Load_Test(Form 2) Else Load_Test(Form 3) End if End Sub Private Sub Load_Test(frm as Form) frm.Show frm.Label1.Caption = "TEST” End Sub

  • 「変数の宣言」と「変数の定義」は同じ意味ですか?

    Dim myStr As String は、変数の宣言と定義、どちらになるのでしょうか? どちらともいいますか?

  • Mid関数(2)

    VB6.0でタイピングソフトを作成しています。KeyPressの入力判定で、入力された文字とLabel1に表示されている文字が一緒なら、その文字を消すという処理なんですが、 Private Sub Form_KeyPress(KeyAscii As Integer) Label1.Caption = "taipingu" If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then Dim ss As String ss = Label1.Caption Mid(ss, z, 1) = " " Label1.Caption = ss z = z + 1 End if というやり方を教えていただいてやってみたのですが、 「If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then」の部分で 「プロシージャの呼び出し、または引数が不正です」 というエラーが出てしまいます。しかも、このエラーが出ずに実行がうまくいくときもあります。 何故このエラーが出るのか、分かる方お願いします。

専門家に質問してみよう