Aún es habitual encontrarse con macros de VBA en los que se accede a funciones exportadas por DLLs de 32 bits. Al intentar ejecutar algunas de estas macros en las versiones actuales de Microsoft Office de 64 bits se obtiene un error de compilación. Provocando un problema cuando se necesita estas alguna de esas funcionalidades. Afortunadamente existe un truco sencillo para poder usar las macros de 32 bits en Excel de 64 bits, o el resto de las aplicaciones de Office, evitando estos errores de compilación.
El problema con las macros de 32 bits en Excel de 64 bits
Las macros de VBA, los tradicionales macros que se usan en Excel y el resto de las aplicaciones de Office, pueden integrar llamadas a funciones de DLLs del sistema. Para lo que solamente se debe usar la palabra clave Declare
. Algo con lo que se puede acceder a múltiples funcionalidades que no existen en VBA, mejorando de este modo las capacidades de los macros.
El problema aparece cuando la versión de la librería a la que se llama es de 32 bits y el código se ejecuta en Office de 64 bits. En este caso los tipos de datos no son compatibles y se producirá un error de compilación. Para solucionar esto solamente se tiene que agregar la palabra clave PtrSafe
antes de importar la función. Así para importar una importación como la siguiente
Declare Function WaitForSingleObject Lib "Kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
se debería cambiar por
Declare PtrSafe Function WaitForSingleObject Lib "Kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Lo que evitará los errores de compilación.
El efecto de la palabra PtrSafe
Al agregar la palabra reservada PtrSafe
a una intrusión Declare
lo que se hace es indicar al compilador que se va a trabajar con una versión de 64 bits. Provocando que todos los datos se pasen a almacenar con valores de 64 bits, incluyendo los valores devueltos y los parámetros. Por lo que el código ya no se podrá ejecutar en versiones de 32 bits. Algo que también puede ser un problema, ya que es posible que esa macro la esté usando un compañero en un ordenador donde la versión de office no está actualizada.
Mantener la compatibilidad entre versiones de 32 y 64 bits
En el caso de que se desee que el mismo macro funciones en tanto en versiones de Excel tanto de 32 como de 64 bits se puede recurrir a directivas de compilación. Esto es, indicarle al compilador que use una u otra versión en función de donde se esté ejecutando el macro. Para lo que solamente hay que recurrir a una estructura if-else
precedidas de una almohadilla (#
). Esto es, se puede usar el siguiente código.
#If Win64 Then Declare PtrSafe Function WaitForSingleObject Lib "Kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long #Else Declare Function WaitForSingleObject Lib "Kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long #End If
Por lo que este macro funcionará tanto en una instalación de Office de 32 como de 64 bits.
Conclusiones
En esta ocasión se ha visto cómo se puede solucionar los problemas de las macros de 32 bits en Excel de 64 bits. Manteniendo al mismo tiempo la compatibilidad con las versiones de 32 bits. Para ello hay que usar las directivas de compilación y la palabra clave PtrSafe
.