冒頭の写真は、VBAのマクロで、Controlオブジェクトを並べて表示しました。
そして、コマンドボタンを押すとメッセージボックスが表示されるイベント。
以前の投稿では、コントロールオブジェクトを表示するコード記述まででした。
それで、UserForm1.Controls.Addの関数では、イベント処理がややこしいの。
個々にコントロールを挿入すれば、クリックイベントのプロシージャもできる。
ほぼ自動的に作られる感じですが、上記の関数では一工夫が手作業で必要です。
つまり、関数で複数コントロールを一挙に作るから、どれが押されたのか不明。
実は、コントロールを集団にして、これを配列にしてどう押されたのかを判定、
このために、クラスモジュール内で配列を紐づけして、この定義を先ず宣言だ。
まあ、”Public WithEvents As MSForms.CommandButton”という呪文です。
もちろん、この配列をこさえるプロシージャにも、関連づける呪文が必要なの。
冒頭に、”Private ctrl() As New Class1”のクラスモジュール用変数を定義する。
こうした一連の紐づけさえわかれば、どうってことないVBAのコードなんだな。
ただ、ネットで見受けられる説明は、わざとややこしくしたような説明が多い。
というわけで、決定版というほどのものでもないが良質なお見本を提示します。
ユーザーフォーム自体のサイズは、エディターを使ってプロパーティのリストから適当に数値を入力してもらいますが、幅、高さとも280で設定すれば、コマンドボタンがはみ出しませんので、ぜひ、サンプルを作って起動実験をしたもらいたいと思うのでした。
※ユーザーフォームに記述するコード
Private Sub UserForm_Initialize()
Call Act 'モジュールプロシージャをコール
End Sub
※モジュールに記述するコード
Private ctrl() As New Class1 'クラス1のクラスモジュール指定
Sub Act()
Dim i As Long, Btn As Object
ReDim ctrl(1 To 42)
i = 1 'ボタン作成の変数
Rtrn: 'GoToで疑似ループ処理
Set Btn = UserForm1.Controls.Add("Forms.CommandButton.1", "CommandButton" & i)
With Btn 'ラベルの詳細を設定
.Width = 36
.Height = 36
.Left = LftNr(i)
.Top = TpNr(i)
.Font.Size = 16
.Font.Name = "メイリオ"
.Caption = i
End With
Set ctrl(i) = New Class1 'クラス1のクラスモジュール配列作成
Set ctrl(i).Button = UserForm1.Controls("CommandButton" & i)
i = i + 1
If i <= 42 Then GoTo Rtrn
End Sub
Private Function LftNr(ByVal i As Long)
Dim j As Long
j = i Mod 7
Select Case j
Case 1
LftNr = 10
Case 2
LftNr = 10 + 36 * 1
Case 3
LftNr = 10 + 36 * 2
Case 4
LftNr = 10 + 36 * 3
Case 5
LftNr = 10 + 36 * 4
Case 6
LftNr = 10 + 36 * 5
Case 0
LftNr = 10 + 36 * 6
End Select
End Function
Private Function TpNr(ByVal i As Long)
Select Case i
Case Is <= 7
TpNr = 25
Case Is <= 14
TpNr = 25 + 36 * 1
Case Is <= 21
TpNr = 25 + 36 * 2
Case Is <= 28
TpNr = 25 + 36 * 3
Case Is <= 35
TpNr = 25 + 36 * 4
Case Is <= 42
TpNr = 25 + 36 * 5
End Select
End Function
※クラス1モジュールに記述するコード
Public WithEvents Button As MSForms.CommandButton
Private Sub Button_Click() 'クリック動作のイベントプロシージャ
MsgBox Button.Caption
End Sub
0 件のコメント:
コメントを投稿