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] .

Cuadro de diálogo de propiedades del proyecto VBA

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow