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 SubShapesコレクションを使用することで操作することも可能です。
その場合は、変数の型を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といいます。
まとめ
いかがでしたか?同じオブジェクトに見えて、違う箇所が多くありますね。
実装する内容に適したものを選ぶようにしましょう。
 
					         
                    

