VBA
Compilación condicional
Buscar..
Cambiar el comportamiento del código en tiempo de compilación
La directiva #Const
se usa para definir una constante de preprocesador personalizada. Estos pueden ser utilizados posteriormente por #If
para controlar qué bloques de código se compilan y ejecutan.
#Const DEBUGMODE = 1
#If DEBUGMODE Then
Const filepath As String = "C:\Users\UserName\Path\To\File.txt"
#Else
Const filepath As String = "\\server\share\path\to\file.txt"
#End If
Esto hace que el valor de la filepath
de filepath
se establezca en "C:\Users\UserName\Path\To\File.txt"
. Eliminar la línea #Const
, o cambiarla a #Const DEBUGMODE = 0
resultará en que la "\\server\share\path\to\file.txt"
filepath
se establezca en "\\server\share\path\to\file.txt"
.
#Const Scope
La directiva #Const
solo es efectiva para un archivo de código único (módulo o clase). Debe declararse para todos y cada uno de los archivos en los que desea utilizar su constante personalizada. Alternativamente, puede declarar un #Const
globalmente para su proyecto yendo a Herramientas >> [Nombre de su proyecto] Propiedades del proyecto. Esto abrirá el cuadro de diálogo de propiedades del proyecto donde ingresaremos la declaración constante. En el cuadro "Argumentos de compilación condicional", escriba [constName] = [value]
. Puede ingresar más de 1 constante separándolas con dos puntos, como [constName1] = [value1] : [constName2] = [value2]
.
Constantes predefinidas
Algunas constantes de compilación ya están predefinidas. Las que existan dependerán del grado de bit de la versión de Office en la que esté ejecutando VBA. Tenga en cuenta que Vba7 se introdujo junto con Office 2010 para admitir versiones de Office de 64 bits.
Constante | 16 bits | 32 bits | 64 bits |
---|---|---|---|
Vba6 | Falso | Si vba6 | Falso |
Vba7 | Falso | Si vba7 | Cierto |
Win16 | Cierto | Falso | Falso |
Win32 | Falso | Cierto | Cierto |
Win64 | Falso | Falso | Cierto |
Mac | Falso | Si mac | Si mac |
Tenga en cuenta que Win64 / Win32 se refiere a la versión de Office, no a la versión de Windows. Por ejemplo, Win32 = TRUE en Office de 32 bits, incluso si el sistema operativo es una versión de Windows de 64 bits.
Uso de Declare Imports que funciona en todas las versiones de Office
#If Vba7 Then
' It's important to check for Win64 first,
' because Win32 will also return true when Win64 does.
#If Win64 Then
Declare PtrSafe Function GetFoo64 Lib "exampleLib32" () As LongLong
#Else
Declare PtrSafe Function GetFoo Lib "exampleLib32" () As Long
#End If
#Else
' Must be Vba6, the PtrSafe keyword didn't exist back then,
' so we need to declare Win32 imports a bit differently than above.
#If Win32 Then
Declare Function GetFoo Lib "exampleLib32"() As Long
#Else
Declare Function GetFoo Lib "exampleLib"() As Integer
#End If
#End If
Esto se puede simplificar un poco según las versiones de Office que necesite admitir. Por ejemplo, no hay mucha gente que aún admita versiones de Office de 16 bits. La última versión de 16 bit office fue la versión 4.3, lanzada en 1994 , por lo que la siguiente declaración es suficiente para casi todos los casos modernos (incluido Office 2007).
#If Vba7 Then
' It's important to check for Win64 first,
' because Win32 will also return true when Win64 does.
#If Win64 Then
Declare PtrSafe Function GetFoo64 Lib "exampleLib32" () As LongLong
#Else
Declare PtrSafe Function GetFoo Lib "exampleLib32" () As Long
#End If
#Else
' Must be Vba6. We don't support 16 bit office, so must be Win32.
Declare Function GetFoo Lib "exampleLib32"() As Long
#End If
Si no tiene que admitir nada más antiguo que Office 2010, esta declaración funciona bien.
' We only have 2010 installs, so we already know we have Vba7.
#If Win64 Then
Declare PtrSafe Function GetFoo64 Lib "exampleLib32" () As LongLong
#Else
Declare PtrSafe Function GetFoo Lib "exampleLib32" () As Long
#End If