動的作成したコントロール同士の連携
例えば
スライダーとテキストボックスを連携させて
スライダーを動かしたらその値を連携しているテキストボックスに表示
テキストボックスに数値を入力したらその数値を連携しているスライダーに反映
こんな動き
動画を見たほうが早いかな
今までは回りくどい無駄な書き方をしていたけど
少しまともな書き方ができたのでメモ
クラスモジュール(Class1)
Private WithEvents exSL As MSComctlLib.Slider
Private WithEvents exTB As MSForms.textBox
Private myForm As Object
Public Sub AddSlider(c As MSComctlLib.Slider, myTextBox As MSForms.textBox, myUserForm As Object)
Set exSL = c
Set exTB = myTextBox
Set myForm = myUserForm
End Sub
Private Sub exSL_Scroll()
exTB.Text = exSL.Value
Call myForm.testOne(exSL)
End Sub
Private Sub exTB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode.Value = vbKeyReturn Or KeyCode.Value = vbKeyTab Then
exSL.Value = CInt(exTB.Text)
Call myForm.testOne(exSL)
End If
End Sub
フォームモジュール(UserForm1)
Private mySl() As New Class1
Private Sub UserForm_Initialize()
Dim Sl As MSComctlLib.Slider
Dim TB As MSForms.textBox
Dim i As Long
For i = 0 To 1
ReDim Preserve mySl(i)
Set Sl = Me.Controls.Add("MSComctlLib.Slider")
With Sl
Sl.Top = i * Sl.Height
End With
Set TB = Me.Controls.Add("Forms.TextBox.1")
With TB
.Top = Sl.Top
.Left = Sl.Width
End With
mySl(i).AddSlider Sl, TB, Me
Next i
End Sub
Public Sub testOne(Sl As MSComctlLib.Slider)
Me.TextBox1.Text = Sl.Value
End Sub
UserForm2
UserForm1は
Me.TextBox1.Text = Sl.Value
UserForm2は Me.TextBox1.Text = Sl.Value*2
違いを確認するためにUserForm2は数値を2倍
フォームデザイン画面
UserForm1もUserForm2も同じ
'初期設定、登録
Public Sub AddSlider(c As MSComctlLib.Slider, myTextBox As MSForms.textBox, myUserForm As Object)
Set exSL = c
Set exTB = myTextBox
Set myForm = myUserForm
End Sub
クラスモジュールのこれ
スライダーとテキストボックスとユーザーフォームを一度にまとめて登録
これで連携できる
今までは別々に登録してそれぞれに付けた名前で連携先を判別とかものすごい遠回りをしていたw
UserForm自体も登録することで、どのUserFormのスライダーとテキストボックスなのかも判別できるのでUserFormごとに同じようなClassを書く必要がなくなる
ダウンロード先
ファイル名:動的作成したコン
トロール同士の連携テスト.xlsm
これなんかにも使っているけど使うのは今度からにしよう
書きなおすのめんどくさい