MS Access VBA错误:运行时错误' 70'没有权限

时间:2017-07-26 16:13:48

标签: vba ms-access ms-office

我认为此问题是最近更新到MS Office / Access或Windows 10的结果。当我运行此代码时:

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

我收到错误:With语句拒绝权限。这是新的,仅在我的管理员更新我们的系统后才会出现。我没有选择回滚更新。任何人遇到这个并有一个解决方法吗?

操作系统:Windows 7企业版 访问版本:2010

由于

3 个答案:

答案 0 :(得分:19)

From 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控件。

     
      
  • 打开注册表编辑器。
  •   
  • 转到:计算机\ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 16.0 \ Common \ COM兼容性{06290BD5-48AA-11D2-8432-006008C3FBFC}      
        
    • 注意:您可能需要搜索注册表,以根据已安装的Office版本在HKEY_LOCAL_MACHINE下找到正确的位置。
    •   
  •   
  • 添加ActivationFilterOverride
  •   
  • 设置DWORD:1
  •   
     

详细说明:

     
      
  1. 单击“开始”,单击“运行”,在“打开”框中键入regedit,然后单击“确定”。   找到并单击注册表中的以下项:   HKEY_LOCAL_MACHINE
  2.   
  3. 在“编辑”菜单上,指向“查找”,然后在“查找内容:”文本框中输入以下内容:   COM兼容性
  4.   
  5. 确保选中了键,并取消选择了值和数据。接下来选择仅匹配整个字符串,单击查找下一个   找到并单击以下项:   {06290BD5-48AA-11D2-8432-006008C3FBFC}注意:如果密钥不存在,则需要添加密钥。在“编辑”菜单上,指向“新建”,然后单击“密钥”。输入{06290BD5-48AA-11D2-8432-006008C3FBFC}
  6.   
  7. 在“编辑”菜单上,指向“新建”,然后单击“DWORD(32位)值
  8. ”   
  9. 键入ActivationFilterOverride作为DWORD的名称,然后按Enter键。
  10.   
  11. 右键单击“ActivationFilterOverride”,然后单击“修改”。
  12.   
  13. 在“数值数据”框中,键入1以启用注册表项,然后单击“确定”。
  14.   
  15. 请注意,要禁用ActivationFilterOverride设置,请键入0(零),然后单击“确定”。
  16.   
  17. 退出注册表编辑器,然后重新启动任何打开的Office应用程序。
  18.   

答案 1 :(得分:2)

在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 :(得分:1)

由于Windows更新取出“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()函数。