Excel/VBA: 値を返す先がTextBoxでもLabelでも何でもアリにする方法
汎用性の高いプログラムを作る場合、相手先の行動をどこまで許すかということに悩みます。
例えば相手のFormに値を返す場合、返す先がLabelなのかTextBoxなのかComboBoxなのかわからない場合はどうすればいいのでしょうか。
そもそも、コントロール名(Label1とかTextBox1とかComboBox1など)もわからないので、直接指定できないですね。
例えば、以下のように左フォーム(UserForm1)の各ボタンを押したら、右フォーム(UserForm2)が現れるとして、UserForm2のボタンを押すと指定したコントロールに「OK」という文字を表示させようとします。もちろん、UserForm2は共通です。返すコントロールに応じて新たに作っているわけではありません。
[ad#top-1]
まず、UserForm2に返すコントロールを指定する
以下がUserForm2の一部分です。UserForm1側からここにコールバックするコントロールを指定するわけです。TextBoxだろうがLabelだろうが、cb As Controlで受け取れます。受け取ったコントロールはPublic変数CallbackCtrlに格納します。
Private CallbackCtrl As Control Sub setCallBackControl(cb As Control) Set CallbackCtrl = cb End Sub
UserForm1側はこんな感じです。UserForm1のボタンごとに以下のように書きます。
'「Label」ボタン Private Sub CommandButton1_Click() Call UserForm2.setCallBackControl(Label1) UserForm2.Show End Sub '「TextBox」ボタン Private Sub CommandButton2_Click() Call UserForm2.setCallBackControl(TextBox1) UserForm2.Show End Sub '「ComboBox」ボタン Private Sub CommandButton3_Click() Call UserForm2.setCallBackControl(ComboBox1) UserForm2.Show End Sub
コントロールによってプロパティを変える
UserForm2で「CommandButton」を押したときの処理です。受け取ったコントロール(CallbackCtrl)がLabelだったらCaptionプロパティに、それ以外はTextプロパティを使ってOKを代入します。CallbackCtrlにUserForm1のコントロールを格納したことで、UserForm2から制御できるようになったわけです。
Private Sub CommandButton1_Click() If TypeName(CallbackCtrl) = "Label" Then CallbackCtrl.Caption = "OK" Else CallbackCtrl.Text = "OK" End If Unload UserForm2 End Sub
ソースコード全文
UserForm1
'「Label」ボタン Private Sub CommandButton1_Click() Call UserForm2.setCallBackControl(Label1) UserForm2.Show End Sub '「TextBox」ボタン Private Sub CommandButton2_Click() Call UserForm2.setCallBackControl(TextBox1) UserForm2.Show End Sub '「ComboBox」ボタン Private Sub CommandButton3_Click() Call UserForm2.setCallBackControl(ComboBox1) UserForm2.Show End Sub
UserForm2
Private CallbackCtrl As Control Sub setCallBackControl(cb As Control) Set CallbackCtrl = cb End Sub Private Sub CommandButton1_Click() If TypeName(CallbackCtrl) = "Label" Then CallbackCtrl.Caption = "OK" Else CallbackCtrl.Text = "OK" End If Unload UserForm2 End Sub
[ad#ad-1]
スポンサーリンク