VBA
Ключевое слово Option VBA
Поиск…
Синтаксис
- Опция optionName [значение]
- Вариант Явный
- Вариант сравнения {Текст | Двоичные | База данных}
- Дополнительный модуль
- База опций {0 | 1}
параметры
вариант | подробность |
---|---|
Явный | Требовать объявление переменной в указанном модуле (в идеале, все); с указанной опцией, использование необъявленной (/ неверно введенной) переменной становится ошибкой компиляции. |
Сравнить текст | Делает сравнения строк в модуле нечувствительными к регистру на основе языкового стандарта системы, приоритетом которого является алфавитная эквивалентность (например, «a» = «A»). |
Сравнить двоичный | Режим сравнения строк по умолчанию. Делает сравнения строк в модуле чувствительными к регистру, сравнивая строки, используя двоичное представление / числовое значение каждого символа (например, ASCII). |
Сравнить базы данных | (Только для MS-Access) Делает сравнения строк в модуле так, как в SQL-заявлении. |
Частный модуль | Препятствует модуля Public члена от доступа извне проекта , что модуль проживает в, эффективно скрывая процедуры от хост - приложения (то есть , не доступные для использования в качестве макросов или функций , определяемых пользователем). |
База опций 0 | Настройки по умолчанию. Устанавливает ограничение неявного массива на 0 в модуле. Когда массив объявляется без явного нижнего граничного значения 0 будет использоваться. |
Вариант базы 1 | Устанавливает ограничение неявного массива на 1 в модуле. Когда массив объявляется без явного нижнего граничного значения 1 будет использоваться. |
замечания
Намного проще управлять границами массивов, явно объявляя границы, а не позволяя компилятору вернуться к объявлению Option Base {0|1}
. Это можно сделать так:
Dim myStringsA(0 To 5) As String '// This has 6 elements (0 - 5)
Dim myStringsB(1 To 5) As String '// This has 5 elements (1 - 5)
Dim myStringsC(6 To 9) As String '// This has 3 elements (6 - 9)
Вариант Явный
Рекомендуется использовать Option Explicit
в VBA, поскольку он заставляет разработчика объявлять все свои переменные перед использованием. Это также имеет другие преимущества, такие как автоматическая капитализация объявленных имен переменных и IntelliSense.
Option Explicit
Sub OptionExplicit()
Dim a As Integer
a = 5
b = 10 '// Causes compile error as 'b' is not declared
End Sub
Настройка Требовать объявление переменной в инструментах VBE ► Функции ► Страница свойств редактора помещает оператор Option Explicit в начало каждого вновь созданного листа кода.
Это позволит избежать ошибок глупого кодирования, таких как орфографические ошибки, а также повлиять на использование правильного типа переменной в объявлении переменной. (Еще несколько примеров приведены ВСЕГДА Используйте «Option Explicit» .)
Вариант сравнения {Binary | Текст | База данных}
Вариант сравнения Двоичный
Двоичное сравнение делает все проверки для равенства строк внутри чувствительного к модулю / классу. Технически с этой опцией строковые сравнения выполняются с использованием порядка сортировки двоичных представлений каждого символа.
A <B <E <Z <a <b <e <z
Если в модуле не задано значение Option Compare, Binary используется по умолчанию.
Option Compare Binary
Sub CompareBinary()
Dim foo As String
Dim bar As String
'// Case sensitive
foo = "abc"
bar = "ABC"
Debug.Print (foo = bar) '// Prints "False"
'// Still differentiates accented characters
foo = "ábc"
bar = "abc"
Debug.Print (foo = bar) '// Prints "False"
'// "b" (Chr 98) is greater than "a" (Chr 97)
foo = "a"
bar = "b"
Debug.Print (bar > foo) '// Prints "True"
'// "b" (Chr 98) is NOT greater than "á" (Chr 225)
foo = "á"
bar = "b"
Debug.Print (bar > foo) '// Prints "False"
End Sub
Опция Сравнить текст
Параметр Compare Text позволяет сравнивать все строки в модуле / классе с использованием нечувствительного к регистру сравнения.
(A | a) <(B | b) <(Z | z)
Option Compare Text
Sub CompareText()
Dim foo As String
Dim bar As String
'// Case insensitivity
foo = "abc"
bar = "ABC"
Debug.Print (foo = bar) '// Prints "True"
'// Still differentiates accented characters
foo = "ábc"
bar = "abc"
Debug.Print (foo = bar) '// Prints "False"
'// "b" still comes after "a" or "á"
foo = "á"
bar = "b"
Debug.Print (bar > foo) '// Prints "True"
End Sub
База данных сравнения опций
База данных сравнения опций доступна только в MS Access. Он устанавливает модуль / класс для использования текущих параметров базы данных, чтобы определить, следует ли использовать текстовый или двоичный режим.
Примечание. Использование этого параметра не рекомендуется, если только модуль не используется для записи пользовательских UDF доступа (функций, определенных пользователем), которые должны обрабатывать сопоставления текста так же, как SQL-запросы в этой базе данных.
База опций {0 | 1}
Option Base
используется для объявления нижней границы элементов массива по умолчанию. Он объявляется на уровне модуля и действителен только для текущего модуля.
По умолчанию (и, следовательно, если база опций не указана), Base равно 0. Это означает, что первый элемент любого массива, объявленного в модуле, имеет индекс 0.
Если задана Option Base 1
, первый элемент массива имеет индекс 1
Пример в базе 0:
Option Base 0
Sub BaseZero()
Dim myStrings As Variant
' Create an array out of the Variant, having 3 fruits elements
myStrings = Array("Apple", "Orange", "Peach")
Debug.Print LBound(myStrings) ' This Prints "0"
Debug.Print UBound(myStrings) ' This print "2", because we have 3 elements beginning at 0 -> 0,1,2
For i = 0 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
End Sub
Тот же пример с базой 1
Option Base 1
Sub BaseOne()
Dim myStrings As Variant
' Create an array out of the Variant, having 3 fruits elements
myStrings = Array("Apple", "Orange", "Peach")
Debug.Print LBound(myStrings) ' This Prints "1"
Debug.Print UBound(myStrings) ' This print "3", because we have 3 elements beginning at 1 -> 1,2,3
For i = 0 To UBound(myStrings)
Debug.Print myStrings(i) ' This triggers an error 9 "Subscript out of range"
Next i
End Sub
Второй пример сгенерировал подстрочный индекс (Error 9) на первом этапе цикла, поскольку была предпринята попытка получить доступ к индексу 0 массива, и этот индекс не существует, поскольку модуль объявлен с Base 1
Правильный код с базой 1:
For i = 1 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
Следует отметить, что функция Split всегда создает массив с индексом элемента на основе нуля независимо от любого параметра Option Base
. Примеры использования функции Split можно найти здесь.
- Функция разделения
- Возвращает одномерный массив на основе нуля, содержащий указанное количество подстрок.
В Excel свойства Range.Value
и Range.Formula
для диапазона с несколькими Range.Formula
всегда возвращают массив 2D Range.Formula
на основе 1.
Аналогично, в ADO метод Recordset.GetRows
всегда возвращает 2D-массив на основе 1.
Одна из рекомендуемых «лучших практик» - всегда использовать функции LBound и UBound для определения экстентов массива.
'for single dimensioned array
Debug.Print LBound(arr) & ":" & UBound(arr)
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
'for two dimensioned array
Debug.Print LBound(arr, 1) & ":" & UBound(arr, 1)
Debug.Print LBound(arr, 2) & ":" & UBound(arr, 2)
Dim i As long, j As Long
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
Debug.Print arr(i, j)
Next j
Next i
База Option Base 1
должна находиться в верхней части каждого модуля кода, где массив создается или изменен, если массивы должны последовательно создаваться с нижней границей 1.