run - Error de MS Access VBA: Error de tiempo de ejecución ''70'' Permiso denegado
vba access pdf (3)
Creo que este problema es el resultado de una actualización reciente de MS Office / Access o Windows 10. Cuando ejecuto este código:
Dim s As String
With CreateObject("Scriptlet.TypeLib")
s = Left(.Guid, 9)
newguidx = Right(s, 8)
End With
Me sale un error: Permiso denegado en la declaración With. Esto es nuevo solo surgió después de que mis administradores actualizaron nuestros sistemas. No tengo opción para revertir las actualizaciones. ¿Alguien se encuentra con esto y tiene una solución?
SO: Windows 7 Enterprise Access Versión: 2010
Gracias
Como la actualización de Windows eliminó "Scriptlet.TypeLib", intente lo siguiente:
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
Alternativamente, si se está conectando a SQL Server 2008 o superior, intente usar la función SQL NEWID () en su lugar.
En Access, podemos bastar con esta función muy corta para generar un GUID al aprovechar
Application.StringFromGUID
para convertir bytes en un GUID.
Sin embargo, genera GUID bastante detallados, con el formato
{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
Puede eliminar los caracteres no deseados, por ejemplo, reemplazando la última línea de esta función con
NewGUID = Mid(Application.StringFromGUID(b), 8, 36)
.
Entonces, el formato será
00000000-0000-0000-0000-000000000000
Este problema es por diseño, a partir de las actualizaciones de seguridad de julio. Este control está bloqueado como medida de seguridad para ayudar a evitar que se ejecute código malicioso en las aplicaciones de Office. Estamos trabajando para publicar un artículo de la base de conocimiento con el método recomendado. Hasta que KB esté listo, publicaré el contenido aquí:
Solución alternativa El método preferido es cambiar el código para usar la API de Windows CoCreateGuid ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms688568(v=vs.85).aspx ) en lugar de
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
Solución alternativa
Esto le permitirá usar
CreateObject("Scriptlet.TypeLib")
sin embargo, disminuirá la protección de seguridad agregada por la actualización de seguridad de Office de julio de 2017. Puede establecer una clave de registro que permita aScriptlet.TypeLib
crear instancias dentro de las aplicaciones de Office. Cuando se establece esta clave de registro, Office no bloqueará el uso de este control COM.
- Editor de registro abierto.
- Vaya a: Computadora / HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Office / 16.0 / Common / COM Compatibility {06290BD5-48AA-11D2-8432-006008C3FBFC}
- Nota: es posible que deba buscar en el registro para encontrar la ubicación correcta en HKEY_LOCAL_MACHINE según su versión de Office instalada.
- Añadir ActivationFilterOverride
- Establecer DWORD: 1
Instrucciones detalladas:
- Haga clic en Inicio, haga clic en Ejecutar, escriba regedit en el cuadro Abrir y luego haga clic en Aceptar. Busque y haga clic en la siguiente clave en el registro: HKEY_LOCAL_MACHINE
- En el menú Edición, seleccione Buscar y, a continuación, ingrese lo siguiente en el cuadro de texto Buscar qué: Compatibilidad COM
- Asegúrese de que Keys esté seleccionado y que los Valores y Datos estén deseleccionados. A continuación, seleccione Coincidir con toda la cadena, haga clic en Buscar siguiente localizar y luego haga clic en la siguiente clave: {06290BD5-48AA-11D2-8432-006008C3FBFC} Nota: si la clave no está presente, deberá agregarla. En el menú Editar, seleccione Nuevo y luego haga clic en Clave. Escriba {06290BD5-48AA-11D2-8432-006008C3FBFC}
- En el menú Edición, seleccione Nuevo y luego haga clic en Valor DWORD (32 bits)
- Escriba ActivationFilterOverride para el nombre de DWORD y luego presione Entrar.
- Haga clic con el botón derecho en ActivationFilterOverride y luego haga clic en Modificar.
- En el cuadro Información del valor, escriba 1 para habilitar la entrada del registro y luego haga clic en Aceptar.
- Nota para deshabilitar la configuración ActivationFilterOverride, escriba 0 (cero) y luego haga clic en Aceptar.
- Salga del Editor del registro y luego reinicie cualquier aplicación de Office abierta.