Constantes de compilación condicional en VBA

Ricardo Barrera

Ricardo Barrera

I help businesses to get the most out of Microsoft Office
A veces, queremos que nuestro código «sepa» qué líneas son las que escribimos para distintos escenarios y de hecho necesitamos que la ejecución entienda perfectamente que hay una parte del código específicamente ideada para ese preciso escenario.
Por ejemplo, muchas veces sabemos que nuestro código funcionará bien si es ejecutado en un ambiente Windows y muy probablemente si se ejecute en una Mac no tendremos ni idea de cómo se comportará. Para ello es que existen las compilaciones condicionales.
Vamos a ver un ejemplo y seguro con la explicación entenderás de qué va esto:
En la rutina, la constante TesteadaEnMac solamente será creada cuando el código sea leído desde una máquina Machintoch y la ejecución del código se detendrá en la línea de Debug.Assert solo en las máquinas Mac (siempre y cuando el proyecto VBA no esté bloqueado). Pero teoricamente el cuadro de mensaje (Msgbox) debería verse independientemente de el tipo de sistema operativo en el que esté corriendo en código.
Podríamos caer en el error de decir: «pero esto lo puedo hacer con un simple IF» y la respuesta es que el IF no tiene el mismo poder que el #IF y en este ejemplo te muestro el porqué:
De esta manera puedes ver que a pesar de que MostrarMensaje es finalmente un procedimiento Sub; únicamente será posible ser llamado por otros procedimientos cuando la ejecución sea en Mac, puesto es la única forma en que aplicaría la instrucción  Public
A pesar de que las constantes de compilación condicional son tan útiles, Microsoft se encargó de no hacer muy claras las constantes que dejó reservadas; por ejemplo, las constantes Win64, Win32 y Win16 si me hubiese tocado a mí nombrarlas seguramente las hubiese llamado Office64, Office32 y Office16 pues son compiladas dependiendo de la arquitectura del paquete de Office instalado y no del sistema operativo.
Por otro lado, hay unas constantes muy útiles (aunque igual no muy fáciles de comprender) cuando necesitamos hacer referencia a librerías dinámicas (DLLs) desde VBA: VBA7 se diseñó para poder agregar el tipo de datos LongLong y permirtir que nuestro código maneje enteros mucho más grandes que sistemas operativos de 64 bits nos permiten cargar en memoria. Y con esa misma introducción, metieron también en PtrSafe para manejar punteros devueltos durante llamadas a las DLLs. Es decir, que para los casos donde no se esté usando VB7 (Office 2007 para abajo) Microsoft espera que usemos la constante VB6

Deja una respuesta

Tu dirección de correo electrónico no será publicada.