非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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]

スポンサーリンク

 - Excel, VBA