Vba excel увеличить переменную на 1
Арифметические операции в VBA: сложение, вычитание, умножение, деление и возведение в степень
Подробно рассмотрим то, как VBA выполняет такие арифметические операции, как сложение, вычитание, умножение, деление и возведение в степень, а также особые операции, такие как целочисленное деление и деление по модулю. Ниже, в таблице, представлены знаки операций, используемые при написании арифметических VBA-выражений.
Выражение - это значение либо группа значений, выражающая отдельное значение. Результат выражения - одно значение определенного типа данных. Знаки (обозначения) операций используются для действий над определенными значениями в выражениях. Для присваивания результата выражения переменной используется оператор присваивания (=), который сохраняет любое значение, представленное выражением справа от оператора присваивания в ячейке памяти, на которую ссылается переменная слева от этого оператора.
Во всех операциях приведенных ниже, оба операнда должны быть численными выражениями или строками, которые VBA может преобразовать в число.
Знак (+) используется для выполнения операции сложения. Слагаемые должны быть численными выражениями, строками, которые VBA может преобразовать в числа либо датами, с которыми также возможны арифметические действия.
1 . Sub Slozhenie()
2. 'Пример арифметического выражения со знаком "+"
3. Dim A1, A2, A3 As Integer 'объявление переменных
4. A1=1 'присваивание значения 1 переменной А1
5. A2=2 'присваивание значения 2 переменной А2
6. A3=A1+A2 'присваивание результата сложения переменной А3
7. MsgBox A3 'вывод А3 в диалоговом окне
Тип данных результата выражения сложения обычно тот же, что и наиболее точный тип в этом выражении за некоторыми исключениями. Все исключения из этого правила наглядно представлены в примерах.
Знак (-) используется для выполнения операции вычитания, а также для обозначения отрицательных чисел (когда ставится перед переменной или выражением и означает тоже самое, что и умножение на -1). Знак минуса, который помещают перед числом для обозначения того, что число отрицательное, называют унарным минусом.
Для определения типа данных результата выражения вычитания VBA следует тем же правилам, что и для выражений, использующих знак операции сложения, но имеются два дополнительные правила.
Правило 1. Если в выражении вычитания один из операндов является типом Date, то и результат выражения будет иметь тип Date.
Правило 2. Если в выражении вычитания оба операнда являются типом Date, то результат выражения будет иметь тип Double.
1 . Sub Vychitanie()
2. 'Пример арифметического выражения со знаком "-"
3. Dim D1, D2 As Date 'объявление переменных
4. D1=Now 'присваивание значения текущей даты переменной D1
5. D2=Now-5 'присваивание значения даты переменной D2
6. MsgBox TypeName(D2), vbOKOnly, "Now-5"
7. MsgBox TypeName(D1-D2), vbOKOnly, "D1-D2"
Знак (*) используется для выполнения операции умножения, результатом этой операции является произведение операндов. Для определения типа данных результата выражения умножения VBA использует те же правила, что и для выражений, использующих сложение. В выражениях умножения все переменные Variant, содержащие значения типа Date, преобразуются в численные значения.
1 . 'Пример арифметических выражений со знаком "*"
2. 4*10 'умножение 4 на 10
3. MyVar*2 'умножение MyVar на 2
4. MyVar*OtherVar 'умножение MyVar на OtherVar
Знак (/) используется для выполнения операции деления, этот знак называют знаком деления действительных чисел. В выражениях деления один операнд делится на другой, а результатом деления является частное.
1 . 'Пример арифметических выражений со знаком "/"
2. 10/4 'деление 10 на 4
3. MyVar/2 'деление MyVar на 2
4. MyVar/OtherVar 'деление MyVar на OtherVar
Если любой операнд в выражении деления имеет значение Null, то результатом выражения также будет Null. Тип данных в выражениях деления действительных чисел обычно Double, но есть и исключение.
Если в выражении деления оба операнда имеют тип Integer или Single, то результат выражения деления имеет тип Single. Если результат переполняет диапазон для типа Single, то VBA преобразует его в тип Double.
Знак (\) используется для выполнения операции целочисленного деления, при котором результатом деления всегда является целое число без дробной части. VBA не округляет частное целочисленного деления, а просто укорачивает его до целого числа, отбрасывая дробную часть.
Тип данных результата выражения целочисленного деления - либо Integer, либо Long. VBA использует наименьший тип данных, который соответствует результату выражения.
1 . 'Пример арифметических выражений со знаком "\"
2. 10\4 'деление 10 на 4; возвращает значение 2
3. MyVar\2 'деление MyVar на 2
4. MyVar\OtherVar 'деление MyVar на OtherVar
Деление по модулю
Знак (Mod) используется для выполнения операции деления по модулю. При делении по модулю выражение возвращает только остаток от деления как целое.
1 . 'Пример арифметических выражений со знаком "Mod"
2. 8 Mod 2 'возвращает значение 0;
3. 5.1 Mod 3 'возвращает значение 2;
4. 6 Mod MyVar 'если MyVar содержит 3, возвращает 0
Доступное для понимания объяснение этой математической операции приведено на одном из форумов программистов . Приведу цитату оттуда: "представь, что есть полная 50л канистра и 3л банка. И ты начинаешь вычерпывать из канистры банкой воду (набирать можно только полную банку). 48л вычерпал, осталось 2 литра. Это и есть остаток от деления 50 на 3 по модулю." Другими словами 50 Mod 3 возвращает 2.
Тип данных результата выражения деления по модулю - это Integer или Long. VBA использует наименьший тип, который подходит для результата выражения.
Возведение в степень
Знак (^) используется для выполнения операции возведения в степень числа или выражения. Показатель степени показывает, сколько раз число или выражение должно быть умножено на само себя.
Циклы позволяют выполнить одну или несколько строк кода несколько раз. VBA поддерживает следующие циклы:
Конструкция For . . . Next. Когда число повторений известно заранее, используют цикл For . . . Next. В цикле For используется переменная, называемая переменной цикла или счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Синтаксис этой конструкции следующий:
Параметры counter (счетчик), start (начало цикла), end (конец цикла) и increment (приращение) являются числовыми.
Примечание. Параметр increment может быть как положительным, так и отрицательным. Если он положителен, параметр start должен быть меньше или равен параметру end, иначе цикл не будет выполняться. Если параметр increment отрицателен, то параметр start должен быть больше или равен значению параметра end, чтобы выполнялось тело цикла. Если параметр Step не задан, то значение параметра increment по умолчанию равно 1.
VBA выполняет цикл For в следующей последовательности:
1. Устанавливает значение переменной цикла counter в значение start.
2. Сравнивает значение переменной цикла counter и значение параметра end. Если переменная counter больше, VBA завершает выполнение цикла. (Если значение параметра increment отрицательно, то VBA прекращает выполнение цикла при условии, что значение переменной цикла counter меньше значения параметра end.)
4. Увеличивает значение переменной цикла counter на 1 или на величину значения параметра increment, если он задан.
при заданных a, b, n, если t изменяется от a до b с шагом Dt=(b-a)/(n-1).
Цикл For Each . . . Next похож на цикл For . . . Next, но он повторяет группу операторов для каждого элемента из набора объектов или из массива, вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в наборе.
Синтаксис конструкции цикла For Each . . . Next таков:
Следует помнить следующие ограничения при использовании цикла For Each . . . Next:
Для наборов параметр element может быть только переменной типа variant, общей переменной типа object или объектом, перечисленным в Object Browser
Для массивов параметр element может быть только переменной типа Variant
Нельзя использовать цикл For Each . . . Next с массивом, имеющим определенный пользователем тип, так как переменная типа variant не может содержать значение определенного пользователем типа
Цикл Do применяется для выполнения блока операторов неограниченное число раз. Существует несколько разновидностей конструкции Do . . . Loop, но каждая из них вычисляет выражение-условие, чтобы определить момент выхода из цикла. Как и в случае конструкции If . . . Then условие должно быть величиной или выражением, принимающими значение False (нуль) или True (не нуль).
В следующей конструкции Do . . . Loop операторы выполняются до тех пор, пока значением условия является True (Истина):
Выполняя этот цикл, VBA сначала проверяет условие. Если условие ложно (False), он пропускает все операторы цикла. Если оно истинно (True), VBA выполняет операторы цикла, снова возвращается к оператору Do While и снова проверяет условие.
Следовательно, цикл, представленный данной конструкцией, может выполняться любое число раз, пока значением условия является не нуль или True (Истина). Отметим, что операторы тела цикла не выполняются ни разу, если при первой проверке условия оно оказывается ложным (False).
Другая разновидность конструкции Do . . . Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Эта разновидность гарантирует, что операторы тела цикла выполнятся по крайней мере один раз:
Две другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется, пока условие ложно (False):
Эта статья содержит полное руководство по работе с переменными и использованию VBA Dim.
Первый раздел содержит краткое руководство по использованию оператора Dim, включая примеры и формат оператора Dim.
Остальная часть поста содержит наиболее полное руководство, которое вы найдете в VBA Dim Statement.
Если вы заинтересованы в объявлении параметров, вы можете прочитать о них здесь.
Краткое руководство по использованию VBA Dim Statement
* Примечание. Для раннего связывания необходимо добавить справочный файл с помощью меню «Инструменты» -> «Ссылки». Смотрите здесь, как добавить ссылку на Dictonary.
Полезные ссылки
- Объявление параметров в подпрограмме или функции
- Использование объектов в VBA
- Словарь VBA
Что такое VBA Dim Statement?
Объявление означает, что мы говорим VBA о переменной, которую будем использовать позже.
Существует четыре типа Dim Statement. Все они очень похожи по синтаксису.
Ниже приводится краткое описание каждого типа
В следующем разделе мы рассмотрим формат оператора VBA Dim с некоторыми примерами каждого из них.
В последующих разделах мы рассмотрим каждый тип более подробно.
Формат VBA Dim Statement
Формат выражения Dim показан ниже.
Мы рассмотрим эти различные типы операторов Dim в следующих разделах.
Как использовать Dim с несколькими переменными
Мы можем объявить несколько переменных в одном выражении Dim.
Если мы опускаем тип, то VBA автоматически устанавливает тип как Variant. Мы увидим больше о Variant позже.
Когда вы объявляете несколько переменных, вы должны указать тип каждой отдельно.
Вы можете поместить столько переменных, сколько захотите, в одном выражении Dim, но для удобства чтения рекомендуется оставить его равным 3 или 4.
Где я должен поместить Dim Statement?
Оператор Dim может быть помещен в любое место кода. Тем не менее, он должен предшествовать любой строке, где используется переменная.
Если переменная используется перед оператором Dim, вы получите ошибку «переменная не определена»
Когда дело доходит до позиционирования ваших Dim утверждений, вы можете сделать это двумя основными способами. Вы можете разместить все свои Dim заявления в верхней части процедуры.
ИЛИ вы можете объявить переменные непосредственно перед их использованием:
Я лично предпочитаю последнее, так как оно делает код более аккуратным, и его легче читать, обновлять и обнаруживать ошибки.
Использование Dim в циклах
Помещение оператора Dim в цикл не влияет на переменную.
Когда VBA запускает Sub (или Function), первым делом он создает все переменные, которые были объявлены в выражениях Dim.
Следующие 2 фрагмента кода практически одинаковы. Во-первых, переменная Count объявляется перед циклом. Во втором он объявлен в цикле.
Код будет вести себя точно так же, потому что VBA создаст переменные при входе в подпрограмму.
Могу ли я использовать Dim для присвоения значения?
Мы не можем сделать это в VBA. Мы можем использовать оператор двоеточия для размещения объявлений и назначения строк в одной строке.
Мы не объявляем и не присваиваем в одной строке VBA. Что мы делаем, это помещаем эти две строки (ниже) в одну строку в редакторе. Что касается VBA, это две отдельные строки, как здесь:
Здесь мы помещаем 3 строки кода в одну строку редактора, используя двоеточие:
Нет никаких преимуществ или недостатков в назначении и объявлении в одной строке редактора. Все сводится к личным предпочтениям.
Dim действительно требуется?
Ответ в том, что это не обязательно. VBA не требует от вас использовать Dim Statement.
Вы можете использовать переменную без предварительного использования оператора Dim. В этом случае переменная автоматически будет типом варианта.
Это может привести к таким проблемам, как
- Все переменные являются вариантами (проблемы с этим см. В разделе «Варианты»).
- Некоторые переменные ошибки останутся незамеченными.
Из-за этих проблем рекомендуется сделать использование Dim обязательным в нашем коде. Мы делаем это с помощью оператора Option Explicit.
Мы можем сделать Dim обязательным в модуле, набрав «Option Explicit» в верхней части модуля.
Мы можем сделать это автоматически в каждом новом модуле, выбрав Tools-> Options из меню и отметив флажок «Требовать декларацию переменной». Затем, когда вы вставите новый модуль, «Option Explicit» будет автоматически добавлен в начало.
Давайте посмотрим на некоторые ошибки, которые могут остаться незамеченными, если мы не будем использовать Dim.
Ошибки Переменной
В приведенном ниже коде мы используем переменную Total без использования оператора Dim.
Если мы случайно написали Total неправильно, VBA сочтет это новой переменной.
В приведенном ниже коде мы неправильно написали переменную Total как Totall.
VBA не обнаружит ошибок в коде, и будет напечатано неверное значение.
Давайте добавим Option Explicit и попробуйте приведенный выше код снова
Теперь, когда мы запустим код, мы получим ошибку «Переменная не определена». Чтобы эта ошибка не появлялась, мы должны использовать Dim для каждой переменной, которую мы хотим использовать.
Когда мы добавим оператор Dim для Total и запустим код, мы получим ошибку, сообщающую, что опечатка Totall не была определена.
Это действительно полезно, так как помогает нам найти ошибку, которая в противном случае осталась бы незамеченной.
Ошибка в ключевом слове
Вот второй пример, который более тонкий.
Когда следующий код выполняется, он должен изменить шрифт в ячейке A1 на синий.
Однако, когда код запускается, ничего не происходит.
Ошибка здесь в том, что rgblue должен быть rgbBlue. Если вы добавите Option Explicit в модуль, появится ошибка «переменная не определена». Это значительно облегчает решение проблемы.
Эти два примера очень просты. Если у вас много кода, то подобные ошибки могут стать кошмаром для отслеживания.
Использование Dim с Basic Variables
VBA имеет те же основные типы переменных, которые используются в электронной таблице Excel.
Вы можете увидеть список всех типов переменных VBA здесь.
Тем не менее, большую часть времени вы будете использовать следующие:
* Первоначально мы использовали бы тип Long вместо Integer, потому что Integer был 16-разрядным, и поэтому диапазон был от -32 768 до 32 767, что довольно мало для многих случаев использования целых чисел.
Однако в 32-битной (или выше) системе целое число автоматически преобразуется в длинное. Поскольку Windows была 32-битной начиная с Windows 95 \ NT, нет смысла использовать Integer.
В двух словах, всегда используйте Long для целочисленного типа в VBA.
Фиксированный тип строки
В VBA есть один необычный тип базовой переменной, с которым вы, возможно, не знакомы.
Это фиксированный тип строки. Когда мы создаем нормальную строку в VBA, мы можем добавить текст, и VBA автоматически изменит размер строки для нас.
Фиксированная строка никогда не изменяется. Эта строка всегда будет иметь одинаковый размер независимо от того, что вы ей назначаете
вот несколько примеров:
Использование Dim с Variants
Когда мы объявляем переменную как вариант, VBA решает во время выполнения, какой тип переменной должен быть.
Мы объявляем варианты следующим образом
Однако использование вариантов является плохой практикой, и вот почему:
- VBA не будет замечать неправильных ошибок типа (т. Е. Несоответствие данных).
- Вы не можете получить доступ к Intellisense.
- VBA угадывает лучший тип, и это может быть не то, что вы хотите.
Тип ошибки
Ошибки твои друзья!
Они могут раздражать и расстраивать, когда они случаются, но они предупреждают вас о будущих проблемах, которые не так легко найти.
Ошибка несоответствия типов предупреждает вас, когда используются неверные данные.
Например. Представьте, что у нас есть лист оценок учеников. Если кто-то случайно (или намеренно) заменит метку на текст, данные будут недействительными.
Если мы используем вариант для хранения меток, то ошибки не возникнет
Это не хорошо, потому что в ваших данных есть ошибка, а вы не знаете об этом.
Если вы зададите переменную Long, VBA сообщит вам об ошибке «Несоответствие типов», если значения являются текстовыми.
Доступ к Intellisense
Представьте, что вы объявляете переменную листа, используя Dim
Когда вы используете переменную wk с десятичной точкой, VBA автоматически отобразит доступные опции для переменной.
Вы можете увидеть Intellisense на скриншоте ниже
Если вы используете Variant как тип, то Intellisense будет недоступен
Это потому, что VBA не будет знать тип переменной до времени выполнения.
Использование Dim с Objects
Если вы не знаете, что такое Objects, вы можете прочитать мою статью об VBA Objects здесь.
Есть 3 типа объектов:
- Объекты Excel
- Объекты модуля класса
- Внешние объекты библиотеки
Примечание. Объект VBA Collection используется аналогично тому, как мы используем объект Class Module. Мы используем новое, чтобы создать его.
Давайте посмотрим на каждый из них по очереди.
Объекты Excel
Объекты Excel, такие как Рабочая книга, Рабочий лист, Диапазон и т. Д., Не используют Новый, поскольку они автоматически создаются Excel. Смотрите, «когда New не требуется».
При создании или открытии книги Excel автоматически создает связанный объект.
Например, в приведенном ниже коде мы открываем рабочую книгу. VBA создаст объект, а функция Open вернет книгу, которую мы можем сохранить в переменной
Если мы создадим новый лист, произойдет похожая вещь. VBA автоматически создаст его и предоставит доступ к объекту.
Нам не нужно использовать ключевое слово New для этих объектов Excel.
Мы просто присваиваем переменную функции, которая либо создает новый объект, либо дает нам доступ к существующему.
Вот несколько примеров назначения переменных Workbook, Worksheet и range
Если вы хотите узнать больше об этих объектах, вы можете ознакомиться со следующими статьями: Workbook VBA, Worksheet VBA и Cell и Range VBA.
Использование Dim с Class Module Objects
В VBA мы используем Class Modules для создания наших собственных пользовательских объектов. Вы можете прочитать все о Class Modules здесь.
Если мы создаем объект, нам нужно использовать ключевое слово New.
Мы можем сделать это в операторе Dim или в операторе Set.
Следующий код создает объект, используя ключевое слово New в выражении Dim:
Использование New в выражении Dim означает, что каждый раз при запуске нашего кода будет создаваться ровно один объект.
Использование Set дает нам больше гибкости. Мы можем создать много объектов из одной переменной. Мы также можем создать объект на основе условия.
Этот следующий код показывает, как мы создаем объект Class Module, используя Set. (Чтобы создать модуль класса, перейдите в окно проекта, щелкните правой кнопкой мыши соответствующую книгу и выберите «Вставить модуль класса». Подробнее см. «Создание Simple Class Module».)
Давайте посмотрим на пример использования Set. В приведенном ниже коде мы хотим прочитать диапазон данных. Мы создаем объект только в том случае, если значение больше 50.
Мы используем Set для создания объекта Class1. Это потому, что количество нужных нам объектов зависит от количества значений более 50.
Я сохранил этот пример простым для ясности. В реальной версии этого кода мы бы заполнили объект Class Module данными и добавили его в структуру данных, такую как Collection или Dictionary.
Вот пример реальной версии, основанной на данных ниже:
Чтобы узнать больше о Set вы можете заглянуть сюда.
Объекты из внешней библиотеки
Примерами являются библиотеки Access, Outlook и Word, которые позволяют нам взаимодействовать с этими приложениями.
Мы можем использовать библиотеки для различных типов структур данных, таких как Словарь, Массив, Стек и Очередь.
Существуют библиотеки для очистки веб-сайта (библиотека объектов Microsoft HTML), использования регулярных выражений (регулярные выражения Microsoft VBScript) и многих других задач.
Мы можем создать эти объекты двумя способами:
- Раннее связывание
- Позднее связывание
Давайте посмотрим на это по очереди.
Раннее связывание
Раннее связывание означает, что мы добавляем справочный файл. Как только этот файл добавлен, мы можем рассматривать объект как объект модуля класса.
Мы добавляем ссылку, используя Tools-> Reference, а затем проверяем соответствующий файл в списке.
Например, чтобы использовать словарь, мы ставим флажок «Microsoft Scripting Runtime»
Как только мы добавим ссылку, мы можем использовать словарь как объект модуля класса
Преимущество раннего связывания заключается в том, что у нас есть доступ к Intellisense. Недостатком является то, что это может вызвать конфликтные проблемы на других компьютерах.
Лучше всего использовать раннюю привязку при написании кода, а затем использовать позднюю привязку при распространении кода другим пользователям.
Позднее связывание
Позднее связывание означает, что мы создаем объект во время выполнения.
Мы объявляем переменную как тип «Объект». Затем мы используем CreateObject для создания объекта.
Использование Dim с Arrays
В VBA есть два типа массивов:
Динамический массив дает нам гораздо больше гибкости. Мы можем установить размер во время выполнения кода.
Мы объявляем динамический массив, используя инструкцию Dim, и устанавливаем размер позже, используя ReDim.
Использование ReDim
Большая разница между Dim и ReDim заключается в том, что мы можем использовать переменную в выражении ReDim. В операторе Dim размер должен быть постоянным значением.
На самом деле мы можем использовать оператор Redim без предварительного использования оператора Dim.
В первом примере вы можете видеть, что мы используем Dim:
Во втором примере мы не используем Dim:
Преимущество состоит в том, что вам не нужно тусклое утверждение. Недостатком является то, что это может сбить с толку тех, кто читает ваш код. В любом случае это не имеет большого значения.
Вы можете использовать ключевое слово Preserve с ReDim для сохранения существующих данных при изменении размера массива. Вы можете прочитать больше об этом здесь.
Вы можете найти все, что вам нужно знать о массивах в VBA здесь.
Устранение неполадок ошибок Dim
В таблице ниже приведены ошибки, с которыми вы можете столкнуться при использовании Dim. См. Ошибки VBA для объяснения различных типов ошибок.
Ошибка | Тип | Причина |
Массив уже рассчитан | Компиляция | Использование Redim для статического массива. |
Ожидаемый: идентификатор | Синтаксис | Использование зарезервированного слова в качестве имени переменной. |
Ожидаемый: новый тип имени | Синтаксис | Тип отсутствует в выражении Dim. |
Переменная объекта или переменная блока не установлена | Время выполнения | New не был использован для создания объекта. |
Переменная объекта или переменная блока не установлена | Время выполнения | Set не использовался для назначения переменной объекта. |
Пользовательский тип не определен | Компиляция | Тип не распознан. Это может произойти, если ссылочный файл не добавлен в меню «Инструменты-> Ссылка» или имя модуля класса написано неправильно. |
Недопустимый оператор вне блока Type | Компиляция | Имя переменной отсутствует в выражении Dim |
Переменная не определена | Компиляция | Переменная используется перед Dim-строкой. |
Локальные и глобальные переменные
Когда мы используем Dim в процедуре (то есть подпрограмме или функции), она считается локальной. Это означает, что это доступно только с этой процедурой.
Глобальные переменные объявляются вне процедур. В зависимости от типа, они могут быть доступны для всех процедур в одном и том же модуле или для всех процедур во всех модулях в текущей рабочей книге.
В приведенном ниже коде мы объявили count как глобальную переменную:
Что произойдет, если у нас будет глобальная переменная и локальная переменная с одинаковым именем?
На самом деле это не вызывает ошибку. VBA дает приоритет локальной декларации.
Подобная ситуация может привести только к проблемам, так как трудно отследить, какой счет используется.
Вообще глобальных переменных следует избегать, где это возможно. Они делают код очень трудным для чтения, потому что их значения могут быть изменены в любом месте кода. Это затрудняет обнаружение и устранение ошибок.
Важно знать и понимать глобальные переменные как вы, поскольку вы можете встретить их в существующем коде.
Dim против Private
В VBA есть ключевое слово Private.
Если мы используем ключевое слово Private с переменной или подфункцией / функцией, то этот элемент доступен только в текущем модуле.
Использование Dim и Private для переменной дает тот же результат
В VBA принято использовать Private для глобальных переменных и Dim для локальных
Local OnlyThere в VBA есть 2 других типа объявлений, которые называются Public и Global.
Ниже приводится краткое изложение всех 4 типов:
Заключение
На этом мы заканчиваем статью о VBA Dim Statement. Если у вас есть какие-либо вопросы или мысли, пожалуйста, дайте мне знать в комментариях ниже.
Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.
К циклам VBA относятся:
Далее мы подробно рассмотрим каждый из этих циклов.
Оператор цикла «For» в Visual Basic
Цикл «For … Next»
В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.
Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.
Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:
Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.
Цикл «For Each»
Оператор прерывания цикла «Exit For»
Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.
Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:
Цикл «Do While» в Visual Basic
Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:
В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.
Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.
Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:
Цикл «Do Until» в Visual Basic
Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:
В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.
Однако, как было показано в примерах цикла Do While, в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:
Читайте также: