2024年9月2日月曜日

VBAでフォームにコントロール(ボタン等)を動的に配置する方法がわかりにくいお話 ー Controlオブジェクト(VBAマクロ)

          
ユーザーフォームをこさえるテクニックを、一つ紹介しておきたいと思います。
普通は、コマンドボタンは、実行用に一つか二つぐらいしか配置しないだろう。

でも、自分でカレンダーをマクロで作ってみたいと思うような時、どうなるか。
ネットで検索するとコードは紹介されていますが、何だか複雑怪奇な書法です。

なので、最も簡便なコードを書いてみたので、参考にしてもらえればうれしい。
ロジックの基本は、部品をループ文で(動的に)作る手法ですが、実に簡単だ。

一方、コマンドボタンを一個ずつ手作業で作り、隣合わせにするのは困難です。
なので、トライ押してみたいと思う人は、次のコードを参考にしてみて下さい。

それで、部品をループ文で動的に作る手法は、クリックイベントが動きません。
一方、手作業でフォームに作ったボタンをクリックすると、勝手に起動します。

最初の一回目で自動的なプロシージャが作られても、ループ文では音沙汰なし。
なので、クリックしたイベント判定を自分でコードをこさえる必要はあります。

というわけで、判定コードの話は次の機会に譲るとして、今回はフォームまで。
実をいうと、このコードの手法で、モグラ叩きゲームまで作成できそうなことが分かって来て、色々と頭をひねっている自分なのでした。

※参考コード
Private Sub UserForm_Initialize() 'ユーザーフォームボタンの動的な生成
Dim MxNr As Long, i As Long
  MxNr = 42    'ラベルを作る個数
    For i = 1 To MxNr    'ボタンを動的に作る(Frame1の中に)
      Set newButton = UserForm1.Controls.Add("Forms.CommandButton.1", "CMD_Btn" & i)
        With newButton  'ラベルの詳細を設定
          .Width = 36
          .Height = 36
          .Left = LftNr(i)
          .Top = TpNr(i)
          .Font.Size = 16
          .Font.Name = "Jokerman" ’変わったフォントを指定しています
          .Caption = i
        End With
    Next
End Sub

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

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



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿