VBA入門
フォームコントロール

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2019-11-15 最終更新日:2021-11-07

第136回.フォームコントロール


リボンの開発タブにコントロールの挿入があります。
フォームコントロールをシートに配置してVBAで扱う場合の解説になります。


ワークシートでフォームコントロールを扱う事の是非はありそうですが、使用することで便利かつ見栄えの良いシートになる場合もあります。

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


フォームコントロールを追加する

VBA マクロ フォームコントロール

Worksheet.コレクション.Add(Left、 Top、 Width、 Height)

戻り値は追加されたコントロールです。

コントロールに対応するコレクション
コントロールの種類 コレクション名
ボタン 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)関連のプロパティ、メソッド一覧
・Shapesコレクション ・・・ Shapeオブジェクトのコレクション ・Shapeオブジェクト ・・・ オートシェイプやピクチャなど、描画レイヤーのオブジェクト ・ShapeRangeオブジェクト ・・・ 文書の図形セットである図形範囲を表します。 ・GroupShapesオブジェクト ・・・ グループ化した図形を表します。 ・FillFormatオブジェクト ・・・ 図形の塗りつぶしの書式設定を表します。 ・LineFormatオブジェクト ・・・ 線と矢印の両端の書式を表します。 ・TextFrameオブジェクト ・・・ レイアウト枠を表します。 ・TextFrame2オブジェクト ・・・ 2007から追加されたTextFrameの後継オブジェクト。
ただしフォームコントロールでは使えないプロパティ・メソッドも多くあります。


チェックボックスのOnOffやコンボボックスの値を取得するには、
下記のフォームコントロールとして扱う必要があります。


フォームコントロールとして扱う

コントロールの書式設定
フォームコントロールは、基本的にはオートシェイプとして扱えるのですが、
「コントロールの書式設定」の「コントロール」については他のオートシェイプにはない独特のものになります。

コントロールを右クリック

VBA マクロ フォームコントロール

VBA マクロ フォームコントロール

上図はチェックボックスの画面になります。
フォームコントロールの種類ごとに設定できるものが変わります。

恐らく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

これを実行してもエラーとなってしまいます。

VBA マクロ フォームコントロール


オブジェクトの指定にはコントロールの種類ごとのコレクションを指定します。
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はコンボボックスの「入力範囲の指定になります。」

VBA マクロ フォームコントロール

.Valueで取得される値は、入力範囲内の選択位置になります。
したがって、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プロパティで判別できます。

この値が、msoFormControl(数値は8)がフォームコントロールになります。
このTypeはMsoShapeType列挙になります。
さらに、
フォームコントロールの種別はFormControlTypeプロパティをXlFormControl列挙で判別します。

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 ・・・新着記事一覧を見る

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ