web-dev-qa-db-ja.com

MS Access VBAエラー:実行時エラー '70'権限が拒否されました

この問題は、MS Office/AccessまたはWindows 10の最近のアップデートの結果だと思います。このコードを実行すると、次のようになります。

Dim s As String
With CreateObject("Scriptlet.TypeLib")
    s = Left(.Guid, 9)
   newguidx = Right(s, 8)
End With

エラーが表示されます:Withステートメントでアクセスが拒否されました。これは新しいもので、管理者がシステムを更新した後にのみ作成されます。更新をロールバックするオプションはありません。誰かがこれに遭遇して回避策を持っていますか?

OS:Windows 7 Enterprise Accessバージョン:2010

ありがとう

9
jason

Microsoftから

この問題は、7月のセキュリティ更新以降の仕様によるものです。この制御は、Officeアプリケーションで悪意のあるコードが実行されるのを防ぐためのセキュリティ対策としてブロックされます。推奨される方法でナレッジベースの記事を取得するよう取り組んでいます。そのKBの準備ができるまで、ここにコンテンツを投稿します。

回避策推奨される方法は、Windows API CoCreateGuid( https://msdn.Microsoft.com/en-us /library/windows/desktop/ms688568(v=vs.85).aspx )の代わりにCreateObject("Scriptlet.TypeLib").Guid

_' No VT_GUID available so must declare type GUID
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
_

代替の回避策

これにより、CreateObject("Scriptlet.TypeLib")を使用できるようになりますが、Office 2017年7月のセキュリティ更新プログラムによって追加されるセキュリティ保護機能が低下します。 _Scriptlet.TypeLib_がOfficeアプリケーション内でインスタンスを作成できるようにするレジストリキーを設定できます。このレジストリキーが設定されている場合、OfficeはこのCOMコントロールの使用をブロックしません。

  • レジストリエディターを開きます。
  • 移動先:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibility {06290BD5-48AA-11D2-8432-006008C3FBFC}
    • 注:インストールされているOfficeのバージョンに基づいて、HKEY_LOCAL_MACHINEの下の正しい場所を見つけるためにレジストリを検索する必要がある場合があります。
  • ActivationFilterOverrideを追加
  • DWORDを設定:1

詳細な手順:

  1. [スタート]ボタンをクリックし、[ファイル名を指定して実行]をクリックします。[名前]ボックスにregeditと入力し、[OK]をクリックします。レジストリで次のキーを見つけてクリックします:HKEY_LOCAL_MACHINE
  2. [編集]メニューの[検索]をポイントし、[検索する文字列]ボックスに次のように入力します。COM互換性
  3. キーが選択され、値とデータが選択されていないことを確認します。次に、[文字列全体にのみ一致する]を選択し、[次を検索]をクリックして、次のキーをクリックします:{06290BD5-48AA-11D2-8432-006008C3FBFC}注:キーが存在しない場合は、追加する必要があります。 [編集]メニューの[新規]をポイントし、[キー]をクリックします。 {06290BD5-48AA-11D2-8432-006008C3FBFC}と入力します
  4. [編集]メニューの[新規]をポイントし、[DWORD(32ビット)値]をクリックします。
  5. DWORDの名前としてActivationFilterOverrideと入力し、Enterキーを押します。
  6. ActivationFilterOverrideを右クリックし、[変更]をクリックします。
  7. [値のデータ]ボックスに1と入力してレジストリエントリを有効にし、[OK]をクリックします。
  8. ActivationFilterOverride設定を無効にすることに注意して、0(ゼロ)を入力し、[OK]をクリックします。
  9. レジストリエディターを終了し、Open Officeアプリケーションを再起動します。
19
David Zemens

Accessでは、この非常に短い関数でApplication.StringFromGUIDを利用してバイトをGUIDにキャストすることでGUID=を生成できます。ただし、形式は{guid {00000000-0000-0000-0000-000000000000}}ですが、かなり詳細なGUIDが生成されます。

Declare PtrSafe Sub CoCreateGuid Lib "ole32" (ByVal GUID As LongPtr)
Public Function NewGUID() As String
    Dim b(15) As Byte
    CoCreateGUID VarPtr(b(0))
    NewGUID = Application.StringFromGUID(b)
End Function

たとえば、この関数の最後の行をNewGUID = Mid(Application.StringFromGUID(b), 8, 36)で置き換えることにより、不要な文字を取り除くことができます。次に、形式は00000000-0000-0000-0000-000000000000になります。

2
Erik A

Windows Updateは "Scriptlet.TypeLib"を取り出したので、以下を試してください:-

Declare Function CoCreateGuid Lib "ole32" (ByRef GUID As Byte) As Long
Public Function GenerateGUID() As String
    Dim ID(0 To 15) As Byte
    Dim N As Long
    Dim GUID As String
    Dim Res As Long
    Res = CoCreateGuid(ID(0))

    For N = 0 To 15
        GUID = GUID & IIf(ID(N) < 16, "0", "") & Hex$(ID(N))
        If Len(GUID) = 8 Or Len(GUID) = 13 Or Len(GUID) = 18 Or Len(GUID) = 23 Then
            GUID = GUID & "-"
        End If
    Next N
    GenerateGUID = GUID
End Function

または、SQL Server 2008以降に接続している場合は、代わりにSQL NEWID()関数を使用してみてください。

1
rchacko