Especifique PtrSafe para usar Excel de 32 bits y 64 bits al importar la API de Windows
Obtenga información sobre la declaración PtrSafe de la API de Windows. Al codificar con Excel VBA, puede verificar las causas y soluciones de los errores relacionados con PtrSafe que ocasionalmente encuentra al importar y usar las API de Windows.
1. Ejemplo de código de ocurrencia de error PtrSafe de la API de Windows
Este código importa y declara la suspensión de la API de Windows, OutputDebugString.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)
(Nota: el código anterior es Patrón de registro: utilizando OutputDebugString y DebugView: habilidad de productividad (prodskill.com) Este es el código introducido en .)
2. Mensaje de error PtrSafe de la API de Windows
Al editar o compilar código VBA, se produce el siguiente error.
——————————————-
Microsoft Visual Basic para Aplicaciones
——————————————-Este es un error de compilación:
Deberá actualizar el código en este proyecto para usarlo en sistemas de 64 bits. Revise y actualice la instrucción Declare y márquela con el atributo PtrSafe.
3. ¿Qué causa los errores PtrSafe de la API de Windows?
Se admite 64 bits desde MS-Office 2010 y ocurre porque se debe especificar la palabra clave PtrSafe al imprimir la API de Windows en Excel de 64 bits después de esto.
Algunos extractos de la URL anterior se pegan a continuación.
Síntomas
Considere el siguiente escenario:
- Escribe un código de macro de Microsoft Visual Basic para Aplicaciones (VBA) que usa declaraciones Declarar.
- Su código de macro VBA usa constantes de compilación. Por ejemplo, su código de macro usa una de las siguientes constantes de compilación:
- #If VBA7
- #ISi Win64
- Utiliza un bloque #Else en un bloque condicional. En el bloque #Else, utiliza la sintaxis para una instrucción Declarar diseñada para ejecutarse en Microsoft Visual Basic para Aplicaciones 6.0.
- Edita el código en una versión de 64 bits de un programa de Microsoft Office 2010.
- Intenta cambiar la instrucción Declare en el bloque #Else.
En este escenario, recibe el siguiente mensaje de error:
Microsoft Visual Basic for Applications Compile error: The code in this project must be updated for use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute.
4. Cómo reparar el error PtrSafe de la API de Windows
La versión VBA de MS-Office 2010 es 7.0 y la anterior es 6.x. Dado que se requiere la palabra clave PtrSafe de VBA 7.0, el código de importación de la API de Windows se puede dividir y declarar según si la versión de VBA es posterior a la 7.0 o no.
referencia: Palabra clave PtrSafe (VBA) | Documentos de Microsoft
Algunos extractos de la URL anterior se pegan a continuación.
Palabra clave PtrSafe
- Artículo
- 09/14/2021
- 2 minutos para leer
- 5 colaboradores
Él PtrSeguro palabra clave se utiliza en este contexto: declarar declaración.
Declarar declaraciones con la PtrSeguro palabra clave es la sintaxis recomendada. Declarar sentencias que incluyen PtrSeguro funcione correctamente en el entorno de desarrollo VBA7 en plataformas de 32 bits y 64 bits solo después de que todos los tipos de datos en el Declarar declaración (parámetros y valores devueltos) que necesitan almacenar cantidades de 64 bits se actualizan para usar Largo largo para integrales de 64 bits o LargoPtr para punteros y manijas.
Para garantizar la compatibilidad con versiones anteriores de VBA 6 y anteriores, use la siguiente construcción:
#If VBA7 Then Declare PtrSafe Sub... #Else Declare Sub... #EndIf
Cuando se ejecuta en versiones de 64 bits de Office, Declarar declaraciones deben incluir la PtrSeguro palabra clave. El PtrSeguro palabra clave afirma que un Declarar La declaración es segura para ejecutarse en entornos de desarrollo de 64 bits.
Agregando el PtrSeguro palabra clave a un Declarar declaración sólo significa que el Declarar La declaración apunta explícitamente a 64 bits. Todos los tipos de datos dentro de la declaración que necesitan almacenar 64 bits (incluidos los valores de retorno y los parámetros) aún deben modificarse para contener cantidades de 64 bits mediante el uso de Largo largo para integrales de 64 bits o LargoPtr para punteros y manijas.
Solo necesita determinar si se define una constante "VBA7" o una constante "Win64". En este caso, use la sintaxis de la directiva del compilador #If.
El código está estructurado así:
'방법1 #If VBA7 Then '64bit Windows API import #Else '32bit Windows API import #End If '방법2 #If Win64 Then '64bit Windows API import #Else '32bit Windows API import #End If '방법1, 방법2는 동일한 효과가 있으므로 한 방법을 선택하면 됨
5. Código de ejemplo para resolver el error PtrSafe de la API de Windows
5.1. En caso de ser mezclado y usado en Excel de 32bit y 64bit
#If VBA7 Then 'For 64 Bit Systems Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String) #Else 'For 32 Bit Systems Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String) #End If
5.2. Si se usa solo en Excel de 64 bits
Si tiene la garantía de que solo se usará en Excel de 64 bits, use solo una instrucción que especifique la palabra clave PtrSafe.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)