Información general sobre Visual Basic for Applications de 64 bits

Microsoft Visual Basic for Applications (VBA) es la versión de Visual Basic que se incluye con Microsoft Office. En Microsoft Office 2010, VBA incluye características de idioma que habilitan el código VBA para ejecutarse correctamente tanto en entornos de 32 bits y de 64 bits.

Nota:

De forma predeterminada, Office 2010, 2013 y 2016 instalan la versión de 32 bits. Se debe elegir explícitamente la instalación de la versión de 64 bits durante la configuración. A partir de Office 2019 y Microsoft 365, el valor predeterminado es la versión de 64 bits.

El código de ejecución VBA que se escribió antes de la versión de Office 2010 (versión VBA 6 y versiones anteriores) en una plataforma de 64 bits puede producir errores si no se modifica el código para ejecutar en versiones de 64 bits de Office. Se producirán errores porque VBA versión 6 y anteriores implícitamente tienen como destino plataformas de 32 bits y normalmente contiene instrucciones de declaración que llaman a la API de Windows, con tipos de datos de 32 bits para punteros y controladores. Puesto que no tiene un tipo de datos específicos para punteros o controladores, VBA versión 6 y anteriores utilizan el tipo de datos largo, que es un tipo de datos de 4 bytes de 32 bits para punteros y controladores de referencia. Los punteros y los controladores en entornos de 64 bits son cantidades de 64 bits de 8 byte. Estas cantidades de 64 bits no se mantendrá en tipos de datos de 32 bits.

Nota:

Solo tiene que modificar el código VBA si se ejecuta en la versión de 64 bits de Microsoft Office.

El problema con la ejecución de código VBA heredado de 64 bits de Office es que intentar cargar 64 bits en un tipo de datos de 32 bits trunca la cantidad de 64 bits. Esto puede traducirse en saturación de memoria, resultados inesperados en el código y posibles errores de aplicación.

Para resolver este problema y habilitar el código VBA para que funcione correctamente en entornos de 32 bits y 64 bits, se han agregado a VBA varias características de idioma. La tabla al final de este documento resume las nuevas características de idioma VBA. Tres adiciones importantes son el alias de tipoLongPtr, el tipo de datos LongLong y las palabras clave PtrSafe.

  • LongPtr. VBA ahora incluye el alias de tipo variable LongPtr. El tipo actual de datos que resuelve LongPtr depende de la versión de Office que se esté ejecutando; LongPtr resuelve Long en versiones de 32-bit de Office y LongPtr resuelve LongLong en versiones de 64-bit de Office. Use LongPtr para punteros y controladores.

  • LongLong. El tipo de datos LongLong es un entero de 64 bits firmado que solo está disponible en versiones de 64 bits de Office. Use LongLong para integrales de 64 bits. Las funciones de conversión deben usarse para asignar explícitamente LongLong (incluido LongPtr en plataformas de 64 bits) a tipos enteros más pequeños. No se permiten las conversiones implícitas de LongLong a integrales menores.

  • PtrSafe. La palabra clave PtrSafe confirma que una instrucción Declarar es segura para ejecutar en versiones de 64 bits de Office.

Importante

Todas las instrucciones Declarar ahora deben incluir la palabra clave PtrSafe cuando se ejecuta en versiones de 64 bits de Office. Es importante comprender que simplemente agregar la palabra clave PtrSafe para una instrucción Declarar solo significa que la instrucción Declarar tiene como destino explícito el extracto de 64 bits. Aún deben modificar todos los tipos de datos dentro de la instrucción que necesite almacenar (incluidos los parámetros y valores devueltos) de 64 bits para almacenar cantidades de 64 bits.

Nota:

Instrucciones Declarar con la palabra clave PtrSafe es la sintaxis recomendada. Las instrucciones Declarar que incluyen PtrSafe funcionan correctamente en el entorno de desarrollo VBA7 en plataformas de 32 bits y 64 bits.

Para garantizar la compatibilidad VBA7 y otras anteriores, siga los pasos siguientes:

 #If VBA7 Then 
 Declare PtrSafe Sub... 
 #Else 
 Declare Sub... 
 #EndIf

Considere los ejemplos de instrucciones Declarar. Ejecutar la sin modificar la instrucción Declarar en versiones de 64 bits de Office se producirá un error que indica que la instrucción Declarar no incluye el calificador PtrSafe. El ejemplo VBA modificado contiene el calificador PtrSafe, pero tenga en cuenta que el valor devuelto (un puntero a la ventana activa) devuelve un tipo de datos largo. En Office de 64 bits, esto es incorrecto porque el puntero necesita ser de 64 bits. El calificador PtrSafe indica al compilador que la instrucción Declarar está orientada a 64 bits, por lo que se ejecuta la instrucción sin errores. Pero debido a que ya no se actualizó el valor devuelto a un tipo de datos de 64 bits, el valor devuelto se trunca y da como resultado un valor incorrecto devuelto.

Ejemplo de instrucción de VBA heredada no modificada Declarar:

Declare Function GetActiveWindow Lib "user32" () As Long

El siguiente ejemplo de instrucción Declarar de VBA se ha modificado para incluir el calificador PtrSafe, pero todavía usa un valor devuelto de 32 bits:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long

Para la reiteración, se debe modificar la instrucción Declarar para incluir el calificador PtrSafe y se debe actualizar cualquier variable que tenga que contener cantidades de 64 bits para que las variables usen tipos de datos de 64 bits.

El siguiente ejemplo de instrucción Declarar de VBA se ha modificado para incluir la palabra clave PtrSafe y se ha actualizado para usar el tipo de datos de 64 bits (LongPtr) adecuado:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr

En resumen, para que el código trabaje en versiones de 64 bits de Office, tendrá que buscar y modificar todas las instrucciones Declarar para usar el calificador PtrSafe. También necesita buscar y modificar todos los tipos de datos dentro de estas instrucciones Declarar que hacen referencia a los controladores o punteros para usar el nuevo alias de tipo compatible de 64 bits LongPtr y tipos que necesitan contener 64 bits integrales con el nuevo tipo de datos LongLong. Además, debe actualizar cualquier tipo definido por el usuario (UDT) que contiene punteros o controladores de 64 bits integrales para usar tipos de datos de 64 bits y comprobar que todas las asignaciones de variables son correctas para evitar errores de coincidencia de tipo.

Escritura de código que funciona en ambas versiones de 32 bits y 64 bits de Office

Para escribir el código que puede mover datos entre versiones de 32 bits y 64 bits de Office, solo necesita usar el nuevo tipo de alias LongPtr en lugar de Long o LongLong para todos los valores de punteros y controladores. El tipo de alias LongPtr se resolverá al tipo de datos correcto Long o LongLong según qué versión de Office se está ejecutando.

Tenga en cuenta que si necesita ejecutar una lógica diferente, por ejemplo, si necesita usar valores de 64 bits en proyectos de Excel de gran tamaño, puede usar la constante de compilación condicional Win64 como se muestra en la siguiente sección.

Escritura de código que funciona en Office 2010 (32 bits o 64 bits) y versiones anteriores de Office

Para escribir el código que puede funcionar tanto en versiones nuevas y antiguas de Office, puede usar una combinación de las nuevas constantes VBA7 y Win64 condicionales de compilación. La constante de compilación condicional Vba7 se utiliza para determinar si está ejecutando código en la versión 7 del editor VB (la versión VBA que se incluye en Office 2010). La constante de compilación condicional Win64 se utiliza para determinar qué versión (32 bits o 64 bits) de Office se está ejecutando.

#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 

Resumen de actualizaciones de idioma de VBA7

La siguiente tabla resume las nuevas adiciones de idioma de VBA y ofrece una explicación de cada una:

Nombre Tipo Descripción
PtrSafe Palabra clave Afirma que una instrucción Declarar está orientada a sistemas de 64 bits. Necesario en la versión de 64 bits.
LongPtr Tipo de datos Alias de tipo que se asigna a Long en sistemas de 32 bits o LongLong en sistemas de 64 bits.
LongLong Tipo de datos tipo de datos de 8 bytes que solo está disponible en los sistemas de 64 bits. Tipo numérico Un valor entero entre -9,223,372,036,854,775,808 y 9,223,372,036,854,775,807.

LongLong es un tipo declarado válido solo en plataformas de 64 bits. Además, LongLong no se puede convertir implícitamente en un tipo de menor (por ejemplo, no puede asignar un LongLong a un Long). Esto se realiza para evitar un truncamiento de puntero involuntario.

Las conversiones explícitas están permitidas, por lo que en el ejemplo anterior, puede aplicar CLng a un LongLong y asignar el resultado de un Long (válido en plataformas de 64 bits solo).
^ Carácter de declaración de tipo LongLong Declare explícitamente un valor literal como un LongLong. Es necesario para declarar un valor literal LongLong que es más grande que el valor máximo Long (en caso contrario se convertirá implícitamente en Double).
CLngPtr función de conversión de tipos Convierte una expresión sencilla en un LongPtr.
CLngLng función de conversión de tipos Convierte una expresión sencilla en un tipo de datos LongLong (válido solamente en plataformas de 64 bits).
vbLongLong Constante VarType LongLong entero (válido solo para plataformas de 64 bits).
DefLngPtr Instrucción DefType Establece el tipo de datos predeterminado para un intervalo de variables como LongPtr.
DefLngLng Instrucción DefType Establece el tipo de datos predeterminado para un intervalo de variables como LongLong.

Vea también

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.