Cuando escribe macros de VBA en Word, el código puede comportarse de forma diferente según la versión de Office (2013, 2016, 2019, Microsoft 365). Características como la nueva API de comentarios o el Inspector de documentos cambiaron entre versiones. Sin detección de versión, su macro fallará o producirá resultados incorrectos en versiones no compatibles. La compilación condicional le permite escribir una sola macro que ejecute el bloque de código correcto para cada versión de Office automáticamente.
Este artículo explica cómo funciona la compilación condicional en Word VBA, cómo configurar constantes específicas de versión y cómo escribir macros que se mantengan compatibles desde Office 2013 hasta Microsoft 365. Aprenderá la sintaxis correcta para los bloques #If…Then…#Else y cómo probar su código sin errores.
Puntos clave: Compilación condicional para Word VBA multiversión
- #If VBA7 Then … #End If: Detecta Office de 64 bits (VBA7) frente a Office de 32 bits (VBA6) para usar las declaraciones Declare correctas.
- #If Win64 Then … #End If: Detecta Windows de 64 bits para manejar llamadas a API seguras para punteros.
- Constante condicional personalizada con #Const: Le permite definir su propia marca de versión (por ejemplo, Office2019) y compilar solo el código para esa versión.
Cómo funciona la compilación condicional en Word VBA
La compilación condicional utiliza directivas del compilador que el editor de VBA evalúa antes de ejecutar el código. Las directivas son #If, #ElseIf, #Else y #End If. A diferencia de las instrucciones If...Then en tiempo de ejecución, la compilación condicional excluye físicamente los bloques de código inactivos del binario compilado. Esto significa que la macro se ejecuta más rápido y no fallará en versiones no compatibles.
El editor de VBA proporciona dos constantes integradas: VBA7 y Win64. VBA7 es True cuando la aplicación host usa la versión 7 de VBA, que comenzó con Office 2010 de 64 bits. Win64 es True solo cuando el sistema operativo es Windows de 64 bits. También puede definir sus propias constantes usando #Const en la parte superior de un módulo o en las propiedades del proyecto, en Argumentos de compilación condicional.
Requisitos previos para usar la compilación condicional
Necesita acceso al editor de VBA (Alt+F11) y un documento o plantilla de Word que contenga macros. Las directivas condicionales funcionan en módulos estándar, módulos de clase y módulos de código de formulario. No se requieren complementos ni permisos especiales. Sin embargo, debe probar la macro compilada en cada versión de Office de destino para confirmar que se ejecuta el bloque de código correcto.
Pasos para configurar la compilación condicional en Word VBA
Siga estos pasos para agregar compilación condicional a una macro existente o para escribir una nueva macro segura para varias versiones.
- Abra el Editor de VBA y localice su macro
Presione Alt+F11 en Word para abrir el editor de VBA. En el Explorador de proyectos, haga doble clic en el módulo que contiene su macro. Si aún no tiene un módulo, haga clic con el botón derecho en el proyecto, elija Insertar > Módulo. - Defina una constante de compilación condicional para la versión de Office
En la parte superior del módulo, agregue una línea#Const. Por ejemplo:#Const AppVersion = 16para Office 2016, 2019 o Microsoft 365. Use15para Office 2013. Esta constante se usará en los bloques#If. - Envuelva el código específico de la versión dentro de #If…#End If
Escriba el código que funciona en Office 2016 o posterior dentro de#If AppVersion = 16 Then. Escriba el código alternativo para Office 2013 dentro de#Else. Cierre con#End If. Ejemplo:#If AppVersion = 16 Then ' Use new Comments.Add2 method ActiveDocument.Comments.Add2 Range:=Selection.Range, Text:="Review" #Else ' Use old Comments.Add method ActiveDocument.Comments.Add Range:=Selection.Range, Text:="Review" #End If - Agregue detección de 64 bits para las instrucciones Declare de API
Si su macro usa funciones de la API de Windows, envuelva la instrucciónDeclaredentro de#If VBA7 Then. Para Office de 64 bits, use la palabra clavePtrSafe. Para 32 bits, omítala. Ejemplo:#If VBA7 Then Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #Else Private Declare Function GetTickCount Lib "kernel32" () As Long #End If - Pruebe la macro en cada versión de Office de destino
Compile la macro (Depurar > Compilar proyecto de VBA) en una versión. Luego copie el documento o la plantilla a un equipo que ejecute una versión diferente de Office. Ejecute la macro y verifique que se ejecute el bloque de código correcto. Si definió la constante manualmente, cambie su valor y vuelva a compilar antes de probar la otra versión.
Uso de argumentos de compilación condicional a nivel de proyecto
En lugar de #Const en la parte superior de un módulo, puede establecer la constante globalmente para todo el proyecto de VBA. En el editor de VBA, haga clic en Herramientas > Propiedades del proyecto. En la pestaña General, escriba la constante en el campo Argumentos de compilación condicional. Por ejemplo: AppVersion = 16. Separe varias constantes con dos puntos: AppVersion = 16: DebugMode = 1. Este método mantiene la constante fuera de su código y facilita cambiarla para las pruebas.
Errores comunes al usar la compilación condicional
“Error de compilación: Else sin If”
Este error ocurre cuando #Else o #End If está mal escrito o falta. Verifique que cada #If tenga un #End If correspondiente. Las directivas deben estar en líneas separadas y comenzar con el símbolo de número al inicio de la línea.
“Tipo definido por el usuario no definido” en una versión diferente
Si usa un tipo personalizado que solo existe en versiones más recientes de Office, envuelva todo el bloque Type...End Type dentro de un bloque de compilación condicional. De lo contrario, el compilador siempre intentará compilarlo y fallará en versiones anteriores.
Constante condicional no evaluada en tiempo de diseño
Cuando usa #Const dentro de un módulo, el valor de la constante se evalúa solo cuando se compila ese módulo. Si cambia la constante en otro módulo, el primer módulo sigue usando el valor antiguo. Para evitar confusiones, defina todas las constantes de versión en un módulo estándar o use argumentos a nivel de proyecto.
Olvidar recompilar después de cambiar la constante
Cambiar el valor de #Const no recompila automáticamente el proyecto. Debe ejecutar Depurar > Compilar proyecto de VBA para aplicar el cambio. Si no recompila, se ejecuta el código compilado antiguo y los bloques condicionales no se actualizan.
Compilación condicional frente a detección de versión en tiempo de ejecución
| Elemento | Compilación condicional (#If) | Detección en tiempo de ejecución (If…Then) |
|---|---|---|
| Cuándo se evalúa el código | En tiempo de compilación | En tiempo de ejecución |
| Código inactivo en el binario compilado | Excluido por completo | Aún presente pero no ejecutado |
| Prevención de errores en versión no compatible | Evita errores de compilación | No puede evitar errores de compilación de Declare de API u objetos faltantes |
| Impacto en el rendimiento | Ninguno | Pequeña sobrecarga por la comprobación de versión |
| Mejor caso de uso | Instrucciones Declare de API, diferencias del modelo de objetos que causan errores de compilación | Diferencias menores de comportamiento que no afectan la compilación |
La compilación condicional es la única forma segura de manejar diferencias que causan errores de compilación, como métodos faltantes o declaraciones de API de 32 bits frente a 64 bits. La detección en tiempo de ejecución funciona para diferencias solo en tiempo de ejecución, como valores de propiedades predeterminados o cambios menores en la interfaz de usuario.
Ahora puede escribir macros de Word VBA que funcionen en Office 2013, 2016, 2019 y Microsoft 365 sin archivos de código separados. Use #Const o Propiedades del proyecto para definir su marca de versión, envuelva el código específico de la versión en bloques #If...#End If y recompile siempre después de cambiar la constante. Para macros con muchas API, agregue #If VBA7 Then con PtrSafe para admitir Office de 64 bits. Este enfoque mantiene su código limpio, reduce el trabajo de mantenimiento y evita fallos en versiones no compatibles.