ワークシートには、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