我认为此问题是最近更新到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
由于
答案 0 :(得分:19)
此问题是设计的,截至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
详细说明:
- 单击“开始”,单击“运行”,在“打开”框中键入regedit,然后单击“确定”。 找到并单击注册表中的以下项: HKEY_LOCAL_MACHINE
- 在“编辑”菜单上,指向“查找”,然后在“查找内容:”文本框中输入以下内容: COM兼容性
- 确保选中了键,并取消选择了值和数据。接下来选择仅匹配整个字符串,单击查找下一个 找到并单击以下项: {06290BD5-48AA-11D2-8432-006008C3FBFC}注意:如果密钥不存在,则需要添加密钥。在“编辑”菜单上,指向“新建”,然后单击“密钥”。输入{06290BD5-48AA-11D2-8432-006008C3FBFC}
- 在“编辑”菜单上,指向“新建”,然后单击“DWORD(32位)值
”- 键入ActivationFilterOverride作为DWORD的名称,然后按Enter键。
- 右键单击“ActivationFilterOverride”,然后单击“修改”。
- 在“数值数据”框中,键入1以启用注册表项,然后单击“确定”。
- 请注意,要禁用ActivationFilterOverride设置,请键入0(零),然后单击“确定”。
- 退出注册表编辑器,然后重新启动任何打开的Office应用程序。
醇>
答案 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()函数。