MS Access VBA错误:运行时错误 '70' 权限被拒绝。
运行时错误'70'权限被拒绝是由于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()函数来替代。
在Access中,我们可以使用非常简短的函数来利用Application.StringFromGUID
生成GUID。它生成的GUID格式很冗长,例如{guid {00000000-0000-0000-0000-000000000000}}
。
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
。
然而,有时候当我们运行这段代码时,可能会出现一个错误:Run time error '70' Permission Denied
。这是由于访问权限不足导致的。
要解决这个问题,我们可以采取以下措施:
1. 确保你具有足够的权限来运行这段代码。如果你是在受限制的环境中运行代码,可能需要联系管理员获取适当的权限。
2. 确保你正在运行的Access数据库文件没有被其他程序占用或只读状态。如果是这样,关闭其他程序或将文件设置为可写状态。
3. 确保你的操作系统和Access版本是兼容的。如果你的操作系统或Access版本过旧,可能会导致权限问题。升级到最新的操作系统和Access版本可能会解决问题。
通过采取上述措施,你应该能够解决Run time error '70' Permission Denied
错误,并成功生成所需的GUID。
根据上述内容,可以整理出以下文章:
标题:MS Access VBA Error: Run time error '70' Permission Denied 出现的原因和解决方法
在Microsoft的官方论坛中,有用户报告了一个名为"MS Access VBA Error: Run time error '70' Permission Denied"的错误。根据官方回复,这个问题是由于今年七月的安全更新引起的,并且是设计上的问题。为了防止恶意代码在Office应用程序中运行,这个控件被阻止使用。为了解决这个问题,官方提供了两种解决方法。
第一种解决方法是改变代码,使用Windows API CoCreateGuid代替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
第二种解决方法是在注册表中添加一个键值来允许Scriptlet.TypeLib在Office应用程序中实例化。这种方法会减少Office 2017年7月安全更新所添加的安全保护措施。以下是详细的操作步骤:
1. 打开注册表编辑器。
2. 导航至:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibility{06290BD5-48AA-11D2-8432-006008C3FBFC}。注意:根据不同的Office版本,可能需要在HKEY_LOCAL_MACHINE下搜索正确的位置。
3. 添加ActivationFilterOverride键。
4. 设置DWORD值为1。
请注意,如果需要禁用ActivationFilterOverride设置,只需将DWORD值改为0,并重新启动Office应用程序。
需要注意的是,有用户在评论中提到这个解决方法在Windows 10与Office 365上并不适用。因此,这些解决方法可能适用于其他版本的Windows和Office,但并不保证在所有情况下都有效。
以上就是关于MS Access VBA Error: Run time error '70' Permission Denied问题的出现原因和解决方法的整理。希望对遇到类似问题的读者有所帮助。