Excel2024からActiveXコントロールが使用できなくなりました。
理由が「セキュリティの脆弱性」であるため、
Excel365も追従する可能性が高いです。
新規に挿入することはもちろんできなくなりますが、
既存のコントロールも選択や押下ができなくなり、
そこに設置したマクロ(イベント)も実行できなくなります。
この問題に対応するにあたり、
- 指定の図形がActiveXコントロールか判定する方法
- ブック内のすべてのActiveXコントロールを取得する方法
をそれぞれ解説します。
指定の図形がActiveXコントロールか判定する
指定の図形がActiveXコントロールか判定するには、
ShapesオブジェクトのTypeプロパティを調べます。
' ActiveXコントロールをShapeオブジェクトとして取得した場合 Dim シェイプ As Shape Set シェイプ = Worksheets("○○").Shapes("CommandButton1") ' Typeプロパティが「12 = msoOLEControlObject」を返す Debug.Print シェイプ.Type ' 12
上記コードの通り、指定したShapeオブジェクトがActiveXコントロールの場合は、
Typeプロパティが「msoOLEControlObject」を返します。
例えばシート内のすべてのActiveXコントロールを削除する場合は、
以下のコードを実行します。
' シート内のすべてのActiveXコントロールを削除する Dim シェイプ As Shape For Each シェイプ In Worksheets("○○").Shapes If シェイプ.Type = msoOLEControlObject Then シェイプ.Delete End If Next
選択中の図形がActiveXコントロールか判定する
選択中の図形をSelectionから取得した場合は、
ShapeではなくDrawingObjectという型で取得されます。
DrawingObjectにはTypeプロパティがありませんので、
ShapeRangeプロパティを使用し、ShapeにしてからTypeを調べます。
' 選択中の図形がActiveXコントロールであれば削除する If Selection.ShapeRange.Type = msoOLEControlObject Then Selection.Delete End If ' 選択したすべての図形のうちActiveXコントロールを削除する Dim シェイプ As Shape For Each シェイプ In Selection.ShapeRange If シェイプ.Type = msoOLEControlObject Then シェイプ.Delete End If Next
ブック内のすべてのActiveXコントロールを取得する方法
ActiveXコントロールを別のオブジェクトに差し換えるために、
ブック内のすべてのActiveXコントロールを取得するコードがこちらです。
Sub ブック内のすべてのActiveXコントロールを取得する() Dim wb対象ブック As Workbook Set wb対象ブック = ActiveWorkbook ' 適宜変更して下さい。 Dim ws As Worksheet For Each ws In wb対象ブック.Worksheets Dim シェイプ As Shape For Each シェイプ In ws.Shapes If シェイプ.Type = msoOLEControlObject Then Debug.Print "シート:" & ws.Name _ & " コントロール名:" & シェイプ.Name End If Next Next End Sub
このコードで全ActiveXコントロールをイミディエイトウィンドウに出力できます。
また作業の目的が「ActiveXを他のコントロールに置き換える」である場合は、
「次に見つけたActiveXコントロールを選択する」以下のマクロも便利です。
Sub アクティブのActiveXコントロールをひとつ選択する() Dim wb対象ブック As Workbook Set wb対象ブック = ActiveWorkbook ' 適宜変更して下さい。 Dim ws As Worksheet For Each ws In wb対象ブック.Worksheets Dim シェイプ As Shape For Each シェイプ In ws.Shapes If シェイプ.Type = msoOLEControlObject Then ws.Activate シェイプ.TopLeftCell.Select シェイプ.Select Exit Sub End If Next Next MsgBox "このブック内にActiveXコントロールはありません。" End Sub
このマクロを使うと、
コンパイルのようにひとつずつActiveXコントロールを修正して回ることができます。
目的に応じて使い分けてください。