Поиск…


Изменение поведения кода во время компиляции

Директива #Const используется для определения пользовательской константы препроцессора. Они позже могут использоваться #If для контроля того, какие блоки кода компилируются и выполняются.

#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

Это приводит к тому, что значение параметра filepath устанавливается на "C:\Users\UserName\Path\To\File.txt" . Удаление #Const линии, или изменить его на #Const DEBUGMODE = 0 приведет к filepath быть установлен на "\\server\share\path\to\file.txt" .

#Const Scope

Директива #Const действует только для одного файла кода (модуля или класса). Он должен быть объявлен для каждого файла, в который вы хотите использовать свою пользовательскую константу. Альтернативно, вы можете объявить #Const глобально для своего проекта, выбрав Tools >> [Project Name] Project Properties. Это вызовет диалоговое окно свойств проекта, в которое мы войдем в объявление константы. В поле «Условные аргументы компиляции» введите [constName] = [value] . Вы можете ввести более 1 константы, разделив их на двоеточие, например [constName1] = [value1] : [constName2] = [value2] .

Диалог свойств проекта VBA

Предварительно определенные константы

Некоторые константы компиляции уже заранее определены. Какие из них будут зависеть от битности офисной версии, в которой вы используете VBA. Обратите внимание, что Vba7 был представлен вместе с Office 2010 для поддержки 64-разрядных версий Office.

постоянная 16 бит 32-битный 64-битный
VBA6 Ложь Если Vba6 Ложь
Vba7 Ложь Если Vba7 Правда
Win16 Правда Ложь Ложь
Win32 Ложь Правда Правда
Win64 Ложь Ложь Правда
макинтош Ложь Если Mac Если Mac

Обратите внимание, что Win64 / Win32 относится к версии Office, а не к версии Windows. Например, Win32 = TRUE в 32-разрядном Office, даже если ОС - это 64-разрядная версия Windows.

Использование Declare Imports, которые работают во всех версиях 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

Это может быть немного упрощено в зависимости от того, какие версии офиса вам нужны для поддержки. Например, не многие люди по-прежнему поддерживают 16-разрядные версии Office. Последняя версия 16-разрядного офиса - версия 4.3, выпущенная в 1994 году , поэтому для почти всех современных случаев (включая 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

Если вам не нужно поддерживать что-либо старше Office 2010, это заявление работает очень хорошо.

' 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow