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.

VBA 컴파일 오류: Declare 문 PtrSafe 특성 표시 필요
Error de compilación de VBA: se debe marcar el atributo PtrSafe de declaración de declaración

——————————————-
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.

referencia: El código de este proyecto debe actualizarse para su uso en sistemas de 64 bits – Office | Documentos de Microsoft

Compile error when you edit a VBA macro in the 64-bit version of an Office 2010 program
Error de compilación al editar una macro de VBA en la versión de 64 bits de un programa de Office 2010

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

PtrSafe keyword
Palabra clave PtrSafe

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)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol