2024年11月1日金曜日

ネットの投稿が、わざと分かりずらく書いていると邪推してしまうような説明を糺す(その①) ー フォームコントロールの動的作成(VBAマクロ)

       
冒頭の写真は、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 件のコメント:

コメントを投稿