🙆‍♀️

VBAプロジェクト オブジェクト モデルへのアクセスを信頼するが有効か確認したい。

に公開

作成したワークブックにマクロモジュールをコピーするツール作ったのだけど、ユーザーから動かないと報告あり、ツールの性質上「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」を有効にする必要がある。先方にメールで確認してもよくわかってない感じなので、機械的に確認できるように
マクロを作成。

レジストリキーに設定値があるようなのでWSHで値を取得して判定を行う。

Option Explicit

Function CheckVBAAccessTrustWSH() As Boolean
    Dim WSHShell As Object
    Dim officeVersion As String
    Dim regPath As String
    Dim regValue As Variant
    Dim versionParts As Variant
    Dim errMsg As String
    Dim errorNumber As Long
    Dim errorDescription As String
    
    
    On Error Resume Next
    
    
    ' WSH オブジェクトを作成
    Set WSHShell = CreateObject("WScript.Shell")
    
    
    ' 現在の Excel のバージョン番号を取得
    officeVersion = Application.Version
    
    
    ' バージョン番号の処理をSplit関数で安全に行う
    versionParts = Split(officeVersion, ".")
    If UBound(versionParts) >= 1 Then
        officeVersion = versionParts(0) & "." & versionParts(1)
    End If
    
    ' レジストリパスを構築
    regPath = "HKCU\Software\Microsoft\Office\" & officeVersion & "\Excel\Security\AccessVBOM"
    
    ' 値の読み取りを試行
    regValue = WSHShell.RegRead(regPath)
    
    ' エラーチェック
    If Err.Number <> 0 Then
        ' On Error GoTo 0でリセットする前にNumberとDescriptionを保存
        errorNumber = Err.Number
        errorDescription = Err.Description
        
        
        Set WSHShell = Nothing
        
        ' エラー処理をリセット
        On Error GoTo 0
        

        Err.Raise 32001, "CheckVBAAccessTrustWSH", _
            "設定の確認中にエラーが発生しました。レジストリキーが見つからないか、アクセスできません。" & _
            vbCrLf & "チェックしたパス: " & regPath & _
            vbCrLf & "元のエラー: " & errorNumber & " - " & errorDescription

        Exit Function
    End If
    
    ' 結果を確認
    If regValue = 1 Then
        CheckVBAAccessTrustWSH = True
    Else
        CheckVBAAccessTrustWSH = False
    End If
    
    ' クリーンアップ
    Set WSHShell = Nothing
    On Error GoTo 0
End Function

Public Sub Test_CheckVBAAccessTrustWSH()
    Dim flag As Boolean
    
    On Error GoTo ErrorHandler
    
    flag = CheckVBAAccessTrustWSH()
    
    If flag Then
        MsgBox "VBAプロジェクトオブジェクトモデルへのアクセスが有効", vbInformation, "確認"
    Else
        MsgBox "VBAプロジェクトオブジェクトモデルへのアクセスが無効", vbExclamation, "警告"
    End If
    
    Exit Sub
    
ErrorHandler:

    If Err.Number = 32001 Then
        MsgBox Err.Description, vbCritical, "レジストリアクセスエラー"
    Else
        MsgBox "予期しないエラーが発生しました:" & Err.Description & " (エラー番号: " & Err.Number & ")", vbCritical, "エラー"
    End If
    
    Resume Exit_Test
    
Exit_Test:

    ' 終了処理
End Sub

Discussion