Excelのワークシートにボタンやラジオボタンなどのコントロールを追加するとき、フォームコントロールとActiveXコントロールのどっちを使えばいいか迷ったことはありませんか?
今回はそれぞれの違いについて説明します。

コントロールの種類の違い
フォームコントロールとActiveXコントロールで扱えるコントロールは異なります。
使えないコントロールがそれぞれあるので要注意です。
扱えるコントロールを表にまとめました。
フォームコントロール | ActiveXコントロール | |
---|---|---|
ボタン | 〇 | 〇 |
コンボボックス | 〇 | 〇 |
チェックボックス | 〇 | 〇 |
スピンボタン | 〇 | 〇 |
リストボックス | 〇 | 〇 |
オプションボタン | 〇 | 〇 |
グループボックス | 〇 | ✕ |
ラベル | 〇 | 〇 |
スクロールバー | 〇 | 〇 |
テキストボックス | ✕ | 〇 |
イメージ | ✕ | 〇 |
トグルボタン | ✕ | 〇 |
コントロールの選択 | ✕ | 〇 |
テキストフィールド | ※ | ✕ |
リスト エディット コンボボックス | ※ | ✕ |
ドロップダウン エディット コンボボックス | ※ | ✕ |
選択方法の違い
【フォームコントロール】
マクロが登録されていないボタン、グループボックス、ラベルは常に移動ができる状態です。
その他のコントロールは、右クリックをすることで移動ができる状態になります。

【ActiveXコントロール】
[開発] タブのデザインモードをオンにすることで移動ができる状態になります。

選択させないようにするには?
コントロールをロックし、シートの保護をすることで選択できなくなります。
① コントロールを右クリック
② [コントロールの書式設定] を選択
③ [保護] タブの [ロック] にチェック(初期設定ではチェックされています。)
※フォームコントロールの場合

※ActiveXコントロールの場合

④ [校閲] タブを選択
⑤ [シートの保護] を選択
⑥ [OK] をクリック

プロパティ(書式設定含む)の違い
【フォームコントロール】
右クリックメニューの [コントロールの書式設定] から書式設定とプロパティの設定画面を開くことができます。


【ActiveXコントロール】
フォームコントロールと同様、右クリックメニューの [コントロールの書式設定] から書式設定とプロパティの設定画面を開くことができます。ただし、設定することができる種類(タブ)が少ないです。


さらに、 [開発] タブの [プロパティ] からプロパティの設定画面を開くことができます。
フォームコントロールでは、シートのプロパティの設定画面が開かれます。


マクロの登録方法の違い
フォームのコントロールでは、シートからマクロの登録をすることができます。
ActiveXコントロールではできません。


登録することができるマクロは、標準モジュールのマクロです。

ActiveXコントロールでは、シートモジュールにマクロをコーディングし、ヘッダーで登録するコントロールを設定する必要があります。

コーディングの違い
【フォームコントロール】
生成するコントロールに対応するコレクションを用いて操作します。
コントロール | コレクション |
---|---|
ボタン | Buttons |
コンボボックス | DropDowns |
チェックボックス | CheckBoxes |
スピンボタン | Spinners |
リストボックス | ListBoxes |
オプションボタン | OptionButtons |
グループボックス | GroupBoxes |
ラベル | Labels |
スクロールバー | ScrollBars |
'コントロールの追加
Worksheet.コレクション.Add(Left, Top, Width, Height)
'コントロールの編集
Worksheet.コレクション(インデックス).プロパティ = 設定値
'コントロールの削除
Worksheet.コレクション(インデックス).Delete
例)ボタンの場合は次のようになります。
Sub Sample()
'1.ボタンの追加
Dim button1 As button
Set button1 = ActiveSheet.Buttons.Add(80, 80, 100, 50)
'2.ボタンの編集
Dim button2 As button
Set button2 = ActiveSheet.Buttons(1)
button2.Name = "test"
'3.ボタンの削除
Dim button3 As button
Set button3 = ActiveSheet.Buttons("test")
button3.Delete
End Sub
変数の型をObjectにすることも可能です。
Sub Sample()
'1.ボタンの追加
Dim button1 As Object
Set button1 = ActiveSheet.Buttons.Add(80, 80, 100, 50)
'2.ボタンの編集
Dim button2 As Object
Set button2 = ActiveSheet.Buttons(1)
button2.Name = "test"
'3.ボタンの削除
Dim button3 As Object
Set button3 = ActiveSheet.Buttons("test")
button3.Delete
End Sub
そのほか詳しい内容はこちらのサイトに書かれています。
【ActiveXコントロール】
ActiveXコントロールはOLEObjectなので、
OLEObjectのコレクションOLEObjectsを用いて操作します。
'コントロールの追加
Worksheet.OLEObjects.Add (ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)
'コントロールの編集
Worksheet.OLEObjects(インデックス).プロパティ = 設定値
'コントロールの削除
Worksheet.OLEObjects(インデックス).Delete
例)ボタンの場合は次のようになります。
Sub Sample()
'1.ボタンの追加
Dim button1 As OLEObject
Set button1 = ActiveSheet.OLEObjects.Add( _
ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, _
Left:=0, Top:=0, Width:=100, Height:=50)
'2.ボタンの編集
Dim button2 As OLEObject
Set button2 = ActiveSheet.OLEObjects(1)
button2.Name = "test"
'3.ボタンの削除
Dim button3 As OLEObject
Set button3 = ActiveSheet.OLEObjects("test")
button3.Delete
End Sub
Shapesコレクションを使用することで操作することも可能です。
その場合は、変数の型をObjectにする必要があります。
Sub Sample()
'1.ボタンの追加
Dim button1 As Object
Set button1 = ActiveSheet.OLEObjects.Add( _
ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, _
Left:=0, Top:=0, Width:=100, Height:=50)
'2.ボタンの編集
Dim button2 As Object
Set button2 = ActiveSheet.Shapes(1)
button2.Name = "test"
'3.ボタンの削除
Dim button3 As Object
Set button3 = ActiveSheet.Shapes("test")
button3.Delete
End Sub
そのほか詳しい内容はこちらのサイトに書かれています。
OLEObjectとは?
OLEという、アプリケーション間でオブジェクトをやり取りするためのMicrosoftが開発した仕組みで、やり取りを行うオブジェクトのことをOLEObjectといいます。
まとめ
いかがでしたか?同じオブジェクトに見えて、違う箇所が多くありますね。
実装する内容に適したものを選ぶようにしましょう。