2024年11月15日金曜日

ワークシートにフォームコントロール(ボタン等)を複数配置する方法で実験してみた ーButtonオブジェクト(VBAマクロ)

         
ワークシートには、ActiveXを使用しないフォームコントロールが存在します。
コマンドボタンなど各種が重複していますが、VBAを使用せずに使えるらしい。

マイクロソフトのホームページにも書いてあるぐらいだから、間違いないはず。
でも、VBAに慣れ親しんでしまった自分には、コードを書いた方が簡単ですな。

まあ、どちらもしてもクリックすれば紐づけられたVBAのプロシージャが起動。
だから、違いはどこにあるのだろうかと思いますが、強いて言えば自由度かな。

つまり、背景の色を替えたり画像を載せたりできるのは、ActiveXに軍配です。
さて、このコントロールは、Excelワークシートに組み込まれている部品です。

もし、柔軟にプログラムを組みたいのなら、ActiveXを使えと言うことだろう。
それで、冒頭の写真は、フォームコントロールでボタンを連続的に作りました。

このコントロールボタンは、シェイプの仲間になっているのが、面白いところ。
具体的には、”Button”として認識されて、名称は自動的に連番が振られますな。

他方、ActiveXは、追加(Add)の時点で名前を指定し直せるのとは違うんだ。
なので、”Button 10"のように間にスペースが入っているのが、少し厄介です。

たまに、スペースが悪さしかねないので、ここは名前を変更しておきたいもの。
だから、追加の後に、シェイプ(図形)の名前変更を行うような、コード記述。

しかも、複数ボタンの作成では、動的な配列でイベント挙動の管理ができない。
クラスモジュール配下で、イベント発生のコントロールを認識できないのです。

なので、作った一個一個のコントロールのイベントプロシージャ作成が必要だ。
これが、やっぱり面倒臭いのですが、コピペして行けばなんとかなるでしょう。

というわけで、サンプルコードを載せておくので使いたいなら使ってください。
今まで、数の少ないコントロールの配置では、一個一個を手作りしていた分けですが、たくさん作るとなると、追加(Add)コマンドが便利な分けでして、作った後に、どう制御するかはノウハウが必要なのだと思うのでした。

※参考コード・すべて標準モジュールに記述してOK
Sub Act()
Dim i As Long, Cll(42) As Variant, str As String
 i = 1   'ボタン個数:42
Rtrn: 'For Nextのループ処理作成でも構わない 
  Set Cll(i) = ActiveSheet.Buttons.Add(LftNr(i), TpNr(i), 36, 36)
    str = "" '各ボタンに紐づけされたプロシージャ名を作成
      str = str & "Button"
        str = str & i
          str = str & ""
With Cll(i)  'ラベルの詳細を設定
  .Name = "Button" & i
    .OnAction = str '各ボタンに紐づけされたプロシージャの指定
      .Font.Size = 20
        .Font.Color = vbRed
      .Font.FontStyle = "Bold"
    .Font.Name = "Wandohope"
  .Characters.Text = i
End With
  i = i + 1
    If i <= 42 Then GoTo Rtrn 'ボタンが42個までGoToのループ処理
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

Sub Button1() 'コントロール名称がプロシージャ名
MsgBox "1"
End Sub

Sub Button42() '冒頭画面:実行結果/必要分プロシージャ作成が面倒
MsgBox "42"
End Sub

※ボタン名称一覧出力のサンプルコード
Sub BtnNme()
  Dim objct As Object
    For Each objct In ActiveSheet.Buttons
      Debug.Print objct.Name
    Next objct
End Sub



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



0 件のコメント:

コメントを投稿