第136回.フォームコントロール
リボンの開発タブにコントロールの挿入があります。
フォームコントロールをVBAで扱う場合の解説になります。
フォームコントロールは、手動でシートに配置しセルにリンクすればVBAで特段に意識する必要もないものですが、時に動的に扱いたい場合も出てくるでしょう。
ワークシートにフォームコントロールを配置し、その情報を使う場合のマクロVBAについて解説します。
フォームコントロールを追加する

コントロールの種類 | コレクション名 |
ボタン | Buttons |
コンボ ボックス | DropDowns |
チェック ボックス | CheckBoxes |
スピン ボタン | Spinners |
リスト ボックス | ListBoxes |
オプション ボタン | OptionButtons |
グループ ぼっくす | GroupBoxes |
ラベル | Labels |
スクロール バー | ScrollBars |
名前 | 必須 / オプション | データ型 | 説明 |
Left | 必須 | Single | 文書の左上隅を基準にしてテキストボックスの左上隅の位置をポイント単位で指定します。 |
Top | 必須 | Single | 文書の上端を基準にしてテキスト ボックスの左上隅の位置をポイント単位で指定します。 |
Width | 必須 | Single | テキスト ボックスの幅をポイント単位で指定します。 |
Height | 必須 | Single | テキスト ボックスの高さをポイント単位で指定します。 |
Dim sp As Shape
Set sp = ActiveSheet.Buttons.Add(0, 0, 100, 50)
フォームコントロールを削除/編集/情報取得
図形オートシェイプと同様にShapesとして扱えます
ActiveSheet.Shapes(1).Delete
ActiveSheet.Shapes("ボタン 1").Delete
Shapesコレクションのインデックスを指定して削除します。
インデックスは数値または名称で指定します。
With ActiveSheet.Shapes(1)
.Name = "名前"
.Top = 10
.Left = 10
.Width = 100
.Height = 50
.OnAction = "マクロ1"
End With
Shapeオブジェクトにはプロパティ・メソッドが多数存在します。
図形(Shape)関連のプロパティ、メソッド一覧
下記のフォームコントロールとして扱う必要があります。
フォームコントロールとして扱う
「コントロールの書式設定」の「コントロール」については他のオートシェイプにはない独特のものになります。


フォームコントロールの種類ごとに設定できるものが変わります。
恐らくWEBで検索しても目的のプロパティににたどり着くのは結構苦労すると思います。
これらを扱う時のプロパティを調べるときは「マクロの記録」を使うと良いでしょう。
ただし、マクロの記録のままではSelectが入っていて、これを単純には消し込めません。
ActiveSheet.Shapes.Range(Array("チェック 1")).Select
With Selection
.Value = xlOn
.LinkedCell = "$A$1"
.Display3DShading = False
End With
このSelectとSelectionを単純に消し込んで、
With ActiveSheet.Shapes.Range(Array("チェック 1"))
.Value = xlOn
.LinkedCell = "$A$1"
.Display3DShading = False
End With
これを実行してもエラーとなってしまいます。

With ActiveSheet.CheckBoxes("チェック 1")
.Value = xlOn
.LinkedCell = "$A$1"
.Display3DShading = False
End With
With ActiveSheet.CheckBoxes(1)
.Delete
End With
その他のプロパティについては、Shapeオブジェクトと同様に扱えます。
With ActiveSheet.CheckBoxes(1)
.Name = "名前"
.Top = 10
.Left = 10
.Width = 100
.Height = 50
.OnAction = "マクロ1"
End With
つまり、
オートシェイプと共通のプロパティだけを扱うのであれば、Shapeオブジェクトとして扱えますが、
フォームコントロール独自のプロパティを扱う時は、フォームコントロールのコレクションを指定する必要があるという事です。
セルにリンクしてあれば、VBAでは特にコントロールを意識することなく扱う事が出来ます。
以下ではコントロールから直接値を取得する方法になります。
Sub sample()
Dim ctl As Object
Dim rng As Range
For Each ctl In ActiveSheet.DropDowns
If ctl.ListFillRange <> "" Then
Set rng = Range(ctl.ListFillRange)
Debug.Print rng.Item(ctl.Value, 1)
End If
Next
End Sub
シートのすべてのコンボボックスの値をイミディエイトに出力しています。
ListFillRangeはコンボボックスの「入力範囲の指定になります。」

したがって、ListFillRangeのValue番目がドロップボックスの値になります。
上記VBAの.Itemは.Cellsで書くこともできます。
フォームコントロールを特定する方法
もちろん、できれば判別可能な名称を付けておくことが一番良いのですが、そうもいかない場合もあるでしょう
Sub sample1()
Dim sp As Shape
On Error Resume Next
For Each sp In ActiveSheet.Shapes
Debug.Print sp.Name _
; ",Type=" & sp.Type
Next
End Sub
これを実行すると、シートにある全てのオートシェイプとフォームコントロールについての情報がイミディエイトに出力されます。
このTypeプロパティで判別できます。
このTypeはMsoShapeType列挙になります。
さらに、フォームコントロールの種別はFormControlTypeプロパティをXlFormControl列挙で判別します。
名前 | 値 | 説明 |
xlbuttoncontrol | 0 | ボタン |
xlcheckbox | 1 | チェック ボックス |
xldropdown | 2 | コンボ ボックス |
xlEditBox | 3 | テキスト ボックス |
xlgroupbox | 4 | グループ ボックス |
xlLabel | 5 | ラベル |
xllistbox | 6 | リスト ボックス |
xlOptionButton | 7 | オプション ボタン |
xlscrollbar | 8 | スクロール バー |
xlspinner | 9 | スピン ボタン |
Sub sample2()
Dim sp As Shape
For Each sp In ActiveSheet.Shapes
If sp.Type = msoFormControl Then
If sp.FormControlType = xlCheckBox Then
sp.Left = sp.TopLeftCell.Left
End If
End If
Next
End Sub
シートにあるすべてのチェックボックスについて、現在配置されているセルの左端に揃えています。
これは、以下と同じになります。
Sub sample3()
Dim sp As CheckBox
For Each sp In ActiveSheet.CheckBoxes
sp.Left = sp.TopLeftCell.Left
Next
End Sub
フォームコントロールの最後に
単純にセル値を扱うだけなら、VBAも簡単になって特に苦労することもありません。
そのような場合の事前知識として記憶にとどめておく程度で構わないと思います。
同じテーマ「マクロVBA入門」の記事
第95回.ハイパーリンク(Hyperlink)
第96回.グラフ(Chart)
第97回.図形オートシェイプ(Shape)
第136回.フォームコントロール
第137回.ActiveXコントロール
第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
第135回.ジャンプの選択オプション(SpecialCells)
第141回.行・列の表示・非表示・列幅・行高
第105回.Callステートメント
新着記事NEW ・・・新着記事一覧を見る
PropertyのSetはLetでも良い|VBA技術解説(2021-03-31)
エクセル麻雀ミニゲーム|VBAサンプル集(2021-03-09)
VBA100本ノック 100本目:WEBから100本ノックのリストを取得|VBA練習問題(2021-03-03)
VBA100本ノック 魔球編:2桁の最小公倍数|VBA練習問題(2021-02-02)
Select Caseでの短絡評価(ショートサーキット)の使い方|VBA技術解説(2021-01-03)
VBA100本ノック 迷宮編:巡回セル問題|VBA練習問題(2020-12-31)
VBA100本ノック 魔球編:閉領域の塗り潰し|VBA練習問題(2020-12-16)
VBA100本ノック 魔球編:組み合わせ問題|VBA練習問題(2020-12-02)
将棋とプログラミングについて~そこには型がある~|エクセル雑感(2020-11-22)
VBA100本ノック 1本目:セルのコピー|VBA練習問題(2020-10-19)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.Excelショートカットキー一覧|Excelリファレンス
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。