VBA
Условная компиляция
Поиск…
Изменение поведения кода во время компиляции
Директива #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. Обратите внимание, что 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