「実行時エラー 70: アクセスが拒否されました」が、Office VBA を使用して GUID を作成するときに発生する


 

症状


Microsoft Office アプリケーション (Word、Excel など) で GUID を作成するために CreateObject("Scriptlet.TypeLib").GUID 関数を呼び出す Visual Basic for Applications (VBA) コードを実行すると、次のエラー メッセージが表示されます。

Run-time error '70':
Permission denied

この問題は、次の 2017 年 7 月の Office 用セキュリティ更新プログラムのいずれかがインストールされている場合に発生します。

状態


この問題は仕様です。 2017 年 7 月のセキュリティ更新プログラムでは、Office VBA の悪意のあるコードに対するセキュリティ保護のため、CreateObject("Scriptlet.TypeLib").GUID がブロックされています。

回避策


この問題を回避するには、以下のいずれかの方法を使用します。

回避策 1 (推奨): CoCreateGuid を使用する 

代わりに、CoCreateGuid Windows API を使用して GUID を作成します。

Office アプリケーションで次のサンプル コードを実行すると、エラーが発生します。

Sub GetGUID()
Dim strGuid As String
strGuid = CreateObject("Scriptlet.TypeLib").GUID
MsgBox (strGuid)
End Sub

 

CoCreateGuid 関数を使用するには、コードを次のコードに置き換えます。

注: 置換コードは、32 ビットと 64 ビットの両方の Office で動作します。 「64 ビット Visual Basic for Applications の概要」の「32 ビットと 64 ビットの両方の Office で動作するコードを作成する」セクションを参照してください。

Private Type GUID_TYPE
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
 
Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (guid As GUID_TYPE) As LongPtr
Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr
 
Function CreateGuidString()
Dim guid As GUID_TYPE
Dim strGuid As String
Dim retValue As LongPtr
Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
retValue = CoCreateGuid(guid)
If retValue = 0 Then
strGuid = String$(guidLength, vbNullChar)
retValue = StringFromGUID2(guid, StrPtr(strGuid), guidLength)
If retValue = guidLength Then
' valid GUID as a string
CreateGuidString = strGuid
End If
End If
End Function
 
Sub GetGUID()
Dim strGuid As String
strGuid = CreateGuidString()
MsgBox(strGuid)
End Sub
 

回避策 2 (代替): CreateObject(“Scriptlet.TypeLib”).GUID のブロックを解除する

    この関数のブロックを解除するには、Scriptlet.TypeLib オブジェクトを Office アプリケーションでインスタンス化できるようにするレジストリ キーを設定します。 これを行うには、次の手順を実行します。

    1. レジストリ エディターを開きます。
       
      1. Office のバージョンとエディションに応じて、次のパスに移動します。
          32 ビットの Office 64 ビットの Office
        Office 2016 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\16.0\Common\COM Compatibility\{06290BD5-48AA-11D2-8432-006008C3FBFC} HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibility\{06290BD5-48AA-11D2-8432-006008C3FBFC}
        Office 2013、Office 2010、Office 2007 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Common\COM Compatibility\{06290BD5-48AA-11D2-8432-006008C3FBFC} HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Common\COM Compatibility\{06290BD5-48AA-11D2-8432-006008C3FBFC}
        注: 「COM Compatibility」ノードと「"{06290BD5-48AA-11D2-8432-006008C3FBFC}」ノードが存在しない場合は、それらのキーを作成します。
    2. {06290BD5-48AA-11D2-8432-006008C3FBFC} の下に DWORD (32 ビット) 値を作成します。
    3. 名前を ActivationFilterOverride、値を 1 に設定します。

      この関数を再度ブロックするには、値を 0 に設定します。
    4. レジストリ エディターを終了します。
    5. 開いている Office アプリケーションを再起動します。