VBA入門
ActiveXコントロール

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

第137回.ActiveXコントロール


【重要】ワークシート上のActiveXコントロール無効化について最新情報

1. 概要:ActiveXコントロールの無効化方針

Microsoftは、2024年10月リリースの Office 2024(Windows デスクトップ版) 以降、Excel・Word・PowerPoint・Visio におけるActiveXコントロールの取り扱い方針を大きく変更されました。

この変更により、ワークシート上に配置されたActiveXコントロール(ボタンやチェックボックスなど)は既定で無効化され、動作しなくなります。
表示はされますが、クリックや入力などの操作は一切できず、VBAイベントも発火しません。

さらに、Microsoft 365(クラウド版Office)においても、同様の変更が2025年4月から段階的に展開されています。

2. 対象と非対象:UserFormは引き続き使用可能

この無効化は、「ワークシート上に直接配置されたActiveXコントロール」に限定されており、
VBAのUserForm(ユーザーフォーム)上に配置されたActiveXコントロールは影響を受けません。

つまり、ダイアログ形式でVBAから呼び出されるUserFormは、今まで通りボタン操作・入力・イベント処理などが可能です。

3. 無効化されたActiveXを再び使いたい場合

今回の変更は「完全な削除」ではなく、セキュリティ設定(既定値)の変更です。
ActiveXの動作を復元したい場合、以下のいずれかの方法で元に戻すことが可能です。

▶ トラストセンターの設定変更(推奨)
  1. Excelで [ファイル] → [オプション] を開く
  2. [トラストセンター] → [トラストセンターの設定] をクリック
  3. [ActiveX の設定] を開き、「先に確認メッセージを表示してから、最低限の制限を適用してすべてのコントロールを有効にする(P)」などを選択
  4. OKで保存

    VBA マクロ ActiveXコントロール

▶ レジストリ設定の変更
HKEY_CURRENT_USER\Software\Microsoft\Office\Common\Security\DisableAllActiveX
この値を 0 に変更することで、ActiveXは再び動作します。

▶ グループポリシーでの一括設定(企業向け)
組織単位での管理には、グループポリシーを使用して「Disable All ActiveX」ポリシーを無効(0)に設定することが有効です。

4. 今後の対応方針:代替と移行の重要性

ActiveXコントロールは、かつては強力なインターフェースツールでしたが、セキュリティリスクや技術的な老朽化、Windows依存性の高さなどを理由に、Microsoftはこの技術を段階的に廃止する方針を明確にしています。

そのため、今後もActiveXに依存するExcelツールやマクロを使い続ける場合、以下の対応を強く推奨します:
  • ActiveXの使用継続が必要な場合は、各PCにトラストセンターやレジストリ設定の変更を事前に周知・適用する。
  • 将来的な保守性・安全性を考慮し、ワークシート上のActiveXコントロールは使用を避ける。
  • フォームコントロールへの置き換えや、VBA UserFormを使ったUIへの移行を検討する。
  • WebベースのOfficeや非Windows環境ではそもそもActiveXが使えないため、クロスプラットフォーム化を意識した設計へ見直す。

以下は2024年以前から掲載していた解説のままです。


元々の導入文

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

ワークシートでActiveXコントロールを扱う事の是非はありそうですが、使用することで便利かつ見栄えの良いシートになる場合もあります。
ただし、過去のバージョンアップで動作に問題が出たこともありますので、使用するときは十分に注意してください。

ワークシートにActiveXコントロールを配置し、その情報を使う場合のマクロVBAについて解説します。


ActiveXコントロールを追加する

VBA マクロ ActiveXコントロール

ワークシート上のActiveXコントロールはOLEObjectになります。
OLEObjectオブジェクトは、
ActiveXコントロール、リンクされたOLEオブジェクト、または埋め込まれているOLEオブジェクトを表します。

したがって、ActiveXコントロールの追加は、OLEObjectのコレクションOLEObjectsへの追加となります。

OLEObjects.Add (ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)

戻り値は追加されたOLEObjectオブジェクトです。

引数の説明
名前 必須
省略
データ型 説明
ClassType 省略可能 Variant ClassTypeまたはFileNameのいずれかを指定する必要があります。
オブジェクトのプログラムIDを含む文字列を指定します。
ClassTypeが指定されている場合、FileNameおよびLink_は無視されます。
FileName 省略可能 Variant ClassTypeまたはFileNameのいずれかを指定する必要があります。
OLEオブジェクトの作成に使用するファイルを示す文字列を指定します。
Link 省略可能 Variant この引数にTrueを指定すると、引数FileNameで指定したファイルで作成された新しいOLEオブジェクトをリンクします。
オブジェクトをリンクしない場合は、オブジェクトはそのファイルのコピーとして作成されます。
既定値は、Falseです。
DisplayAsIcon 省略可能 Variant 新しいOLEオブジェクトをアイコンまたは通常のピクチャで表示するには、Trueを指定します。
この引数がTrueの場合、引数IconFileNameおよび引数IconIndexを使ってアイコンを指定できます。
IconFileName 省略可能 Variant 表示するアイコンのファイルを示す文字列を指定します。
この引数は、DisplayAsIconがTrueの場合にのみ使用されます。
この引数を省略するか、指定したファイルにアイコンがない場合は、OLEクラスの既定のアイコンが使われます。
IconIndex 省略可能 Variant アイコンファイルに含まれるアイコンの番号を指定します。
これは、DisplayAsIconがTrueで、IconFileNameがアイコンを含む有効なファイルを参照している場合にのみ使用されます。
この引数で指定したインデックス番号のアイコンが、引数IconFileNameで指定したファイルに存在しないときは、ファイル内の最初のアイコンが使われます。
IconLabel 省略可能 Variant アイコンの下に表示するタイトルを示す文字列を指定します。
これは、DisplayAsIcon_がTrueの場合にのみ使用されます。
この引数を省略するか空の文字列("")を指定すると、タイトルは表示されません。
Left 省略可能 Variant ワークシートのセルA1の左上隅またはグラフの左上端を基準にして、新しいオブジェクトの初期座標をポイント単位で指定します。
Top 省略可能 Variant ワークシートの1行目の上端またはグラフのグラフエリアの上端を基準にして、新しいオブジェクトの初期座標をポイント単位で指定します。
Width 省略可能 Variant 新しいオブジェクトの初期幅をポイント単位で指定します。
Height オプション Variant 新しいオブジェクトの初期の高さをポイント単位で指定します。

ClassType:ActiveXコントロールの種類
ActiveXコントロール ClassType
コマント ボタン Forms.CommandButton.1
コンボ ボックス Forms.ComboBox.1
チェック ボックス Forms.CheckBox.1
リスト ボックス Forms.ListBox.1
テキスト ボックス Forms.TextBox.1
スクロール バー Forms.ScrollBar.1
スピン ボタン Forms.SpinButton.1
オプション ボタン Forms.OptionButton.1
ラベル Forms.Label.1
イメージ Forms.Image.1
トグル ボタン Forms.ToggleButton.1

ActiveXコントロール追加の使用例

Dim obj As OLEObject
Set obj = ActiveSheet.OLEObjects.Add( _
      ClassType:="Forms.CommandButton.1", _
      Link:=False, DisplayAsIcon:=False, _
      Left:=0, Top:=0, Width:=100, Height:=50)

コマンドボタンをシートの左上に追加しています。
※実行時の注意
ステップイン(F8)で実行すると追加はされますがエラーが発生します。


ActiveXコントロールを削除/編集

図形オートシェイプと同様にShapesとして扱えます

ActiveXコントロールを手動操作する場合は、デザインモードにしてから行います。

VBA マクロ ActiveXコントロール

コントロールの右クリックメニューの「コントロールの書式設定」になります。

VBA マクロ ActiveXコントロール

ActiveXコントロールの削除
ActiveSheet.Shapes(2).Delete
ActiveSheet.Shapes("CommandButton1").Delete

Shapesコレクションのインデックスを指定して削除します。
インデックスは数値または名称で指定できます。

ActiveXコントロールの編集
With ActiveSheet.Shapes(1)
  .Name = "名前"
  .Top = 10
  .Left = 10
  .Width = 100
  .Height = 50
End With

プロパティ・メソッドは多数存在します。
以下を参照してください。
図形(Shape)関連のプロパティ、メソッド一覧
・Shapesコレクション ・・・ Shapeオブジェクトのコレクション ・Shapeオブジェクト ・・・ オートシェイプやピクチャなど、描画レイヤーのオブジェクト ・ShapeRangeオブジェクト ・・・ 文書の図形セットである図形範囲を表します。 ・GroupShapesオブジェクト ・・・ グループ化した図形を表します。 ・FillFormatオブジェクト ・・・ 図形の塗りつぶしの書式設定を表します。 ・LineFormatオブジェクト ・・・ 線と矢印の両端の書式を表します。 ・TextFrameオブジェクト ・・・ レイアウト枠を表します。 ・TextFrame2オブジェクト ・・・ 2007から追加されたTextFrameの後継オブジェクト。
ただしActiveXコントロールでは使えないプロパティ・メソッドも多くあります。

ActiveXコントロールとして扱う

コントロールの右クリックメニューの「プロパティ」になります。

VBA マクロ ActiveXコントロール

マクロ VBA サンプル画像

プロパティは、ActiveXコントロールの種類ごとに違ってきます。
この「オブジェクト名」つまりNameプロパティとShapeのNameプロパティは別々のものになります。
Shapeとしての名前と、ActiveXコントロールとしての名前は別だという事です。

With ActiveSheet.OLEObjects(1)
  .Name = "名前"
  .Top = 10
  .Left = 10
  .Width = 100
  .Height = 50
End With

With ActiveSheet.OLEObjects("CommandButton1")
  .Delete
End With


ActiveXコントロールの設定/情報取得

ActiveXコントロールを扱う時は、シートモジュールで扱うと簡単に扱えます。
シートモジュールで、

VBA マクロ ActiveXコントロール

VBA マクロ ActiveXコントロール

このように、Meから順次書き進めると次々と候補表示されます。

ActiveXコントロールは、コントロールごとに扱い方が変わりますので、
ここでは代表としてコンボボックスとチェックボックスについて使用例を掲載します。

コンボボックスをシートモジュールで扱う

Me.ComboBox1.ListFillRange = Me.Range("A1:A10").Address

コンボボックスのリストに、自身のシートのA1:A10を設定しています。

Me.ComboBox1.ListFillRange = Sheet1.Range("A1:A10").Address(external:=True)

他シートの場合は、設定文字列にシート指定(external:=True)が必要になります。

Me.ComboBox1.ListFillRange = ""
Me.ComboBox1.AddItem "A"
Me.ComboBox1.AddItem "B"
Me.ComboBox1.AddItem "C"

リストとして固定値を設定しています。
ListFillRangeに設定済の場合はAddItemがエラーになるので、事前にListFillRangeを消去しておきます。

MsgBox Me.ComboBox1.Value

コンボボックスの値を取得しています。
値の取得は、.Textでも取得できます。

チェックボックスを標準モジュールで扱う

シートのオブジェクト名を使えばシートモジュールで扱う場合と同様に簡単に指定できます。

VBA マクロ ActiveXコントロール

シートのオブジェクト名を使わずに標準モジュールで扱う場合は、少々VBAが面倒になります。

Sub sample1()
  Dim ws As Worksheet
  Set ws = ActiveSheet
  Dim obj As OLEObject
  For Each obj In ws.OLEObjects
    If obj.progID = "Forms.CheckBox.1" Then
      obj.Object.Value = True
    End If
  Next
End Sub

シートのすべてのActiveXコントロールのチェックボックスにチェックを付けています。
OLEObjectsコレクションからOLEObjectオブジェクトを取り出し、
その中のObjectプロパティで取得されるオブジェクトに目的のコントロールが入っています。


イベントプロシージャーの作成

ActiveXコントロールに対するイベントプロシージャーの作り方は、
ワークシートやブックのイベント作成手順と同じになります。
第124回.Workbookのイベントプロシージャー
・Workbookのイベント一覧 ・イベントプロシージャー追加のVBE操作 ・Workbook_Open:Workbookのイベント ・Workbook_BeforeClose:Workbookのイベント ・Workbook_SheetChange:Workbookのイベント
第125回.Worksheetのイベントプロシージャー
・Worksheetのイベント ・イベントプロシージャー追加のVBE操作 ・Activate:Worksheetのイベント ・BeforeDoubleClick:Worksheetのイベント ・BeforeRightClick:Worksheetのイベント ・Change:Worksheetのイベント ・SelectionChange:Worksheetのイベント ・全てのシートまたは複数のシートに対するイベント

VBA マクロ ActiveXコントロール

左のドロップダウンでオブジェクトを選択します。

VBA マクロ ActiveXコントロール

Changeイベントが自動で入ります。
これはそのままにして勧めてください、不要な場合は後で削除します。
右のドロップダウンでイベントを選択します。

VBA マクロ ActiveXコントロール

Private Sub オブジェクト名_イベント名([引数])

引数が必要な場合はそれも含めて自動的にプロシージャーが追加作成されます。
この追加されたプロシージャーの中に、必要なVBAコードを記述します。

Private Sub ComboBox1_Change()
  If Me.ComboBox1.Value = "" Then
    MsgBox "コンボボックスの値が消去されました。"
  Else
    MsgBox Me.ComboBox1.Value
  End If
End Sub


ActiveXコントロールの最後に

最初にも少し書きましたが、シートでのActiveXコントロールは過去には問題が発生したこともあります。
大抵の場合は、フォームコントロールで対応できますので、まずはそちらで検討してみてください。
・フォームコントロールを追加する ・フォームコントロールを削除/編集/情報取得 ・フォームコントロールを特定する方法 ・フォームコントロールの最後に

フォームコントロールではできない、より細かい操作が必要な場合は、むしろユーザーフォームを検討してみてください。
Excelユーザーフォーム入門
エクセル(Excel)マクロ(VBA)をやっていればユーザーフォームの存在を知り、そしてユーザーフォームを使いたくなります。使いたくなるというより、使った方が良い場合が出てきます。しかし、ユーザーフォームは少々とっつきにくく、使い始めて使いこなすには、各種コントロールの特性を理解し、イベントについても深い知識が必要…

シートでのActiveXコントロールの扱い方は、ユーザーフォームでのコントロールの扱い方と似ているので違和感なく扱えるはずです。




同じテーマ「マクロVBA入門」の記事

第96回.グラフ(Chart)
第97回.図形オートシェイプ(Shape)
第136回.フォームコントロール
第137回.ActiveXコントロール
第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
第135回.ジャンプの選択オプション(SpecialCells)
第141回.行・列の表示・非表示・列幅・行高
第105回.Callステートメント
第106回.Functionプロシージャー


新着記事NEW ・・・新着記事一覧を見る

シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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