[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォームの値を別フォームに』(nin)
2つのフォームの値の受渡しについて質問です。
UserForm1は、データを入力する
UserForm2は、UserForm1の中のTextBox1の検索する為のフォームとなっています。
二つとも開いた状態で、UserForm2で該当する内容が検索により見つかった場合、
UserForm2を閉じた後、その値をUserForm1のTextBox1に入力させたいのですがうまくいきません。
UserForm2の検索はリストボックスになっており、
リスト内でクリックすると4ケタの数値を取得します。
その4ケタの数値を、UserForm1のTextBox1に入れる方法です。
TextBox1.SetFoucus
TextBox1=a
とするとエラーになります。
説明がうまくいきませんが、よろしくお願いします。
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.