Nothing — ключевое слово — Visual Basic
- Чтение занимает 3 мин
В этой статье
Представляет значение по умолчанию для любого типа данных.Represents the default value of any data type. Для ссылочных типов значением по умолчанию является ссылка на null
.For reference types, the default value is the null
reference. Для типов значений значение по умолчанию зависит от того, допускает ли тип значения значение null.For value types, the default value depends on whether the value type is nullable.
Примечание
Для типов значений, не допускающих значения NULL, Nothing
в Visual Basic отличаются C#от null
в.
Nothing
in Visual Basic differs from null
in C#. В Visual Basic, если для переменной типа значения, не допускающего значения NULL, задано значение Nothing
, для переменной задается по умолчанию для объявленного типа.In Visual Basic, if you set a variable of a non-nullable value type to Nothing
, the variable is set to the default value for its declared type. В C#при присвоении null
переменной типа значения, не допускающего значения NULL, возникает ошибка времени компиляции.In C#, if you assign a variable of a non-nullable value type to null
, a compile-time error occurs.ПримечанияRemarks
Nothing
представляет значение по умолчанию для типа данных.Nothing
represents the default value of a data type. Значение по умолчанию зависит от того, имеет ли переменная тип значения или ссылочный тип.The default value depends on whether the variable is of a value type or of a reference type.
Переменная типа значения напрямую содержит его значение.A variable of a value type directly contains its value. Типы значений включают все числовые типы данных, Boolean
, Char
, Date
, все структуры и все перечисления.Value types include all numeric data types, Boolean
, Char
, Date
, all structures, and all enumerations. Переменная ссылочного типа хранит ссылку на экземпляр объекта в памяти.A variable of a reference type stores a reference to an instance of the object in memory. Ссылочные типы включают классы, массивы, делегаты и строки.Reference types include classes, arrays, delegates, and strings. Для получения дополнительной информации см. Value Types and Reference Types.For more information, see Value Types and Reference Types.
Если переменная имеет тип значения, поведение Nothing
зависит от того, имеет ли переменная тип данных, допускающий значение null. If a variable is of a value type, the behavior of Nothing
depends on whether the variable is of a nullable data type. Чтобы представить тип значения, допускающий значение null, добавьте модификатор ?
к имени типа.To represent a nullable value type, add a ?
modifier to the type name. Присвоение Nothing
переменной, допускающей значение null, присваивает значение null
.Assigning Nothing
to a nullable variable sets the value to null
. Дополнительные сведения и примеры см. в разделе типы значений, допускающие значения NULL.For more information and examples, see Nullable Value Types.
Если переменная имеет тип значения, не допускающий значения NULL, при присвоении Nothing
ей присваивается значение по умолчанию для его объявленного типа.If a variable is of a value type that is not nullable, assigning Nothing
to it sets it to the default value for its declared type. Если этот тип содержит члены переменных, все они устанавливаются в значения по умолчанию. If that type contains variable members, they are all set to their default values. Следующий пример иллюстрирует это для скалярных типов.The following example illustrates this for scalar types.
Module Module1 Sub Main() Dim ts As TestStruct Dim i As Integer Dim b As Boolean ' The following statement sets ts.Name to null and ts.Number to 0. ts = Nothing ' The following statements set i to 0 and b to False. i = Nothing b = Nothing Console.WriteLine($"ts.Name: {ts.Name}") Console.WriteLine($"ts.Number: {ts.Number}") Console.WriteLine($"i: {i}") Console.WriteLine($"b: {b}") Console.ReadKey() End Sub Public Structure TestStruct Public Name As String Public Number As Integer End Structure End Module
Если переменная имеет ссылочный тип, то при присвоении Nothing
переменной ей присваивается null
ссылка на тип переменной. If a variable is of a reference type, assigning Nothing
to the variable sets it to a null
reference of the variable’s type. Переменная, для которой задана ссылка null
, не связана ни с одним объектом.A variable that is set to a null
reference is not associated with any object. Следующий пример демонстрирует это:The following example demonstrates this:
Module Module1
Sub Main()
Dim testObject As Object
' The following statement sets testObject so that it does not refer to
' any instance.
testObject = Nothing
Dim tc As New TestClass
tc = Nothing
' The fields of tc cannot be accessed. The following statement causes
' a NullReferenceException at run time. (Compare to the assignment of
' Nothing to structure ts in the previous example.)
'Console.WriteLine(tc.Field1)
End Sub
Class TestClass
Public Field1 As Integer
' . . .
End Class
End Module
При проверке того, является ли переменная ссылки (или типа значения Nullable) null
, не используйте = Nothing
или <> Nothing
.When checking whether a reference (or nullable value type) variable is
, do not use = Nothing
or <> Nothing
. Всегда используйте Is Nothing
или IsNot Nothing
.Always use Is Nothing
or IsNot Nothing
.
Для строк в Visual Basic пустая строка равна Nothing
.For strings in Visual Basic, the empty string equals Nothing
. Таким образом, "" = Nothing
имеет значение true.Therefore, "" = Nothing
is true.
В следующем примере показаны сравнения, в которых используются операторы Is
и IsNot
.The following example shows comparisons that use the Is
and IsNot
operators:
Module Module1
Sub Main()
Dim testObject As Object
testObject = Nothing
Console. WriteLine(testObject Is Nothing)
' Output: True
Dim tc As New TestClass
tc = Nothing
Console.WriteLine(tc IsNot Nothing)
' Output: False
' Declare a nullable value type.
Dim n? As Integer
Console.WriteLine(n Is Nothing)
' Output: True
n = 4
Console.WriteLine(n Is Nothing)
' Output: False
n = Nothing
Console.WriteLine(n IsNot Nothing)
' Output: False
Console.ReadKey()
End Sub
Class TestClass
Public Field1 As Integer
Private field2 As Boolean
End Class
End Module
Если переменная объявляется без использования предложения As
и для нее задано значение Nothing
, переменная имеет тип Object
.If you declare a variable without using an As
clause and set it to Nothing
, the variable has a type of Object
. Примером этого является Dim something = Nothing
Dim something = Nothing
. В этом случае возникает ошибка времени компиляции, когда Option Strict
находится в состоянии on и Option Infer
отключена.A compile-time error occurs in this case when Option Strict
is on and Option Infer
is off.При назначении Nothing
переменной объекта она больше не ссылается ни на один экземпляр объекта.When you assign Nothing
to an object variable, it no longer refers to any object instance. Если переменная ранее ссылалась на экземпляр, присвоение ей значения Nothing
не приводит к завершению самого экземпляра.If the variable had previously referred to an instance, setting it to Nothing
does not terminate the instance itself. Экземпляр завершается, и связанные с ним память и системные ресурсы освобождаются, только если сборщик мусора (GC) обнаружит, что активные ссылки не остались.The instance is terminated, and the memory and system resources associated with it are released, only after the garbage collector (GC) detects that there are no active references remaining.
Nothing
отличается от объекта DBNull, который представляет неинициализированный вариант или несуществующий столбец базы данных.Nothing
differs from the DBNull object, which represents an uninitialized variant or a nonexistent database column.
См. такжеSee also
Поиск на листе Excel, примеры использования Find на VBA
Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.
Поиск перебором значений
Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:
Sheets("Данные").Select For y = 1 To Cells.SpecialCells(xlLastCell).Row If Cells(y, 1) = "123" Then Exit For End If Next y MsgBox "Нашел в строке: " + CStr(y)
Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.
Поиск функцией Find
Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:
Sheets("Данные").Select Set fcell = Columns("A:A").Find("123") If Not fcell Is Nothing Then MsgBox "Нашел в строке: " + CStr(fcell.Row) End If
Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист «Данные»;
2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.
Полностью синтаксис оператора поиска выглядит так:
Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
What — Строка с текстом, который ищем или любой другой тип данных Excel
After — Ячейка, после которой начать поиск. Обратите внимание, что это должна быть именно единичная ячейка, а не диапазон. Поиск начинается после этой ячейки, а не с нее. Поиск в этой ячейке произойдет только когда весь диапазон будет просмотрен и поиск начнется с начала диапазона и до этой ячейки включительно.
LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).
LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).
SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)
SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)
MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)
MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)
SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.
Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).
Примеры поиска функцией Find
Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»
With Worksheets(1).Range("A1:A50") Set c = .Find("asd", LookIn:=xlValues) Do While Not c Is Nothing c.Value = "qwe" Set c = .FindNext(c) Loop End With
Обратите внимание: Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:
Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.
With Worksheets(1).Range("A1:A50") Set c = .Find("asd", lookin:=xlValues) If Not c Is Nothing Then firstResult = c.Address Do c.Font.Bold = True Set c = .FindNext(c) If c Is Nothing Then Exit Do Loop While c.Address <> firstResult End If End With
В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.
Пример 3: Продолжение поиска с использованием Find с параметром After.
With Worksheets(1).Range("A1:A50") Set c = .Find("asd", lookin:=xlValues) If Not c Is Nothing Then firstResult = c.Address Do c.Font.Bold = True Set c = .Find("asd", After:=c, lookin:=xlValues) If c Is Nothing Then Exit Do Loop While c.Address <> firstResult End If End With
Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.
Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)
lLastRow = Cells.SpecialCells(xlLastCell).Row lLastCol = Cells.SpecialCells(xlLastCell).Column Application.FindFormat.Font.Italic = True With Worksheets(1).Range(Cells(1, 1), Cells(lLastRow, lLastCol)) Set c = .Find("", SearchFormat:=True) Do While Not c Is Nothing c.Font.Italic = False Set c = . Find("", After:=c, SearchFormat:=True) Loop End With
Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)
Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.
Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.
Свойство FindFormat можно задавать разными способами, например, так:
With Application.FindFormat.Font .Name = "Arial" .FontStyle = "Regular" .Size = 10 End With
Следующий пример — применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.
Пример 5: Найти последнюю колонку и столбец, заполненные данными
Set c = Worksheets(1).UsedRange.Find("*", SearchDirection:=xlPrevious) If Not c Is Nothing Then lLastRow = c.Row: lLastCol = c.Column Else lLastRow = 1: lLastCol = 1 End If MsgBox "lLastRow=" & lLastRow & " lLastCol=" & lLastCol
В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т. ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.
При поиске можно так же использовать шаблоны, чтобы найти текст по маске, следующий пример это демонстрирует.
Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.
With Worksheets(1).Cells Set c = .Find("т??т*", LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then firstResult = c.Address Do c.Font.Color = RGB(255, 0, 0) Set c = .FindNext(c) If c Is Nothing Then Exit Do Loop While c.Address <> firstResult End If End With
Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;
~ — для обозначения символов *, ? и ~. (т.е. чтобы искать в тексте вопросительный знак, нужно написать ~?, чтобы искать именно звездочку (*), нужно написать ~* и наконец, чтобы найти в тексте тильду, необходимо написать ~~)
Поиск даты с помощью Find
Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:
- Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
- В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas
Приведу несколько примеров поиска даты.
Пример 7: Найти текущую дату на листе независимо от формата отображения даты.
d = Date Set c = Cells. Find(d, LookIn:=xlFormulas, LookAt:=xlWhole) If Not c Is Nothing Then MsgBox "Нашел" Else MsgBox "Не нашел" End If
Пример 8: Найти 1 марта 2018 г.
d = #3/1/2018# Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole) If Not c Is Nothing Then MsgBox "Нашел" Else MsgBox "Не нашел" End If
Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.
Тем не менее, можно найти, например, 1 марта независимо от года.
Пример 9: Найти 1 марта любого года.
d = #3/1/1900# Set c = Cells.Find(Format(d, "m\/d\/"), LookIn:=xlFormulas, LookAt:=xlPart) If Not c Is Nothing Then MsgBox "Нашел" Else MsgBox "Не нашел" End If
Операторы условия в VBA — Информационные технологии
Наиболее важные операторы условия, используемые в Excel VBA – это операторы If … Then и Select Case. Оба этих выражения проверяют одно или несколько условий и, в зависимости от результата, выполнят различные действия. Далее мы поговорим об этих двух операторах условия подробнее.
Оператор «If … Then» в Visual Basic
Оператор If … Then проверяет условие и, если оно истинно (TRUE), то выполняется заданный набор действий. Также может быть определён набор действий, которые должны быть выполнены, если условие ложно (FALSE).
Синтаксис оператора If … Then вот такой:
If Условие1 Then
Действия в случае, если выполняется Условие1
ElseIf Условие2 Then
Действия в случае, если выполняется Условие2
Else
Действия в случае, если не выполнено ни одно из Условий
End If
В этом выражении элементы ElseIf и Else оператора условия могут не использоваться, если в них нет необходимости.
Ниже приведён пример, в котором при помощи оператора If … Then цвет заливки активной ячейки изменяется в зависимости от находящегося в ней значения:
If ActiveCell.Value < 5 Then ActiveCell.Interior.Color = 65280 'Ячейка окрашивается в зелёный цвет ElseIf ActiveCell.Value < 10 Then ActiveCell.Interior.Color = 49407 'Ячейка окрашивается в оранжевый цвет Else ActiveCell.Interior.Color = 255 'Ячейка окрашивается в красный цвет End If
Обратите внимание, что как только условие становится истинным, выполнение условного оператора прерывается. Следовательно, если значение переменной ActiveCell меньше 5, то истинным становится первое условие и ячейка окрашивается в зелёный цвет. После этого выполнение оператора If … Then прерывается и остальные условия не проверяются.
Более подробно о применении в VBA условного оператора If … Then можно узнать на сайте Microsoft Developer Network.
Оператор «Select Case» в Visual Basic
Оператор Select Case схож с оператором If … Then в том, что он также проверяет истинность условия и, в зависимости от результата, выбирает один из вариантов действий.
Синтаксис оператора Select Case вот такой:
Select Case Выражение
Case Значение1
Действия в случае, если результат Выражения соответствует Значению1
Case Значение2
Действия в случае, если результат Выражения соответствует Значению2
…Case Else
Действия в случае, если результат Выражения не соответствует ни одному из перечисленных вариантов Значения
End Select
Элемент Case Else не является обязательным, но его рекомендуется использовать для обработки непредвиденных значений.
В следующем примере при помощи конструкции Select Case изменяется цвет заливки текущей ячейки в зависимости от находящегося в ней значения:
Select Case ActiveCell. Value Case Is <= 5 ActiveCell.Interior.Color = 65280 'Ячейка окрашивается в зелёный цвет Case 6, 7, 8, 9 ActiveCell.Interior.Color = 49407 'Ячейка окрашивается в оранжевый цвет Case 10 ActiveCell.Interior.Color = 65535 'Ячейка окрашивается в жёлтый цвет Case 11 To 20 ActiveCell.Interior.Color = 10498160 'Ячейка окрашивается в лиловый цвет Case Else ActiveCell.Interior.Color = 255 'Ячейка окрашивается в красный цвет End Select
В приведённом выше примере показано, как можно различными способами задать значение для элемента Case в конструкции Select Case. Вот эти способы:
Case Is <= 5 | Таким образом при помощи ключевого слова Case Is можно проверить, удовлетворяет ли значение Выражения условию вида <=5. |
Case 6, 7, 8, 9 | Так можно проверить, совпадает ли значение Выражения с одним из перечисленных значений. Перечисленные значения разделяются запятыми. |
Case 10 | Так проверяется, совпадает ли значение Выражения с заданным значением. |
Case 11 To 20 | Таким образом можно записать выражение для проверки, удовлетворяет ли значение Выражения условию вида от 11 до 20 (эквивалентно неравенству “11<=значение<=20”). |
Case Else | Вот так, при помощи ключевого слова Else, указываются действия для того случая, если значение Выражения не соответствует ни одному из перечисленных вариантов Case. |
Как только одно из условий будет найдено, выполняются соответствующие действия и производится выход из конструкции Select Case. То есть в любом случае будет выполнена только одна из перечисленных ветвей Case.
Более подробную информацию о работе VBA оператора Select Case можно найти на сайте Microsoft Developer Network.
Оцените качество статьи. Нам важно ваше мнение:
Типы ошибок в VBA — Информационные технологии
При выполнении макросов Excel могут возникнуть ошибки, которые в VBA делят на три категории:
Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.
Ошибки компиляции
Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.
Если при написании кода допущена синтаксическая ошибка, то редактор VBA сигнализирует об этом немедленно: либо при помощи окна с сообщением, либо выделяя ошибку красным цветом, в зависимости от статуса режима Auto Syntax Check.
Примечание: При включённом режиме Auto Syntax Check каждый раз, при появлении в редакторе Visual Basic во введённом коде синтаксической ошибки, будет показано соответствующее сообщение. Если же этот режим выключен, то редактор VBA продолжит сообщать о синтаксических ошибках, просто выделяя их красным цветом. Опцию Auto Syntax Check можно включить/выключить в меню Tools > Options редактора Visual Basic.
В некоторых случаях ошибка компиляции может быть обнаружена при выполнении компиляции кода, непосредственно перед тем, как макрос будет выполнен. Обычно ошибку компиляции несложно обнаружить и исправить, потому что компилятор VBA даёт информацию о характере и причине ошибки.
Например, сообщение “Compile error: Variable not defined” при попытке запустить выполнение кода VBA говорит о том, что происходит попытка использовать или обратиться к переменной, которая не была объявлена для текущей области (такая ошибка может возникнуть только если используется Option Explicit).
Ошибки выполнения
Ошибки выполнения возникают в процессе выполнения кода и приводят к остановке выполнения программы. Этот тип ошибок VBA, как правило, также не сложно обнаружить и исправить, так как сообщается информация о характере ошибки и место в коде, где произошла остановка.
Примером такой ошибки может служить попытка выполнить деление на ноль. В результате будет показано сообщение “Run-time error ’11’: Division by zero“.
В зависимости от структуры проекта VBA, может быть предложено выполнить отладку кода (как показано на рисунке ниже). В этом случае при нажатии на кнопку Debug (в окне сообщения о необходимости отладки) будет выделена цветом строка кода, которая стала причиной ошибки VBA.
Получив такое сообщение и видя выделенную строку кода, как в приведённом выше примере, обнаружить причину ошибки будет совсем не сложно.
В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).
Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:
5 | Недопустимый вызов процедуры (Invalid procedure call) |
7 | Недостаточно памяти (Out of memory) |
9 | Индекс вне заданного диапазона (Subscript out of range) Эта ошибка возникает при попытке обратиться к элементу массива за пределами заданного размера массива – например, если объявлен массив с индексами от 1 до 10, а мы пытаемся обратиться к элементу этого же массива с индексом 11. |
11 | Деление на ноль (Division by zero) |
13 | Несоответствие типа (Type mismatch) Эта ошибка возникает при попытке присвоить переменной значение не соответствующего типа – например, объявлена переменная i типа Integer, и происходит попытка присвоить ей значение строкового типа. |
53 | Файл не найден (File not found) Иногда возникает при попытке открыть не существующий файл. |
Перехват ошибок выполнения
Не все ошибки выполнения бывают вызваны недочётами в коде. Например, ошибки VBA не удастся избежать, если для работы макроса необходимо открыть файл с данными, а этого файла не существует. В таких случаях признаком профессионализма будет перехват ошибок и написание кода VBA, который будет выполняться при их возникновении. Таким образом, вместо неприятных сбоев будет происходить изящное завершение работы макроса.
Для того, чтобы помочь справиться с возникающими ошибками, VBA предоставляет разработчику операторы On Error и Resume. Эти операторы отслеживают ошибки и направляют выполнение макроса в специальный раздел кода VBA, в котором происходит обработка ошибки. После выполнения кода обработки ошибки, работа программы может быть продолжена с того места, где возникла ошибка, или макрос может быть остановлен полностью. Далее это показано на примере.
'Процедура Sub присваивает переменным Val1 и Val2 значения, 'хранящиеся в ячейках A1 и B1 рабочей книги Data.xlsx расположенной в каталоге C:\Documents and Settings Sub Set_Values(Val1 As Double, Val2 As Double) Dim DataWorkbook As Workbook On Error GoTo ErrorHandling 'Открываем рабочую книгу с данными Set DataWorkbook = Workbooks.Open("C:\Documents and Settings\Data") 'Присваиваем переменным Val1 и Val2 данные из рабочей книги DataWorkbook Val1 = Sheets("Лист1").Cells(1, 1) Val2 = Sheets("Лист1").Cells(1, 2) DataWorkbook.Close Exit Sub ErrorHandling: 'Если файл не найден, предлагаем пользователю разместить его в 'нужном месте и продолжить работу MsgBox "Рабочая книга не найдена! " & _ "Пожалуйста добавьте книгу Data.xlsx в каталог C:\Documents and Settings и нажмите OK. " Resume End Sub
В этом коде производится попытка открыть файл Excel с именем Data. Если файл не найден, то пользователю будет предложено поместить этот файл в нужную папку. После того, как пользователь сделает это и нажмёт ОК, выполнение кода продолжится, и попытка открыть этот файл повторится. При желании вместо попытки открыть нужный файл, выполнение процедуры Sub может быть прервано в этом месте при помощи команды Exit Sub.
Логические ошибки
Логические ошибки (или баги) возникают в процессе выполнения кода VBA, но позволяют ему выполняться до самого завершения. Правда в результате могут выполняться не те действия, которые ожидалось, и может быть получен неверный результат. Такие ошибки обнаружить и исправить труднее всего, так как компилятор VBA их не распознаёт и не может указать на них так, как это происходит с ошибками компиляции и выполнения.
Например, при создании макроса в процедуре случайно были просуммированы не те переменные, которые требовалось просуммировать. Результат будет ошибочным, но макрос будет продолжать выполняться до завершения.
Редактор Excel VBA предоставляет набор инструментов отладки, которые помогут найти и исправить логические ошибки в коде VBA. В данной статье мы не будем рассматривать подробно эти инструменты. Любознательный пользователь может найти обзор инструментов отладки VBA на сайте Microsoft Help & Support (на английском).
Оцените качество статьи. Нам важно ваше мнение:
Переменные и константы в VBA
В VBA, как и в любом другом языке программирования, переменные и константы используются для хранения каких-либо значений. Как и следует из названия, переменные могут изменяться, константы же хранят фиксированные значения.
Например, константа Pi хранит значение 3,14159265… Число “Пи” не будет изменяться в ходе выполнения программы, но все же хранить такое значение удобнее как константу.
В то же время мы можем использовать переменную sVAT_Rate для хранения ставки НДС на покупаемые товары. Величина переменной sVAT_Rate может изменяться в зависимости от того, что за товар приобретается.
Типы данных
Все переменные и константы относятся к определённому типу данных. В таблице ниже приведены типы данных, используемые в VBA, с описанием и диапазоном возможных значений:
Тип данных | Размер | Описание | Диапазон значений |
---|---|---|---|
Byte | 1 байт | Положительные целые числа; часто используется для двоичных данных | от 0 до 255 |
Boolean | 2 байта | Может принимать значения либо True, либо False | True или False |
Integer | 2 байта | Целые числа (нет дробной части) | от -32 768 до +32 767 |
Long | 4 байта | Большие целые числа (нет дробной части) | от -2 147 483 648 до +2 147 483 647 |
Single | 4 байта | Число с плавающей точкой одинарной точности | от -3. 4e38 до +3.4e38 |
Double | 8 байт | Число с плавающей точкой двойной точности | от -1.8e308 до +1.8e308 |
Currency | 8 байт | Число с плавающей точкой, с фиксированным количеством десятичных разрядов | от -922 337 203 685 477.5808 до +922 337 203 685 477.5807 |
Date | 8 байт | Дата и время – данные типа Date представлены числом с плавающей точкой. Целая часть этого числа выражает дату, а дробная часть – время | от 1 Января 100 до 31 Декабря 9999 |
Object | 4 байта | Ссылка на объект | Любая ссылка на объект |
String | изменяется | Набор символов. Тип String может иметь фиксированную или изменяющуюся длину. Чаще используется с изменяющейся длиной | Фиксированной длины – приблизительно до 65 500 символов. Переменной длины – приблизительно до 2 миллиардов символов |
Variant | изменяется | Может содержать дату, число с плавающей точкой или строку символов. Этот тип используют в тех случаях, когда заранее не известно, какой именно тип данных будет введён | Число – Double, строка – String |
Очевидно, что пользуясь приведённой выше таблицей и правильно выбирая тип данных, можно использовать память более экономно (например, выбрать тип данных Integer вместо Long или Single вместо Double). Однако, используя более компактные типы данных, нужно внимательно следить за тем, чтобы в коде не было попыток уместить в них не соразмерно большие значения.
Объявление переменных и констант
Примечание переводчика: Говоря о переменных в VBA, стоит упомянуть ещё один очень важный момент. Если мы объявляем переменную, но не присваиваем ей какое-либо значение, то она инициализируется значением по умолчанию:
• текстовые строки – инициализируются пустыми строками;
• числа – значением 0;
• переменные типа Boolean – False;
• даты – 30 декабря 1899.
Прежде чем использовать переменную или константу, её нужно объявить. Для этого в макрос добавляют вот такую простую строку кода:
Dim Имя_Переменной As Тип_Данных
В показанной выше строке кода Имя_Переменной – это имя переменной, которая будет использована в коде, а Тип_Данных – это один из типов данных из таблицы, приведённой чуть ранее в этой статье. Например:
Dim sVAT_Rate As Single Dim i As Integer
Аналогично объявляются константы, но при объявлении констант обязательно сразу указывается их значение. Например, вот так:
Const iMaxCount = 5000 Const iMaxScore = 100
Объявлять переменные в Excel не обязательно. По умолчанию все введённые, но не объявленные переменные в Excel будут иметь тип Variant и смогут принять как числовое, так и текстовое значение.
Таким образом, программист в любой момент сможет использовать новую переменную (даже если она не была объявлена), и Excel будет рассматривать её как переменную типа Variant. Однако, есть несколько причин, почему так поступать не следует:
- Использование памяти и скорость вычислений. Если не объявлять переменную с указанием типа данных, то по умолчанию для неё будет установлен тип Variant. Этот тип данных использует больше памяти, чем другие типы данных.Казалось бы, несколько лишних байт на каждую переменную – не так уж много, но на практике в создаваемых программах могут быть тысячи переменных (особенно при работе с массивами). Поэтому излишняя память, используемая переменными типа Variant, по сравнению с переменными типа Integer или Single, может сложится в значительную сумму.К тому же, операции с переменными типа Variant выполняются гораздо медленнее, чем с переменными других типов, соответственно лишняя тысяча переменных типа Variant может значительно замедлить вычисления.
- Профилактика опечаток в именах переменных. Если все переменные объявляются, то можно использовать оператор VBA – Option Explicit (о нём расскажем далее), чтобы выявить все не объявленные переменные.Таким образом исключается появление в программе ошибки в результате не верно записанного имени переменной. Например, используя в коде переменную с именем sVAT_Rate, можно допустить опечатку и, присваивая значение этой переменной, записать: “VATRate = 0,175”. Ожидается, что с этого момента, переменная sVAT_Rate должна содержать значение 0,175 – но, конечно же, этого не происходит. Если же включен режим обязательного объявления всех используемых переменных, то компилятор VBA сразу же укажет на ошибку, так как не найдёт переменную VATRate среди объявленных.
- Выделение значений, не соответствующих объявленному типу переменной. Если объявить переменную определённого типа и попытаться присвоить ей данные другого типа, то появится ошибка, не исправив которую, можно получить сбой в работе программы. На первый взгляд, это может показаться хорошей причиной, чтобы не объявлять переменные, но на самом деле, чем раньше выяснится, что одна из переменных получила не те данные, которые должна была получить – тем лучше! Иначе, если программа продолжит работу, результаты могут оказаться неверными и неожиданными, а найти причину ошибок будет гораздо сложнее.Возможно также, что макрос будет “успешно” выполнен. В результате ошибка останется незамеченной и работа продолжится с неверными данными!
В связи с этим, неверный тип данных желательно обнаруживать и как можно раньше исправлять такие ошибки в коде. По этим причинам при написании макроса VBA рекомендуется объявлять все переменные.
Option Explicit
Оператор Option Explicit заставляет объявлять все переменные, которые будут использованы в коде VBA, и при компиляции выделяет все не объявленные переменные как ошибки (прежде чем будет запущено выполнение кода). Применить этот оператор не сложно – просто запишите в самом верху файла VBA такую строку:
Option Explicit
Если хотите всегда вставлять Option Explicit в начало каждого нового созданного модуля VBA, то это можно делать автоматически. Для этого необходимо включить параметр Require Variable Declaration в настройках редактора VBA.
Это делается так:
- В меню редактора Visual Basic нажмите Tools > Options
- В появившемся диалоговом окне откройте вкладку Editor
- Отметьте галочкой параметр Require Variable Declaration и нажмите ОК
При включенном параметре строка Option Explicit будет автоматически вставляться в начало каждого нового созданного модуля.
Область действия переменных и констант
Каждая объявленная переменная или константа имеет свою ограниченную область действия, то есть ограниченную часть программы, в которой эта переменная существует. Область действия зависит от того, где было сделано объявление переменной или константы. Возьмём, к примеру, переменную sVAT_Rate, которая используется в функции Total_Cost. В следующей таблице рассмотрены два варианта области действия переменной sVAT_Rate, объявленной в двух различных позициях в модуле:
Option Explicit Dim sVAT_Rate As Single Function Total_Cost() As Double ... End Function | Если переменная sVAT_Rate объявлена в самом начале модуля, то областью действия этой переменной будет весь модуль (т.е. переменная sVAT_Rate будет распознаваться всеми процедурами в этом модуле). Следовательно, если в функции Total_Cost переменной sVAT_Rate будет присвоено некоторое значение, то следующая функция, выполняемая в пределах этого же модуля, будет использовать переменную sVAT_Rate с этим же значением. Однако, если будет вызвана какая-то функция, расположенная в другом модуле, то для неё переменная sVAT_Rate будет не известна. |
Option Explicit Function Total_Cost() As Double Dim sVAT_Rate As Single . .. End Function | Если переменная sVAT_Rate объявлена в начале функции Total_Cost, то её область действия будет ограничена только этой функцией (т.е. в пределах функции Total_Cost, можно будет использовать переменную sVAT_Rate, а за её пределами – нет). При попытке использовать sVAT_Rate в другой процедуре, компилятор VBA сообщит об ошибке, так как эта переменная не была объявлена за пределами функции Total_Cost (при условии, что использован оператор Option Explicit). |
В показанном выше примере переменная объявлена на уровне модуля при помощи ключевого слова Dim. Однако, бывает необходимо, чтобы объявленными переменными можно было пользоваться в других модулях. В таких случаях для объявления переменной вместо ключевого слова Dim нужно использовать ключевое слово Public.
Кстати, для того, чтобы объявить переменную на уровне модуля, вместо ключевого слова Dim можно использовать ключевое слово Private, которое укажет на то, что данная переменная предназначена для использования только в текущем модуле.
Для объявления констант также можно использовать ключевые слова Public и Private, но не вместо ключевого слова Const, а вместе с ним.
В следующих примерах показано использование ключевых слов Public и Private в применении к переменным и к константам.
Option Explicit Public sVAT_Rate As Single Public Const iMax_Count = 5000 ... | В этом примере ключевое слово Public использовано для объявления переменной sVAT_Rate и константы iMax_Count. Областью действия объявленных таким образом элементов будет весь текущий проект. Это значит, что sVAT_Rate и iMax_Count будут доступны в любом модуле проекта. |
Option Explicit Private sVAT_Rate As Single Private Const iMax_Count = 5000 ... | В этом примере для объявления переменной sVAT_Rate и константы iMax_Count использовано ключевое слово Private. Областью действия этих элементов является текущий модуль. Это значит, что sVAT_Rate и iMax_Count будут доступны во всех процедурах текущего модуля, но не будут доступны для процедур, находящихся в других модулях. |
Оцените качество статьи. Нам важно ваше мнение:
Массивы в VBA: как работать с массивами
Мы очень хорошо знаем, что переменная является контейнером для хранения значения. Иногда разработчики могут удерживать более одного значения в одной переменной за раз. Когда ряд значений хранится в одной переменной, он известен как переменная массива.
Объявление массивов
Массивы объявляются так же, как объявлена переменная, за исключением того, что объявление переменной массива использует скобки. В следующем примере размер массива указан в скобках.
'Method 1 : Using Dim Dim arr1() 'Without Size 'Method 2 : Mentioning the Size Dim arr2(5) 'Declared with size of 5 'Method 3 : using 'Array' Parameter Dim arr3 arr3 = Array("apple","Orange","Grapes")
- Хотя размер массива указывается как 5, он может содержать 6 значений, поскольку индекс массива начинается с ZERO.
- Индекс массива не может быть отрицательным.
- Массивы VBScript могут хранить любой тип переменной в массиве. Следовательно, массив может хранить целое число, строку или символы в одной переменной массива.
Назначение значений массиву
Значения присваиваются массиву, указывая значение индекса массива для каждого из назначаемых значений. Это может быть строка.
ПримерДобавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim arr(5) arr(0) = "1" 'Number as String arr(1) = "VBScript" 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("Value stored in Array index 0 : " & arr(0)) msgbox("Value stored in Array index 1 : " & arr(1)) msgbox("Value stored in Array index 2 : " & arr(2)) msgbox("Value stored in Array index 3 : " & arr(3)) msgbox("Value stored in Array index 4 : " & arr(4)) msgbox("Value stored in Array index 5 : " & arr(5)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Value stored in Array index 0 : 1
Value stored in Array index 1 : VBScript
Value stored in Array index 2 : 100
Value stored in Array index 3 : 2.45
Value stored in Array index 4 : 7/10/2013
Value stored in Array index 5 : 12:45:00 PM
Многомерные массивы
Массивы не ограничиваются одним измерением, однако они могут иметь максимум 60 измерений. Двумерными массивами являются наиболее часто используемые.
примерВ следующем примере многомерный массив объявляется с тремя строками и четырьмя столбцами.
Private Sub Constant_demo_Click() Dim arr(2,3) as Variant ' Which has 3 rows and 4 columns arr(0,0) = "Apple" arr(0,1) = "Orange" arr(0,2) = "Grapes" arr(0,3) = "pineapple" arr(1,0) = "cucumber" arr(1,1) = "beans" arr(1,2) = "carrot" arr(1,3) = "tomato" arr(2,0) = "potato" arr(2,1) = "sandwitch" arr(2,2) = "coffee" arr(2,3) = "nuts" msgbox("Value in Array index 0,1 : " & arr(0,1)) msgbox("Value in Array index 2,2 : " & arr(2,2)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
Value stored in Array index : 0 , 1 : Orange
Value stored in Array index : 2 , 2 : coffee
Объявление ReDim
Оператор ReDim используется для объявления переменных динамического массива и распределения или перераспределения пространства для хранения.
СинтаксисReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Параметр Описание
- Preserve — необязательный параметр, используемый для сохранения данных в существующем массиве при изменении размера последнего измерения.
- Varname — обязательный параметр, который обозначает имя переменной, которое должно соответствовать стандартным соглашениям об именах.
- Subscript — требуемый параметр, который указывает размер массива.
В следующем примере массив был переопределен, а затем значения сохранялись при изменении существующего размера массива.
Примечание. При изменении размера массива, меньшего, чем это было первоначально, данные в устраненных элементах будут потеряны.
Private Sub Constant_demo_Click() Dim a() as variant i = 0 redim a(5) a(0) = "XYZ" a(1) = 41.25 a(2) = 22 REDIM PRESERVE a(7) For i = 3 to 7 a(i) = i Next 'to Fetch the output For i = 0 to ubound(a) Msgbox a(i) Next End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
XYZ
41.25
22
3
4
5
6
7
Методы массива
В VBScript есть встроенные функции, которые помогают разработчикам эффективно обрабатывать массивы. Все методы, которые используются вместе с массивами, перечислены ниже. Чтобы узнать об этом, нажмите на имя метода.
Функции для работы с массивами
LBound
Функция LBound возвращает наименьший индекс указанного массива.Следовательно, LBound массива — ZERO.
СинтаксисLBound(ArrayName[,dimension])
Параметы и Описание
- ArrayName — обязательный параметр. Этот параметр соответствует имени массива.
- Размер — необязательный параметр. Это принимает целочисленное значение, соответствующее размеру массива. Если это «1», то он возвращает нижнюю границу первого измерения;если это «2», то он возвращает нижнюю границу второго измерения и так далее.
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim arr(5) as Variant arr(0) = "1" 'Number as String arr(1) = "VBScript 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("The smallest Subscript value of the given array is : " & LBound(arr)) ' For MultiDimension Arrays : Dim arr2(3,2) as Variant msgbox("The smallest Subscript of the first dimension of arr2 is : " & LBound(arr2,1)) msgbox("The smallest Subscript of the Second dimension of arr2 is : " & LBound(arr2,2)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The smallest Subscript value of the given array is : 0
The smallest Subscript of the first dimension of arr2 is : 0
The smallest Subscript of the Second dimension of arr2 is : 0
Функция, которая возвращает целое число, соответствующее наименьшему индексу данных массивов.
UBound
Функция UBound возвращает наибольший индекс указанного массива.Следовательно, это значение соответствует размеру массива.
СинтаксисUBound(ArrayName[,dimension])
Параметры и Описание
- ArrayName — обязательный параметр. Этот параметр соответствует имени массива.
- Размер — необязательный параметр. Это принимает целочисленное значение, соответствующее размеру массива. Если это «1», то он возвращает нижнюю границу первого измерения;если он равен «2», то он возвращает нижнюю границу второго измерения и т. д.
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim arr(5) as Variant arr(0) = "1" 'Number as String arr(1) = "VBScript 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("The smallest Subscript value of the given array is : " & UBound(arr)) ' For MultiDimension Arrays : Dim arr2(3,2) as Variant msgbox("The smallest Subscript of the first dimension of arr2 is : " & UBound(arr2,1)) msgbox("The smallest Subscript of the Second dimension of arr2 is : " & UBound(arr2,2)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The Largest Subscript value of the given array is : 5
The Largest Subscript of the first dimension of arr2 is : 3
The Largest Subscript of the Second dimension of arr2 is : 2
Функция, которая возвращает целое число, соответствующее самому большому индексу данных массивов.
Split
Функция Split возвращает массив, который содержит определенное количество значений, разделенных на основе разделителя.
СинтаксисSplit(expression [,delimiter[, count[, compare]]])
Параметры и Описание
- Выражение — требуемый параметр. Строковое выражение, которое может содержать строки с разделителями.
- Разделитель — необязательный параметр. Параметр, который используется для преобразования в массивы на основе разделителя.
- Count — необязательный параметр. Количество подстрок, которые нужно вернуть, и если указано как -1, то возвращаются все подстроки.
- Compare — Необязательный параметр. Этот параметр указывает, какой метод сравнения следует использовать.
- 0 = vbBinaryCompare — выполняет двоичное сравнение
- 1 = vbTextCompare — выполняет текстовое сравнение
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() ' Splitting based on delimiter comma '$' Dim a as Variant Dim b as Variant a = Split("Red $ Blue $ Yellow","$") b = ubound(a) For i = 0 to b msgbox("The value of array in " & i & " is :" & a(i)) Next End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value of array in 0 is :Red
The value of array in 1 is : Blue
The value of array in 2 is : Yellow
Функция, которая возвращает массив, содержащий указанное количество значений. Разделить на разделитель.
Join
Это функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.
СинтаксисJoin(List[,delimiter])
Параметры и Описание
- Список — требуемый параметр. Массив, содержащий подстроки, которые должны быть соединены.
- Разделитель — необязательный параметр. Символ, который используется как разделитель при возврате строки. По умолчанию разделителем является
Space
.
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() ' Join using spaces a = array("Red","Blue","Yellow") b = join(a) msgbox("The value of b " & " is :" & b) ' Join using $ b = join(a,"$") msgbox("The Join result after using delimiter is : " & b) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value of b is :Red Blue Yellow
The Join result after using delimiter is : Red$Blue$Yellow
Функция, которая возвращает строку, содержащую указанное количество подстрок в массиве. Это полная противоположная функция метода разделения.
Filter
Функция фильтра, которая возвращает массив на основе нуля, который содержит подмножество массива строк на основе определенных критериев фильтра.
СинтаксисFilter(inputstrings, value[, include [,compare]])
Параметры и Описание
- Inputstrings — обязательный параметр. Этот параметр соответствует массиву строк для поиска.
- Значение — требуемый параметр. Этот параметр соответствует строке для поиска по параметру inputstrings.
- Include — необязательный параметр. Это логическое значение, которое указывает, следует ли возвращать подстроки, которые включают или исключают.
- Compare — Необязательный параметр. Этот параметр описывает, какой метод сравнения строк должен использоваться.
- 0 = vbBinaryCompare — выполняет двоичное сравнение
- 1 = vbTextCompare — выполняет текстовое сравнение
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim a,b,c,d as Variant a = array("Red","Blue","Yellow") b = Filter(a,"B") c = Filter(a,"e") d = Filter(a,"Y") For each x in b msgbox("The Filter result 1: " & x) Next For each y in c msgbox("The Filter result 2: " & y) Next For each z in d msgbox("The Filter result 3: " & z) Next End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.p
The Filter result 1: Blue
The Filter result 2: Red
The Filter result 2: Blue
The Filter result 2: Yellow
The Filter result 3: Yellow
Функция, которая возвращает массив с нулевым основанием, который содержит подмножество массива строк на основе определенных критериев фильтра.
IsArray
Функция IsArray возвращает логическое значение, указывающее, является ли указанная входная переменная переменной или переменной NOT переменной массива.
СинтаксисIsArray(variablename)
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim a,b as Variant a = array("Red","Blue","Yellow") b = "12345" msgbox("The IsArray result 1 : " & IsArray(a)) msgbox("The IsArray result 2 : " & IsArray(b)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The IsArray result 1 : True
The IsArray result 2 : False
Функция, возвращающая логическое значение, указывающее, является ли входная переменная массивом.
Erase
Функция Erase используется для сброса значений массивов фиксированного размера и освобождения памяти динамических массивов.Он ведет себя в зависимости от типа массивов.
СинтаксисErase ArrayName
- Фиксированный числовой массив, каждый элемент в массиве сбрасывается до нуля.
- Исправлен строковый массив, каждый элемент в массиве сбрасывается до нулевой длины «».
- Массив объектов, каждый элемент в массиве сбрасывается до специального значения
Nothing
.
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim NumArray(3) NumArray(0) = "VBScript" NumArray(1) = 1.05 NumArray(2) = 25 NumArray(3) = #23/04/2013# Dim DynamicArray() ReDim DynamicArray(9) ' Allocate storage space. Erase NumArray ' Each element is reinitialized. Erase DynamicArray ' Free memory used by array. ' All values would be erased. msgbox("The value at Zeroth index of NumArray is " & NumArray(0)) msgbox("The value at First index of NumArray is " & NumArray(1)) msgbox("The value at Second index of NumArray is " & NumArray(2)) msgbox("The value at Third index of NumArray is " & NumArray(3)) End Sub
Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.
The value at Zeroth index of NumArray is
The value at First index of NumArray is
The value at Second index of NumArray is
The value at Third index of NumArray is
Функция, которая восстанавливает выделенную память для переменных массива.
С уважением, авторы сайта Компьютерапия
Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!
Ключевое слово Nothing — Visual Basic
- 3 минуты на чтение
В этой статье
Представляет значение по умолчанию для любого типа данных. Для ссылочных типов значением по умолчанию является ссылка null
. Для типов значений значение по умолчанию зависит от того, допускает ли тип значения значение NULL.
Примечание
Для типов значений, не допускающих значения NULL, Ничто
в Visual Basic не отличается от null
в C #.В Visual Basic, если вы устанавливаете для переменной типа значения, не допускающего значения NULL, значение Nothing
, для переменной устанавливается значение по умолчанию для ее объявленного типа. В C # при присвоении переменной типа значения, не допускающего значения NULL, NULL
возникает ошибка времени компиляции.
Замечания
Ничего.
представляет значение по умолчанию для типа данных. Значение по умолчанию зависит от того, имеет ли переменная тип значения или ссылочный тип.
Переменная типа значения непосредственно содержит свое значение.Типы значений включают все числовые типы данных, Boolean
, Char
, Date
, все структуры и все перечисления. Переменная ссылочного типа хранит ссылку на экземпляр объекта в памяти. Ссылочные типы включают классы, массивы, делегаты и строки. Для получения дополнительной информации см. Типы значений и ссылочные типы.
Если переменная имеет тип значения, поведение Nothing
зависит от того, имеет ли переменная тип данных, допускающий значение NULL.Чтобы представить тип значения, допускающий значение NULL, добавьте ? Модификатор
к имени типа. Присвоение Nothing
переменной, допускающей значение NULL, устанавливает значение NULL
. Дополнительные сведения и примеры см. В разделе Типы значений, допускающих значение NULL.
Если переменная имеет тип значения, который не допускает значения NULL, присвоение ей Nothing
устанавливает для нее значение по умолчанию для ее объявленного типа. Если этот тип содержит элементы-переменные, для всех них установлены значения по умолчанию. Следующий пример иллюстрирует это для скалярных типов.
Модуль Модуль1
Sub Main ()
Dim ts как TestStruct
Dim i как целое число
Dim b As Boolean
'Следующий оператор устанавливает для ts.Name значение null, а для ts.Number - 0.
ts = ничего
'Следующие операторы устанавливают i в 0 и b в False.
я = ничего
b = ничего
Console.WriteLine ($ "ts.Name: {ts.Name}")
Console.WriteLine ($ "ts.Number: {ts.Number}")
Console.WriteLine ($ "i: {i}")
Console.WriteLine ($ "b: {b}")
Приставка.ReadKey ()
Конец подписки
Public Structure TestStruct
Публичное имя в виде строки
Открытый номер как целое число
Конечная структура
Конечный модуль
Если переменная относится к ссылочному типу, присвоение переменной Nothing
устанавливает для нее значение NULL
ссылки типа переменной. Переменная, для которой установлена ссылка null
, не связана ни с одним объектом. Следующий пример демонстрирует это:
Модуль Модуль1
Sub Main ()
Развернуть testObject как объект
'Следующий оператор устанавливает testObject так, чтобы он не ссылался на
'любой экземпляр.testObject = Ничего
Dim tc как новый TestClass
tc = ничего
'Поля tc недоступны. Следующее утверждение вызывает
'исключение NullReferenceException во время выполнения. (Сравните с присвоением
'Нечего структурировать ts в предыдущем примере.)
'Console.WriteLine (tc.Field1)
Конец подписки
Класс TestClass
Открытое поле1 как целое число
'. . .
Конец класса
Конечный модуль
При проверке того, является ли ссылочная переменная (или тип значения, допускающий значение NULL) NULL
, не используйте = Nothing
или <> Nothing
.Всегда используйте Is Nothing
или IsNot Nothing
.
Для строк в Visual Basic пустая строка равна Nothing
. Следовательно, "" = Ничто
не соответствует действительности.
В следующем примере показаны сравнения, в которых используются операторы Is
и IsNot
:
Модуль Модуль1
Sub Main ()
Развернуть testObject как объект
testObject = Ничего
Console.WriteLine (testObject - это ничего)
'Выход: True
Dim tc как новый TestClass
tc = ничего
Приставка.WriteLine (tc IsNot Nothing)
'Выход: ложь
'Объявить тип значения, допускающий значение NULL.
Тусклый? Как целое число
Console.WriteLine (n - ничего)
'Выход: True
п = 4
Console.WriteLine (n - ничего)
'Выход: ложь
n = ничего
Console.WriteLine (n IsNot Nothing)
'Выход: ложь
Console.ReadKey ()
Конец подписки
Класс TestClass
Открытое поле1 как целое число
Частное поле2 как логическое
Конец класса
Конечный модуль
Если вы объявляете переменную без использования предложения As
и устанавливаете для нее значение Nothing
, переменная имеет тип Object
.Примером этого является Dim something = Nothing
. Ошибка времени компиляции возникает в этом случае, когда Option Strict
включен, а Option Infer
выключен.
Когда вы назначаете Nothing
объектной переменной, она больше не ссылается ни на один экземпляр объекта. Если переменная ранее ссылалась на экземпляр, установка для нее значения Nothing
не завершает сам экземпляр. Экземпляр завершается, а связанные с ним память и системные ресурсы освобождаются только после того, как сборщик мусора (GC) обнаруживает, что не осталось активных ссылок.
Ничем
не отличается от объекта DBNull, который представляет неинициализированный вариант или несуществующий столбец базы данных.
См. Также
Заявление IFVBA — Полное руководство
Этот пост представляет собой полное руководство по выражению If в VBA. Если вы ищете синтаксис, ознакомьтесь с кратким руководством в первом разделе, которое включает несколько примеров.
В содержании ниже представлен обзор того, что включено в сообщение.Вы можете использовать это, чтобы перейти к нужному разделу, или вы можете прочитать сообщение от начала до конца.
«Угадай, если сможешь, и выбери, если посмеешь». — Пьер Корнель
Краткое руководство по VBA If Заявление
Описание | Формат | Пример |
---|---|---|
Если То | Если [условие истинно] То [сделать что-нибудь] Конец Если | Если счет = 100 То Отладка.Печать «Perfect» End If |
If Else | If [condition is true] Then [do something] Else [do something] End If | If score = 100 Then Debug.Print «Perfect» Else Debug. Напечатайте «Попробуйте снова» End If |
Если ElseIf | Если [условие 1 истинно] То [сделать что-нибудь] ElseIf [условие 2 истинно] То [сделать что-нибудь] Конец Если | Если счет = 100 То Отладка.Print «Perfect» ElseIf score> 50 Then Debug.Print «Passed» ElseIf score Then Debug.Print «Try again» End If |
Else и ElseIf (Else должно быть после ElseIf) | Если [условие 1 выполняется] Then [do something] ElseIf [условие 2 true] Then [do something] Else [сделать что-нибудь] End If | If score = 100 Then Debug.Print «Perfect» ElseIf score> 50 Then Debug.Print «Passed» ElseIf score> 30 Then Debug.Print «Try again» Else Debug.Print «Yikes» End If |
Если без Endif (только одна строка) | Если [условие истинно] Then [сделать что-нибудь] | Если значение Then value = 0 |
Следующий код показывает простой пример использования оператора If
Если Sheet1.Диапазон ("A1"). Значение> 5 Тогда Debug.Print «Значение больше пяти». ElseIf Sheet1.Range ("A1"). Значение Тогда Debug.Print «значение меньше пяти». Еще Debug.Print «значение равно пяти». Конец, если
Вебинар
Члены архивов веб-семинаров могут получить доступ к веб-семинару по этой статье, щелкнув изображение ниже.
( Примечание: Участники веб-сайта имеют доступ к полному архиву вебинаров.)
Что такое оператор VBA If
Оператор VBA If используется, чтобы позволить вашему коду делать выбор во время его выполнения.
Вам часто нужно делать выбор на основе данных, которые читает ваш макрос.
Например, вы можете захотеть читать только тех студентов, у которых есть отметки выше 70. Читая каждого студента, вы должны использовать оператор If, чтобы проверять оценки каждого студента.
Важное слово в последнем предложении — check .Оператор If используется для проверки значения, а затем для выполнения задачи на основе результатов этой проверки.
Тестовые данные и исходный код
Мы собираемся использовать следующие тестовые данные для примеров кода в этом посте:
Вы можете загрузить тестовые данные со всем исходным кодом для публикации, а также решение упражнения в конце:
Формат оператора If-Then VBA
Формат оператора If Then следующий
Если [условие верно] Тогда
После ключевого слова If следует Condition и ключевое слово Then
Каждый раз, когда вы используете оператор If Then , вы должны использовать соответствующий оператор End If .
Когда условие оценивается как истинное, обрабатываются все строки между If Then и End If .
Если [условие верно] Тогда [строки кода] [строки кода] [строки кода] Конец, если
Чтобы сделать код более читабельным, рекомендуется делать отступы между операторами If Then и End If .
Отступ между If и End If
Отступ означает просто переместить строку кода на одну табуляцию вправо.Практическое правило — делать отступ между операторами начала и конца, такими как
. Sub… End Sub
If Then… End If
If Then… ElseIf… Else… Endif
For… Next
Do While… Loop
Select Case… End Case
Чтобы сделать отступ в коде, вы можете выделить строки для отступа и нажать клавишу TAB. Нажатие Shift + Tab вытеснит код, т.е. переместит его на одну вкладку влево.
Вы также можете использовать значки на панели инструментов Visual Basic для отступа / отступа кода
Выберите код и щелкните значки для увеличения / уменьшения отступа
Если вы посмотрите на примеры кода на этом веб-сайте, вы увидите, что код имеет отступ.
Простой пример «если, то»
Следующий код распечатывает имена всех учащихся с отметками выше 50 по французскому языку.
https://excelmacromastery.com/ Дополнительные метки чтения () Тусклый я как долго 'Пройдите по столбцам меток Для i = от 2 до 11 'Проверьте, нет ли отметок больше 50 Если Sheet1.Range ("C" & i) .Value> 50, то 'Распечатать имя учащегося в непосредственном окне (Ctrl + G) Отлаживать.Печать Sheet1.Range ("A" & i) .Value & "" & Sheet1.Range ("B" & i) .Value Конец, если следующий Конец подписки
Результаты
Брайан Снайдер
Хуанита Муди
Дуглас Блэр
Лия Франк
Моника Бэнкс
Поэкспериментируйте с этим примером, проверьте значение или знак > и посмотрите, как меняются результаты.
Использование условий с оператором If VBA
Фрагмент кода между ключевыми словами If и Then называется условием.Условие — это утверждение, которое оценивается как истинное или ложное. В основном они используются с операторами Loops и If. При создании условия вы используете такие знаки, как>, <, <>,> =, <=, =.
Ниже приведены примеры условий
Условие | Это верно, когда |
---|---|
x | x меньше 5 |
x | x меньше или равно 5 |
x> 5 | x больше 5 |
x> = 5 | x больше или равно 5 |
x = 5 | x равно 5 |
x 5 | x не равно 5 |
x> 5 И x | x больше 5 И x меньше 10 |
x = 2 Или x> 10 | x равно 2 ИЛИ x больше 10 |
Range («A1») = «John» | Ячейка A1 содержит текст «John» |
Диапазон («A1») «John» | Ячейка A1 не содержит текста «John» |
Вы могли заметить, что x = 5 как условие.Не следует путать с x = 5 при использовании в качестве присваивания.
Когда в условии используется равенство, это означает, что «левая сторона равна правой».
В следующей таблице показано, как знак равенства используется в условиях и присвоениях
Использование Equals | Тип инструкции | Значение |
---|---|---|
Цикл до x = 5 | Условие | x равен 5 |
Do While x = 5 | Условие | Is x равно 5 |
Если x = 5, то | Условие | Если x равно 5 |
Для x = 1 До 5 | Присвоение | Установите значение x на 1, затем на 2 и т. Д. |
x = 5 | Присвоение | Установите значение x равным 5 |
b = 6 = 5 | Присвоение и условие | Присвойте b результату условия 6 = 5 |
x = MyFunc (5,6) | Присвоение | Присвойте x значению, возвращаемому функцией |
Последняя запись в приведенной выше таблице показывает оператор с двумя равными. Первый знак равенства — это присвоение, а следующие за ним знаки равенства — условия.
Сначала это может показаться запутанным, но подумайте об этом так. Любой оператор, который начинается с переменной и равенства, имеет следующий формат:
[переменная] [=] [оценить эту часть]
Таким образом, все, что стоит справа от знака равенства, оценивается, и результат помещается в переменную. Снова взяв последние три задания, вы можете посмотреть на них так:
[x] [=] [5]
[b] [=] [6 = 5]
[x] [=] [MyFunc (5,6)]
Использование ElseIf с оператором If VBA
Оператор ElseIf позволяет вам выбирать из более чем одного варианта.В следующем примере мы печатаем знаки, которые находятся в диапазоне Отличия или Высокого Различия.
https://excelmacromastery.com/ Sub UseElseIf () Если Marks> = 85, то Debug.Print "High Destinction" ElseIf Marks> = 75 Тогда Debug.Print "Destinction" Конец, если Конец подписки
Важно понимать, что порядок важен. Сначала проверяется условие If.
Если это правда, то печатается «High Distinction» и оператор If завершается.
Если это ложь, то код переходит к следующему ElseIf и проверяет его условие.
Давайте поменяем местами If и ElseIf из последнего примера. Теперь код выглядит так:
https://excelmacromastery.com/ Sub UseElseIfWrong () 'Этот код неверен, так как ElseIf никогда не будет верным Если Marks> = 75, то Debug.Print "Destinction" ElseIf Marks> = 85 Тогда 'код здесь никогда не дойдет Отлаживать.Печать "High Destinction" Конец, если Конец подписки
В этом случае мы сначала проверяем, не превышает ли значение 75. Мы никогда не будем печатать «High Distinction», потому что, если значение больше 85, будет срабатывать первый оператор if.
Чтобы избежать подобных проблем, мы должны использовать два условия. Они помогают точно указать, что вы ищете, и устранить путаницу. В приведенном ниже примере показано, как их использовать. В следующем разделе мы рассмотрим еще несколько условий.
Если отметки> = 75 И отметки Тогда Debug.Print "Destinction" ИначеЕсли отметки> = 85 И отметки Тогда Debug.Print "High Destinction" Конец, если
Давайте расширим исходный код. Вы можете использовать столько операторов ElseIf, сколько захотите. Мы добавим еще несколько, чтобы учесть все наши классификации оценок.
Если вы хотите опробовать эти примеры, вы можете скачать код сверху этого сообщения.
Использование Else с оператором if в VBA
Оператор VBA Else используется для уловки всех.Это в основном означает «если бы ни одно условие не было истинным» или «все остальное». В предыдущем примере кода мы не включали оператор печати для отметки о сбое. Мы можем добавить это с помощью Else.
https://excelmacromastery.com/ Sub UseElse () Если Marks> = 85, то Debug.Print "High Destinction" ElseIf Marks> = 75 Тогда Debug.Print "Destinction" ElseIf Marks> = 55 Тогда Debug.Print "Кредит" ElseIf Marks> = 40 Тогда Отлаживать.Распечатать "Пропуск" Еще 'Для всех остальных марок Debug.Print "Fail" Конец, если Конец подписки
Итак, если это не один из других типов, то это сбой.
Давайте напишем код, чтобы просмотреть наши образцы данных и распечатать учащегося и его классификацию:
https://excelmacromastery.com/ Подложка AddClass () 'получить последнюю строку Dim startRow As Long, lastRow As Long startRow = 2 lastRow = Лист1.Ячейки (Sheet1.Rows.Count, 1) .End (xlUp) .Row Dim i As Long, Marks as Long Dim sClass как строка 'Пройдите по столбцам меток Для i = startRow To lastRow Marks = Sheet1.Range ("C" & i) .Value 'Отметьте и классифицируйте соответственно Если Marks> = 85, то sClass = "Высокая цель" ElseIf Marks> = 75 Тогда sClass = "Destinction" ElseIf Marks> = 55 Тогда sClass = "Кредит" ElseIf Marks> = 40 Тогда sClass = "Пройдено" Еще 'Для всех остальных марок sClass = "Ошибка" Конец, если 'Запишите класс в столбец E Лист1.Диапазон ("E" & i) .Value = sClass следующий Конец подписки
Результаты выглядят так со столбцом E, содержащим классификацию знаков
Результаты
Помните, что вы можете попробовать эти примеры на себе, загрузив код сверху этого сообщения.
Использование логических операторов с оператором if в VBA
В операторе If может быть более одного условия.Ключевые слова VBA , и или позволяют использовать несколько условий.
Эти слова работают так же, как вы бы использовали их в английском языке.
Давайте еще раз посмотрим на наши образцы данных. Теперь мы хотим напечатать всех студентов, которые набрали от 50 до 80 баллов.
Мы используем и , чтобы добавить дополнительное условие. Код говорит: если оценка больше или равна 50 и меньше 75, выведите имя ученика.
https: // excelmacromastery.com / Sub CheckMarkRange () Dim i As Long, отмечает как долго Для i = от 2 до 11 'Сохранить оценки для текущего студента mark = Sheet1.Range ("C" & i) .Value 'Проверьте, есть ли отметки больше 50 и меньше 75 Если отметок> = 50 И отметок Тогда 'Печатать имя и фамилию в окне "Немедленное" (Ctrl G) Debug.Print Sheet1.Range ("A" & i) .Value & Sheet1.Range ("B" & i).Значение Конец, если следующий Конец подписки
Результаты
Дуглас Блэр
Лия Фрэнк
Моника Бэнкс
В следующем примере нам нужны студенты, изучающие историю или французский язык. Итак, в этом случае мы говорим, изучал ли студент историю ИЛИ если студент изучал французский язык:
'Описание: Использует ИЛИ, чтобы проверить, изучено ли исследование истории или французского языка. Рабочий лист: отметки 'Вывод: результат выводится в окно немедленного доступа (Ctrl + G) https: // excelmacromastery.com / vba-если Дополнительный пользователь () 'Получить диапазон данных Dim rg As Range Установите rg = shMarks.Range ("A1"). CurrentRegion. Dim i As Long, Subject As String 'Прочтите данные Для i = 2 To rg.Rows.Count 'Получить тему subject = rg.Cells (i, 4) .Value 'Проверьте, если у объекта больше 50 и меньше 80 Если subject = "History" или subject = "French" Тогда 'Напечатать имя и тему для немедленного окна (Ctrl G) Отлаживать.Выведите rg.Cells (i, 1) .Value & "" & rg.Cells (i, 4) .Value Конец, если следующий Конец подписки
Результаты
История Брайана
Брэдфорд Френч
История Дугласа
Кен Френч
Лия Френч
История Розали
История Джеки
Использование нескольких подобных условий часто является источником ошибок. Помните, что нужно делать их как можно более простыми.
Использование If и
AND работает следующим образом
Состояние 1 | Условие 2 | Результат |
ИСТИНА | ИСТИНА | ИСТИНА |
ИСТИНА | ЛОЖЬ | НЕВЕРНО |
ЛОЖНО | ИСТИНА | НЕВЕРНО |
ЛОЖНО | ЛОЖЬ | НЕВЕРНО |
Что вы заметите, так это то, что И верно только тогда, когда все условия верны
Использование If Or
Ключевое слово OR работает следующим образом
Состояние 1 | Условие 2 | Результат |
ИСТИНА | ИСТИНА | ИСТИНА |
ИСТИНА | ЛОЖЬ | ИСТИНА |
ЛОЖНО | ИСТИНА | ИСТИНА |
ЛОЖНО | ЛОЖЬ | НЕВЕРНО |
Вы заметите, что ИЛИ является ложным только тогда, когда все условия ложны.
Использование И и ИЛИ вместе может затруднить чтение кода и привести к ошибкам. Использование скобок может прояснить условия.
https://excelmacromastery.com/ Sub OrWithAnd () Тусклый объект как строка, помечается как длинный subject = "История" оценок = 5 Если (subject = "French" Or subject = "History") И отметки> = 6 Тогда Debug.Print "True" Еще Debug.Print "False" Конец, если Конец подписки
Использование, если не
Также есть оператор НЕ.Это возвращает результат, противоположный условию.
Состояние | Результат |
ИСТИНА | НЕВЕРНО |
ЛОЖНО | ИСТИНА |
Следующие две строки кода эквивалентны.
Если отметки То Если Not отмечает> = 40 Тогда
как есть
Если верно, то Если не ложь, то
и
Если ложь, то Если не верно, то
Заключение условия в круглые скобки упрощает чтение кода
Если нет (баллы> = 40), то
Обычное использование Not при проверке, установлен ли объект.Возьмем, к примеру, рабочий лист. Здесь мы объявляем рабочий лист
Dim mySheet как рабочий лист 'Здесь код
Мы хотим проверить, что mySheet действителен, прежде чем использовать его. Мы можем проверить, ничего ли это.
Если mySheet - ничего, тогда
Невозможно проверить, есть ли это что-то, так как есть много разных способов, которыми это может быть. Поэтому мы используем Not с Nothing
Если не mySheet - это ничто, тогда
Если вы находите это немного запутанным, вы можете использовать круглые скобки, такие как
Если нет (mySheet - это ничего), то
Функция IIF
Обратите внимание, что вы можете скачать нижеприведенные примеры IIF, а весь исходный код — сверху этого сообщения.
VBA имеет функцию, аналогичную функции Excel If. В Excel вы часто будете использовать функцию If следующим образом:
= ЕСЛИ (F2 = ””, ””, F1 / F2)
Формат
= Если (условие, действие, если истина, действие, если ложь).
VBA имеет оператор IIf, который работает таким же образом. Давайте посмотрим на пример. В следующем коде мы используем IIf для проверки значения переменной val. Если значение больше 10, мы печатаем true, иначе мы печатаем false:
'Описание: Использование функции IIF для проверки числа.Рабочий лист: отметки 'Вывод: результат выводится в окно немедленного доступа (Ctrl + G) https://excelmacromastery.com/vba-if Sub CheckNumberIIF () Dim result As Boolean Тусклое число по длине 'Печать True число = 11 результат = IIf (число> 10, Истина, Ложь) Debug.Print "Число" & число & "больше 10 равно" & результат 'Печатает ложь число = 5 результат = IIf (число> 10, Истина, Ложь) Отлаживать.Выведите "Число" & число & "больше 10 равно" & результат Конец подписки
В нашем следующем примере мы хотим распечатать Успешно или Неуспешно для каждого ученика в зависимости от их оценок. В первом фрагменте кода мы будем использовать для этого обычный оператор VBA If:
https://excelmacromastery.com/ Sub CheckMarkRange () Dim i As Long, отмечает как долго Для i = от 2 до 11 'Сохранить оценки для текущего студента метки = Лист1.Диапазон ("C" и i). Значение 'Проверить, сдал ли ученик или нет Если отметки> = 40 Тогда 'Запишите имена в столбец F Sheet1.Range ("E" & i) = "Пройдено" Еще Sheet1.Range ("E" & i) = "Fail"
(DAO)
Dim rst As DAO.Recordset Установите rst = CurrentDb.OpenRecordset ("tblExample", dbOpenSnapshot) С первой До тех пор, пока.EOF = True .MoveNext Петля Конец с При ошибке Возобновить Далее сначала закрыть Установить rst = ничего
:
Частная подпрограмма AllRecordsInRecordset () Dim rst As DAO.Recordset При ошибке Перейти к AllRecordsInRecordsetErr Установите rst = CurrentDb.OpenRecordset ("tblExample", dbOpenSnapshot) С первой До тех пор, пока.EOF = True .MoveNext Петля Конец с AllRecordsInRecordsetEnd: При ошибке Возобновить Далее сначала закрыть Установить rst = ничего Выход из подводной лодки AllRecordsInRecordsetErr: MsgBox "[...]:" & vbCrLf & _ Err.Description & vbCrLf & "Err #" & Err.Number, vbCritical Возобновить AllRecordsInRecordsetEnd Конец подписки
:
Частный подфайлSizesToTable () Dim rst As DAO.Набор записей Dim lFileLen As Long Dim s $ При ошибке Перейти к FileSizesToTable_Err s = "ВЫБРАТЬ * ИЗ dtItemsFiles WHERE (itfSizeBytes = 0)" Установите rst = CurrentDb.OpenRecordset (s, dbOpenDynaset) С первой До тех пор, пока .EOF = True s =! itfName s = CurrentProject.Path & conFileStorige & s Если Dir (s) <> "" Тогда .редактировать lFileLen = FileLen (s) ! itfSizeBytes = lFileLen .Обновить Конец, если .MoveNext Петля Конец с FileSizesToTable_End: При ошибке Возобновить Далее сначала закрыть Установить rst = ничего Выход из подводной лодки FileSizesToTable_Err: MsgBox "[FileSizesToTable]:" & vbCrLf & _ Err.Description & vbCrLf & "Err #" & Err.Число, vbCritical, "!" Резюме FileSizesToTable_End Конец подписки
Excel VBA Userform — Простые макросы Excel
Добавить элементы управления | Показать пользовательскую форму | Назначьте макросы | Протестируйте пользовательскую форму
В этой главе рассказывается, как создать пользовательскую форму Excel VBA . Пользовательская форма, которую мы собираемся создать, выглядит следующим образом:
Добавить элементы управления
Чтобы добавить элементы управления в пользовательскую форму, выполните следующие действия.
1. Откройте редактор Visual Basic. Если обозреватель проекта не отображается, щелкните «Просмотр», «Обозреватель проекта».
2. Щелкните «Вставить», «Пользовательская форма». Если Панель инструментов не появляется автоматически, щелкните Просмотр, Панель инструментов. Ваш экран должен быть настроен, как показано ниже.
3. Добавьте элементы управления, перечисленные в таблице ниже. Как только это будет выполнено, результат должен соответствовать изображению пользовательской формы, показанному ранее. Например, создайте элемент управления текстовым полем, щелкнув TextBox на панели инструментов.Затем вы можете перетащить текстовое поле в пользовательскую форму. Когда вы подойдете к рамке автомобиля, не забудьте сначала нарисовать эту рамку, прежде чем помещать в нее две кнопки выбора.
4. Измените названия и заголовки элементов управления в соответствии с таблицей ниже. Имена используются в коде Excel VBA. Подписи — это те, которые появляются на вашем экране. Рекомендуется изменить имена элементов управления. Это упростит чтение вашего кода. Чтобы изменить имена и заголовки элементов управления, щелкните «Вид», «Окно свойств» и щелкните каждый элемент управления.
Контроль | Имя | Подпись |
---|---|---|
Форма пользователя | DinnerPlannerUserForm | Планировщик ужина |
Текстовое поле | NameTextBox | |
Текстовое поле | PhoneTextBox | |
Список | CityListBox | |
Поле со списком | DinnerComboBox | |
Флажок | DateCheckBox1 | 13 июня |
Флажок | DateCheckBox2 | 20 июня |
Флажок | DateCheckBox3 | 27 июня |
Рама | Каркас автомобиля | Автомобиль |
Кнопка выбора | CarOptionButton1 | Есть |
Кнопка выбора | CarOptionButton2 | № |
Текстовое поле | MoneyTextBox | |
Кнопка вращения | MoneySpinButton | |
Командная кнопка | OK Кнопка | ОК |
Командная кнопка | ClearButton | прозрачный |
Командная кнопка | Кнопка отмены | Отмена |
7 этикеток | Менять не нужно | Имя :, Номер телефона: и т. Д. |
Примечание: поле со списком — это раскрывающийся список, из которого пользователь может выбрать элемент или заполнить его / ее собственный выбор. Можно выбрать только одну из кнопок выбора.
Показать форму пользователя
Чтобы отобразить пользовательскую форму, поместите кнопку на листе и добавьте следующую строку кода:
Private Sub CommandButton1_Click ()DinnerPlannerUserForm.Show
End Sub
Теперь мы собираемся создать Sub UserForm_Initialize.Когда вы используете метод Show для пользовательской формы, эта подпрограмма будет выполнена автоматически.
1. Откройте редактор Visual Basic.
2. В проводнике проекта щелкните правой кнопкой мыши DinnerPlannerUserForm и выберите команду Просмотреть код.
3. В раскрывающемся списке слева выберите Userform. В правом раскрывающемся списке выберите «Инициализировать».
4. Добавьте следующие строки кода:
Частная подписка UserForm_Initialize ()
NameTextBox.Value = «»
PhoneTextBox.Значение = «»
CityListBox.Clear
С CityListBox
.AddItem «Сан-Франциско»
.AddItem «Окленд»
.AddItem «Richmond»
Конец с номером
DinnerComboBox.Clear
С DinnerComboBox
.AddItem «Итальянский»
.
.AddItem «Китайский»
.
.AddItem «Фритты и мясо»
Заканчивается на
DateCheckBox1.Value = False
DateCheckBox2.Значение = Ложь
DateCheckBox3.Value = False
CarOptionButton2.Value = True
MoneyTextBox.Value = «»
NameTextBox.SetFocus
End Sub
Объяснение: текстовые поля пусты, списки и поля со списком заполнены, флажки сняты и т. Д.
Назначьте макросы
Мы создали первую часть пользовательской формы. Хотя это уже выглядит аккуратно, пока мы нажимаем кнопки команд в пользовательской форме, ничего не произойдет.
1. Откройте редактор Visual Basic.
2. В проводнике проекта дважды щелкните DinnerPlannerUserForm.
3. Дважды щелкните кнопку вращения денег.
4. Добавьте следующую строку кода:
Приватная подписка MoneySpinButton_Change ()MoneyTextBox.Text = MoneySpinButton.Value
Конец подпрограммы
Объяснение: эта строка кода обновляет текстовое поле, когда вы используете кнопку прокрутки.
5. Дважды щелкните кнопку ОК.
6.Добавьте следующие строки кода:
Private Sub OKButton_Click ()Dim emptyRow As Long
Лист1.Активировать
emptyRow = WorksheetFunction.CountA (Диапазон («A: A»)) + 1
Ячейки (emptyRow, 1) .Value = NameTextBox.Value
Ячейки (emptyRow, 2) .Value = PhoneTextBox.Value
Ячейки (emptyRow, 3) .Value = CityListBox.Value
Ячейки (emptyRow, 4) .Value = DinnerComboBox.Value
Если DateCheckBox1.Value = True Then Cells (emptyRow, 5) .Value = DateCheckBox1.Caption
Если DateCheckBox2.Value = True Then Cells (emptyRow, 5) .Value = Cells (emptyRow, 5) .Value & «» & DateCheckBox2.Caption
Если DateCheckBox3.Value = True, то ячейки (emptyRow, 5) .Value = Cells (emptyRow, 5) .Value & «» & DateCheckBox3.Caption
Если CarOptionButton1.Value = True, то
Ячейки (emptyRow, 6) .Value = «Да»
Остальное
Cells (emptyRow, 6) .Value = «No»
End If
Cells (emptyRow, 7).Value = MoneyTextBox.Value
End Sub
Пояснение: сначала активируем Sheet1. Далее мы определяем emptyRow. Переменная emptyRow является первой пустой строкой и увеличивается каждый раз при добавлении записи. Наконец, мы переносим информацию из пользовательской формы в определенные столбцы emptyRow.
7. Дважды щелкните кнопку Очистить.
8. Добавьте следующую строку кода:
Частная подпрограмма ClearButton_Click ()Вызов UserForm_Initialize
End Sub
Объяснение: эта строка кода вызывает Sub UserForm_Initialize, когда вы нажимаете кнопку Clear.
9. Дважды щелкните кнопку «Отмена».
10. Добавьте следующую строку кода:
Частная подписка CancelButton_Click ()Выгрузить меня
Конечная подписка
Объяснение: эта строка кода закрывает пользовательскую форму, когда вы нажимаете кнопку «Отмена».
Тестирование пользовательской формы
Выйдите из редактора Visual Basic, введите указанные ниже метки в строку 1 и протестируйте пользовательскую форму.
Результат:
Написание и использование функций в Excel Visual Basic
Большинство программ, которые вы пишете, будут начинаться со слова Sub , но не все:
Когда вы выберете Вставка -> Порядок действий… из меню редактора кода VBA, вы можете вставить Sub или Function (слово Свойство обсуждается в более позднем блоге о классах).
Есть две причины, по которым вы можете создать функцию:
- Для облегчения написания, чтения и сопровождения кода; или
- В дополнение к списку встроенных функций Excel.
В этом блоге будет показано, как выполнять каждый из них по очереди, но сначала давайте посмотрим на синтаксис функции.
Как писать функции в VBA
Разница между подпрограммой и функцией в VBA заключается в том, что функция возвращает значение. Рассмотрим следующую очень простую функцию возведения в квадрат номер:
Функция Square (любое число как целое) в виде длинного
Квадрат = AnyNumber * AnyNumber
Конечная функция
Есть 3 различия между этой подпрограммой и обычной подпрограммой:
Пронумерованные различия поясняются ниже.
Отличия:
- Функция начинается с Функция и заканчивается с конечной функцией (вместо Sub и End Sub ).
- Функция имеет тип данных (это тип Long , поскольку мы не знаем, какое большое целое число нам придется вернуть).
- Внутри функции вы должны указать имя функции равно чему-то (здесь квадрат числа, содержащегося в Аргумент).
VB, C # и многие другие программисты должны отметить, что — раздражающе — есть нет RETURN инструкция для возврата значения функции в VBA.
Вы можете вызывать функции из Excel (более подробно показано в заключительной части этот блог), из другой подпрограммы или из окна немедленных действий. Примеры каждого последующего!
Вызов функций из другой подпрограммы
Один из способов вызова функции — из другой программы или процедуры:
Мы хотим вернуть это… | … когда вы набираете номер. |
Программа выше (без всяких проверка ошибок) может выглядеть так:
Sub ShowSquare ()
Размерность n как целое число
n = CInt (InputBox («Введите число»))
MsgBox «Квадрат» & n & «равен» & _
Квадрат (n)
Концевой переводник
Как видите, вы можете использовать Square так же, как если бы это был встроенный функция в VBA.
Отображение значения функции в непосредственном окне
Вы можете сделать это обычным способом:
Здесь мы назвали нашу Квадрат функция 3 раза, каждый раз с разными аргументами.
Опять же, вы можете рассматривать свою функцию, как если бы она была одной из встроенных в VBA.
Вызов функции из Excel
Еще один способ вызвать функцию — и, возможно, самый интересный — это ввести ее в Excel:
Появится ваша функция Square … | … и даст вам ответ! |
Формула для ячейки, показанной выше, может выглядеть так:
Функция принимает единственный аргумент, который должен быть целым числом. Вот значение ячейки С2 .
Одно небольшое раздражение заключается в том, что когда вы вводите начало функции — в случай выше, = Квадрат ( — Excel не предлагает возможные аргументы для этого.