[[20120517111530]] 『フォームの値を別フォームに』(nin) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フォームの値を別フォームに』(nin)

2つのフォームの値の受渡しについて質問です。
UserForm1は、データを入力する
UserForm2は、UserForm1の中のTextBox1の検索する為のフォームとなっています。

二つとも開いた状態で、UserForm2で該当する内容が検索により見つかった場合、
UserForm2を閉じた後、その値をUserForm1のTextBox1に入力させたいのですがうまくいきません。

UserForm2の検索はリストボックスになっており、
リスト内でクリックすると4ケタの数値を取得します。

その4ケタの数値を、UserForm1のTextBox1に入れる方法です。

TextBox1.SetFoucus
TextBox1=a
とするとエラーになります。

説明がうまくいきませんが、よろしくお願いします。


>UserForm2を閉じた後
閉じた後でなければ都合が悪いのですか?
UserForm2で目的の値は取得できているようなので、
UserForm1も開いている状態なら、同時に、

 UserForm1.TextBox1.Value = 取得した値

とするのが簡単なように思えます。
(みやほりん)

できました。助かりました。
ありがとうございました。

(nin)


 解決後ですが、インターフェースという観点からの私の意見です。

 >UserForm1.TextBox1.Value = 取得した値
 このコードをそっくりそのまま、採用したなら、
 おそらくは、UserForm2のモジュール内に情報が得られた後に
 記述しているのだと思います。

 でも、そうすると このUserForm2というオブジェクトが作成する情報の出力先は、
 UserForm1のTextbox1 と限定されてしまいますよね?

 将来、同じような情報を別の場所に出力したいという事象が発生した場合、
 面倒なことになりそうですよね!!

 UserForm2では、何らかの情報を出力しているとすると本当は、

 UserForm1のモジュール側で

 UserForm2.show textbox1  

 なんて記述が出来て情報の出力先をパラメータで渡せたり、

 Textbox1.Value=UserForm2.show

 というようにUserForm2のShowメソッドがFunctionプロシジャーのような機能を持っていたり

 すれば良いのですよね?

 当然ですが、上記のような記述は、できないですよね?

 が、このようなインターフェースがあれば、出力先は固定されませんよね!!

 UserForm2というオブジェクトに 出力用のプロパティを持たせると近いインターフェースが可能です。

 プロパティ名を result とすると、

 UserForm1側のモジュールに

 With UserForm2
    .Show
    TextBox1.Value=.result
 End With
 Unload UserForm2

 こんな記述は、UserForm2のインターフェースを工夫すると、作成可能です。
 こんな工夫を考慮すると、再利用可能なコードが増えていくと思いますよ!!

 検討してみてください

 ichinose


 追伸  簡単な例題です。

 新規ブックにて

 ユーザーフォームを二つ用意してください UserForm1 UserForm2

 コントロール構成

 UserForm1
      Textbox1      テキストボックス
      CommandButton1   コマンドボタン

 UserForm2
      CommandButton1   コマンドボタン

 UserForm2のコマンドボタンをクリックすれば、プロパティ resultを通し、2という情報を返すようにしています。

 プロパティresultについて

 Variant型の配列を返します

 result(1) ----0:データ確定   1:データ不確定
 result(2)-----出力データ 常に2を返す

 Userform1のモジュール

 Option Explicit
 Private Sub CommandButton1_Click()
    With UserForm2
       .Show
       TextBox1.Value = ""
       If .result(1) = 0 Then
          TextBox1.Value = .result(2)
       End If
    End With
    Unload UserForm2
 End Sub

 UserForm2のモジュール

 Option Explicit
 Private myarray(1 To 2) As Long
 'myarray(1) ----0:データ確定   1:データ不確定
 'myarray(2)-----出力データ
 Property Get result() As Variant
    result = myarray
 End Property
 Private Sub CommandButton1_Click()
    myarray(1) = 0
    myarray(2) = 2 '例題なので常に2を返す
    Me.Hide
 End Sub
 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
       myarray(1) = 1
       Cancel = True
       Me.Hide
    End If
 End Sub

 標準モジュール

 Sub test()
    UserForm1.Show
 End Sub

 testを実行してください。

 UserForm1が表示されます。

 コマンドボタンをクリックすれば、UserForm2が表示されます。

 コマンドボタンをクリックすれば、Userform1のテキストボックスに2を返し、
 閉じるボタンでは、テキストボックスをクリアします。

 ichinose


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.