jas*_*son 8 ms-access vba 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
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:With语句拒绝权限.这是新的,仅在我的管理员更新我们的系统后才会出现.我没有选择回滚更新.任何人遇到这个并有一个解决方案吗?
操作系统:Windows 7企业版访问版:2010
谢谢
Dav*_*ens 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
Run Code Online (Sandbox Code Playgroud)
替代解决方法
这将允许您使用,
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应用程