和風スパゲティのレシピ

日本語でコーディングするExcelVBA

オブジェクトがActiveXコントロールか判定する

Excel2024からActiveXコントロールが使用できなくなりました。

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コントロールを修正して回ることができます。

目的に応じて使い分けてください。