Несколько операторов в одной строке vba excel

Обновлено: 07.07.2024

Синтаксис языка программирования — набор правил, описывающий комбинации символов алфавита, считающиеся правильно структурированной программой (документом) или её фрагментом.

Основные синтаксические принципы этого языка следующие:

Семантика языка — это смысловое значение слов. В программировании — начальное смысловое значение операторов, основных конструкций языка и т. п.

Оператор — это наименьшая способная выполняться единица кода VBA. Оператор может объявлять или определять переменную, устанавливать параметр компилятора VBA или выполнять какое-либо действие в программе.

Арифметических операторов в VBA всего 7.

  • возведение в степень (^). Например, 2^3 = 8;
  • целочисленное деление (\). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Например, 5\2 = 2;
  • деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Например, 5 Mod 2 = 1.

Оператор присваивания в VBA — это знак равенства. Можно записывать так:

Здесь не путайте знак равенства с оператором равенства. Последнее выражение означает "присвоить переменной nVar значение 10", а если строка выглядит так: If (nVar = 10) , то это значит "если значение переменной nVar равно 10".

Операторов сравнения в VBA всего 8:

  • равенство (=). Например, If (nVar = 10);
  • больше, чем (>) и меньше, чем ( 10);
  • больше или равно (>=) и меньше или равно ( = 10);
  • не равно (<>). Например, If (nVar<>10);
  • сравнение объектов (Is). Определяет, ссылаются объектные переменные на один и тот же объект или на разные. Например, If (obj1 is obj2);
  • подобие (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон.

Операторы сравнения всегда возвращают True (если утверждение истинно) или False (если утверждение ложно).

Очень часто при проверке нескольких условий используются логические операторы:

  • And — логическое И. Должны быть истинными оба условия;
  • Or — логическое ИЛИ. Должно быть истинным хотя бы одно из условий;
  • Not — логическое отрицание. Возвращает True, если условие ложно;
  • Xor — логическое исключение. В выражении E1 Xor E2 возвращает True, если только E1 = True или только E2 = True, иначе — False;
  • Eqv — эквивалентность двух выражений, возвращает True, если они имеют одинаковое значение;
  • Imp — импликация, E1 Imp E2 возвращает False, если E1 = True и E2 = False, иначе — True.

Помнить нужно про And, Or, Not, остальные логические операторы используются редко.

Переменные — это контейнеры для хранения изменяемых данных. Без них не обходится практически ни одна программа. Для простоты переменную можно сравнить с номерком в гардеробе — вы сдаете в гардероб какие-то данные, в ответ вам выдается номерок. Когда вам опять потребовались эти данные, вы "предъявляете номерок" и получаете их.

Каждая переменная имеет имя. Обращение к переменной происходит по имени. Правила выбора имен в VBA едины для многих элементов (переменные, константы, функции, процедуры и т. п.):

  • имя должно начинаться с буквы;
  • не должно содержать пробелов и символов пунктуации (исключение — символ подчеркивания);
  • максимальная длина — 255 символов;
  • должно быть уникальным в текущей области видимости
  • зарезервированные слова (те, которые подсвечиваются синим цветом в окне редактора кода) использовать нельзя.

При создании программ VBA рекомендуется определиться с правилами, по которым будут присваиваться имена объектам — соглашение об именовании. Чаще всего используется так называемое венгерское соглашение (в честь одного из программистов Microsoft, Charles Simonyi, венгра по национальности):

  • имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
    • str (или s) — String, символьное значение;
    • fn (или f) — функция;
    • sub — процедура;
    • c (или все буквы имени заглавные) — константа (контейнер для хранения данных, которые, в отличие от переменных, не изменяются в ходе выполнения VBA-программы);
    • b — Boolean, логическое значение (True или False);
    • d — дата;
    • obj (или o) — ссылка на объект;
    • n — числовое значение;
  • имена функций, методов и каждое слово в составном слове должно начинаться с заглавной буквы:
    MsgBox objMyDocument.Name
    Sub CheckDateSub()

Тип данных относят к самым фундаментальным понятиям любого языка программирования. Тип данных определяет множество допустимых значений, которое может принимать величина (переменная или константа), и множество действий, которые можно выполнить с этой величиной.

2. Основные типы данных VBA

В VBA предусмотрены следующие типы данных:

  • числовые:
    • Byte — целое число от 0 до 255, для хранения нужен 1 байт памяти;
    • Integer — целое число от −32 768 до 32 767, 2 байта;
    • Long — большое целое число от −2 147 483 648 до 2 147 483 647, 4 байта;
    • Currency (денежный) — большое десятичное число с 19 позициями, включая 4 позиции после запятой
    (от –922337203685477,5808 до 922337203685477,5807), 4 байта,
    используется для хранения чисел, когда точность крайне важна, что бывает при вычислениях с денежными единицами;
    • Decimal — еще большее десятичное число с 29 позициями (после запятой можно использовать от 0 до 28 позиций), 8 байт;
    • Single и Double — значения с плавающей запятой (4 и 8 байт)
    (от -3.402823·10 38 до -1.401298·10 -45 для отрицательных значений и
    от 1.401298·10 -45 до 3.402823·10 38 для положительных значений для Single, и
    от -1.79769313486232·10 308 до -4.94065645841247·10 -324 для отрицательных значений и
    от 4.94065645841247·10 -324 до 1.79769313486232·10 308 для положительных значений для Double);
  • строковые (String переменной длины (примерно до 2 млрд символов) и фиксированной длины (примерно до 65 400 символов));
  • дата и время (Date — от 01.01.100 до 31.12.9999), 8 байт;
  • логический (Boolean — может хранить только значения True и False), 2 байта;
  • объектный (Object — хранит ссылку на любой объект в памяти);
  • Variant — специальный тип данных, который может хранить любые типы данных, 16 байт +1

Над различными типами данных допустимы различные операции. В VBA имеются три основных типа операций:

  • математические, выполняются над числами, их результатом являются числа;
  • операции отношения, могут применяться не только к числам, их результатом является значения логического типа;
  • логические, используются в логических выражениях и их результатом являются логические значения.

3. Приоритеты операций

Приоритет Операция
1
2
3
4
5
6
7
8
9
10
11
12
Вызов функции и скобки
^
- (смена знака)
*, /
\
Mod
+, –
>, <, >=, <=, <>, =
Not
And
Or
Xor

4. Математические функции

Функция Возвращаемое значение
Abs (<число>) Модуль (абсолютная величина) числа
Atn (<число>) Арктангенс
Cos (<число>) Косинус
Exp (<число>) Экспонента, т. е. результат возведения основания натурального логарифма в указанную степень
Log(<число>) Натуральный логарифм
Rnd (<число>) Случайное число из интервала [0,1).

Если число меньше нуля, то Rnd возвращает каждый раз одно и то же число, используя аргумент в качестве опорного числа. Если число больше нуля или аргумент опущен, то — следующее случайное число в последовательности; если число равняется нулю то — случайное число, возвращенное при предыдущем вызове этой функции.

Этим видео-уроком я хочу начать серию видео-уроков, которые будут посвящены основам работы в программе Microsoft Word.


Основные операторы языка VBA

3.1. Правила записи операторов

При записи операторов необходимо придерживаться следующих правил:

- Каждый новый оператор записывается с новой строки.

- Чтобы записать несколько операторов на одной строке, их разделяют между собой двоеточием (:).

- Если оператор не помещается в одной строке, то необходимо поставить в конце строки пробел и знак подчеркивания ( _), а затем продолжить не поместившуюся часть на следующей строке.

3.2. Оператор присваивания

Оператор присваивания используется, если какой-то переменной нужно присвоить новое значение. Он имеет следующий синтаксис:

ИМЯ_ПЕРЕМЕННОЙ = ВЫРАЖЕНИЕ

Сначала вычисляется выражение в правой части, а затем результат присваивается переменной, стоящей в левой части.

Например . Записать с помощью оператора присваивания следующее математическое выражение:

На VВА это выражение можно записать в виде следующего оператора:

3.3. Операторы ввода-вывода

3.3.1. Оператор и функция MsgBox

Оператор MsgBox осуществляет вывод информации в диалоговом окне и устанавливает режим ожидания нажатия кнопки пользователем.

Он имеет следующий синтаксис:

Заголовок - задает заголовок окна.

Функция MsgBox возвращает значение типа Integer, указывающее, какая кнопка была нажата в диалоговом окне.

Таблица 3.1. Допустимые значения переменной кнопки

Отображение

Аргумент

Кнопки ОК и Отмена

Кнопки Да и Нет

Кнопки Да, Нет и Отмена

Кнопки Прекратить, Повторить и Игнорировать

Кнопки Повторить и Отмена.

Для этого можно использовать следующий оператор:

MsgBox "Сегодня на календаре" & Date , , "Внимание"


В результате будет выведено следующее окно (рис.3.1).


3.3.2. Функция InputBox

Функция InputBox осуществляет ввод значений переменных с помощью окна ввода и имеет следующий синтаксис:

Заголовок - задает заголовок окна.

Например , Ввести значение переменной N с клавиатуры, предусмотрев значение по умолчанию равное 10.

Для этого можно использовать следующий оператор:

N = InputBox("Введите N", "Ввод исходных данных",10)

В результате будет выведено следующее окно для ввода значения переменной N (рис.3.2).


Если значение по умолчанию подходит пользователю, то после щелчка кнопки ОК окно ввода закроется, переменной N присвоится значение 10 и выполнение программы возобновится с оператора, стоящего непосредственно за вызовом InputBox.

Если же значение по умолчанию не подходит пользователю, то перед щелчком по кнопке ОК необходимо ввести нужное значение переменной N.

3.4. Условный оператор IF

Для реализации разветвляющегося вычислительного процесса в VBA используется оператор If…Then…Else, который представляет собой простейшую форму проверки условий. Он имеет следующий синтаксис:

If УСЛОВИЕ Then ОПЕРАТОР_1 Else ОПЕРАТОР_2

ОПЕРАТОР_1 выполняется, если УСЛОВИЕ истинно, в противном случае выполняется ОПЕРАТОР_2. При этом оператор If…Then…Else записывается в одну строку.

УСЛОВИЕ – это выражение логического типа. Результат выражения всегда имеет булевский тип. Выражение может быть простым и сложным. При записи простых условий могут использоваться все возможные операции отношения, указанные в табл. 3.2.

Таблица 3.2. Логические отношения

Операция

Название

Выражение

Результат

True, если А равно В

True, если А не равно В

True, если А ,больше В

True, если А меньше В

Больше или равно

True, если А больше или равно В

Меньше или равно

True, если А меньше или равно В

Сложные условия образуются из простых путем применения логических операций и круглых скобок. Список логических операций приведен в табл. 3.3.

Таблица 3.3. Логические операции

Название

Выражение

А

В

Результат

Not

And

Or

В условном операторе допустимо использование блока операторов вместо любого из операторов. В этом случае условный оператор имеет вид:

If УСЛОВИЕ Then

Else

End If

В условном операторе может проверяться несколько условий. В этом случае условный оператор имеет вид:

If УСЛОВИЕ_1 Then

ElseIf УСЛОВИЕ_2 Then

Else

End If

Пример 1 . Написать часть программы для алгоритма на рис. 3.3.


Пример 2. Написать часть программы для алгоритма на рис. 3.4.


3.5. Оператор выбора Select Case

Оператор Select Case удобно использовать, когда в зависимости от значения некоторого выражения, имеющего конечное множество допустимых значений, необходимо выполнить разные действия. Он также относится к условным операторам, но имеет другой вид:

Select Case ПРОВЕРЯЕМОЕ_ВЫРАЖЕНИЕ

Case ЗНАЧЕНИЯ_1

Case ЗНАЧЕНИЯ_N

[Case Else

End Select

ПРОВЕРЯЕМОЕ_ВЫРАЖЕНИЕ может иметь любой скалярный тип, кроме вещественного. ЗНАЧЕНИЯ состоят из произвольного количества значений или диапазонов, отделенных друг от друга запятыми.

Тип ЗНАЧЕНИЙ должен совпадать с типом ПРОВЕРЯЕМОГО_ВЫРАЖЕНИЯ.

Сначала вычисляется ПРОВЕРЯЕМОЕ_ВЫРАЖЕНИЕ. Если его значение совпадает с одним из значений ЗНАЧЕНИЯ_I, то выполнятся ОПЕРАТОРЫ_I и управление передается оператору, стоящему после End Select. Если его значение не совпадает ни с одним из значений ЗНАЧЕНИЯ_I, то выполнятся ИНАЧЕ_ОПЕРАТОРЫ и управление передается оператору, стоящему после End Select

Например. Написать часть программы для алгоритма на рис. 3.5, определяющего значение переменной S в зависимости от значения переменной n.


3.6. Операторы цикла

Для реализации циклического вычислительного процесса, т. е. многократного выполнения одного или нескольких операторов, служит оператор цикла For…Next, который имеет следующий синтаксис:

For СЧЕТЧИК=НАЧ_ЗНАЧЕНИЕ Тo КОН_ЗНАЧЕНИЕ Step ШАГ

[Exit For]

Next СЧЕТЧИК

Цикл For…Next перебирает значения переменной СЧЕТЧИК, которая является параметром цикла, от начального до конечного значения с указанным шагом изменения. При этом обеспечивается выполнение блока операторов тела цикла при каждом новом значении счетчика. Если Step ШАГ в конструкции отсутствует, то по умолчанию считается, что шаг равен 1. По оператору Exit For можно выйти из оператора цикла до того, как СЧЕТЧИК достигнет последнего значения.*

Для перебора объектов из группы подобных объектов, например, ячеек из диапазона или элементов массива, удобно использовать оператор цикла For… Each…Next.

For Each Элемент In Группа

[Exit For]

Next Элемент

В VBA для организации циклов с неизвестным заранее числом повторений используются и другие операторы цикла:

циклы с предусловием – Do While … Loop,

Do Until … Loop;

циклы с постусловием – Do … Loop While,

Do … Loop Until.

Ниже приведен синтаксис этих операторов цикла:

' Цикл с предусловием Do While Loop

Do While УСЛОВИЕ

[Exit Do]

Loop

Примечание. Не рекомендуется принудительно изменять значения параметра цикла, его начального и конечного значения в теле цикла For…Next.

' Цикл с предусловием Do Until Loop

Do Until УСЛОВИЕ

[Exit Do]

Loop

' Цикл с постусловием Do Loop While

Do

[Exit Do]

Loop While УСЛОВИЕ

' Цикл с постусловием Do Loop Until

Do

[Exit For]

Loop Until УСЛОВИЕ

Оператор Do While…Loop обеспечивает многократное повторение блока операторов до тех пор, пока УСЛОВИЕ соблюдается, а оператор Do Until…Loop пока УСЛОВИЕ не соблюдается. Операторы Do…Loop While, Do…Loop Until отличаются от перечисленных выше операторов тем, что сначала блок операторов выполняется по крайней мере один раз, а потом проверяется УСЛОВИЕ.

Для избежания зацикливания в теле цикла должен быть хотя бы один оператор, который изменяет значения переменных, стоящих в УСЛОВИИ.

Оператор Exit Do обеспечивает досрочный выход из оператора цикла.

Что именно двоеточие ":" (разделитель операторов) делает в VBA?

":" в значении "новая строка" не может объяснить это поведение:

Этот трехстрочный код успешно компилируется:


Эта двухстрочная версия завершается с ошибкой «Ошибка компиляции: иначе без If»:


Эта 1-строчная версия завершается с ошибкой «Ошибка компиляции: End If без блока If»:


Итак, как точно описать значение «:» в соответствии с этим поведением?

3 ответа

Двоеточие позволяет записывать оператор в одну строку и обозначает конец допустимого оператора VBA.

Однако некоторые двоеточия могут быть опущены (или добавлены автоматически редактором VBA) в зависимости от появления каких-либо операторов else . End if также может быть опущен в некоторых случаях

Например, ваш однострочный оператор будет выполняться, если он был написан как:

If 1 = 2 Then MsgBox "impossible" Else: MsgBox "OK"

Обратите внимание на отсутствие End if . Ваш двухстрочный оператор синтаксически неверен и выдаст ошибку.

Двоеточие : позволяет поместить 2 или более инструкций в одну строку.
Then имеет 2 синтаксиса:

По вашим наблюдениям, Then должна быть последней инструкцией в строке, чтобы попасть в случай b.

Я считаю : более полезным в 2 ситуациях:

С Dim (если вам не требуется, чтобы все Dim были в начале процедуры)

Двоеточие не заменяет новую строку.
Это позволяет вам поместить несколько операторов в одну строку, но это все еще считается одной строкой для грамматики.

документация специально показывает использование двоеточия с If :

В однострочной форме возможно выполнение нескольких операторов в результате решения If. Then . Все операторы должны быть в одной строке и разделены двоеточиями, как в следующем утверждении:

В отличие от многострочной формы

Вы помещаете несколько операторов в одну строку, но по-прежнему используете однострочную форму оператора If без End If .

считается ли плохой практикой использовать двоеточия для размещения двух операторов в одной строке в Visual Basic?

нет ничего изначально неправильного в использовании двоеточия для объединения операторов. Это действительно зависит от контекста, но пока он не уменьшает читаемость, в этом нет ничего плохого.

это хорошая практика в умеренности, потому что иногда читаемость усиливается путем объединения двух строк:

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

не делайте этого, если:

  • это вредит читабельности.
  • это затрудняет отладку. Структуры управления, такие как If. Then нужно оставаться чистым. Вы будете рады ты держал все просто, когда пришло время установить точку останова.
  • это ставит под угрозу будущее редактирование. Часто вы хотите сохранить разделы портативными. Перемещение или переструктурирование блока кода легко затрудняется попытками минимизировать код.

В общем, я бы не советовал, так как это делает для более загруженного кода.

однако для простых задач в этом нет ничего плохого. Например:

Я думаю, что такая строка достаточно коротка, чтобы не вызвать путаницы.

Я возьму другую сторону. Мне не нравятся плотные строки кода. Легче обезжиривать код, когда строки не объединены.

Объединение операторов также упрощает создание длинных функций, которые по-прежнему помещаются на одном экране.

Это не большой грех, мне просто не нравится.

Мне также не нравится одна строка если заявления.

или циклы ожидания:

но, очевидно, вы действительно можете сделать это грубо на кого-то тоже:

еще одна практическая причина, по которой вы возможно, не стоит использовать этот подход-точки останова. Точки останова могут быть установлены только линией. Поэтому, если у вас есть несколько вещей, выполняемых в одной строке, вы не можете изолировать вторую вещь. Он остановится на первом утверждении. (Это также одна из причин, по которой некоторые люди не любят одну строку ifs.) Это просто немного усложняет отладку.

Я обычно не использую двоеточия в производственном коде по этой причине. Однако я использую их для улучшения краткости кода" копировать/вставлять", который я публикую в форумы и прочее. YMMV:)

Я только когда-либо использовал его, когда я clsoing набор записей и установка переменной в ничто. Я считаю, что одна строка вместо двух дает мне больше строк кода на экране и не умаляет читаемости.

Я видел, как он используется в простых случаях выбора, таких как следующее, Но это было бы так далеко, как я бы пошел.

и даже тогда я бы выстроились часть" msg postinfo clearfix">

Я понимаю, что это очень старый вопрос, но это был первый результат моего поиска в Google, поэтому я надеюсь, что меня можно простить за вторжение сюда.

есть одна ситуация (именно то, что привело меня сюда на самом деле), в которой этот подход не только полезен, это единственный способ достичь желаемого результата: немедленное окно. Любой код, который вы хотите выполнить в окне Immediate, должен быть в одной строке. Поэтому, чтобы использовать любую форму Do, Case, For, While или With в ближайшем будущем окно, вам нужно будет использовать двоеточия.

Это и считается плохой практикой на большинстве сайтов, на которых я работал. И большинством разработчиков VB, с которыми я работал. И в моей голове. Если я увижу его, то признаю, что почти наверняка изменю его. Я говорю "почти", потому что допускаю возможность того, что я мог бы найти кусок кода, который выглядел бы лучше. Хотя я не ожидаю увидеть его в своей жизни.

мне также очень не нравится one-line** If * * s любой.

оба, скорее всего, похмелье от дней мониторов VGA (640x480); это не оправдание в эти дни.

Я никогда не видел, чтобы это упоминалось в официальном качестве ни в одной из компаний, в которых я работал. Но я думаю, что чрезмерное использование двоеточий может начать делать ваш код менее читаемым и более болезненным для поддержания.

Я сам иногда использую их, например, при проверке отмены в одном из моих последних проектов:

ввод этого в сохранял мой код читаемым, чем альтернативный блок IF.

но это может быть слишком далеко, я недавно унаследовал проект, который изобилует примерами использования двоеточия слишком далеко :

лично я считаю, что выше, чтобы быть немного много.

Я видел, как он используется в объявлениях классов при использовании наследования или реализации интерфейса:

но как и другие, я также не рекомендуем его использовать.

ответ на вопрос-нет. Все, что выходит за рамки "нет", чисто субъективно и расточительно, независимо от ответа за пределами простого "нет". Ниже приведена моя трата на печать.

вы что-то вроде раба? Делай, что хочешь. Вы-центр своей вселенной, а не какой-то незнакомец из StackOverflow. Если вы работаете в компании, вопрос немой, потому что стиль кодирования уже будет определен и полностью вне вашего контроля. Что касается самого себя, то кто в этой вселенной собирается когда-либо в вечности посмотрите на let along заботиться о вашем коде.

Я бы выбрал a над B. как очевидно, это показывает цель двоеточия без использования двоеточия. Это для экономии места. Ниже экономит место и делает код гораздо более читаемым. Все Просто И Глупо. Же для троичной ? : использование. Когда код по своей сути сложен, тогда двоеточие, одна строка, если тогда еще, или троичный больше не следует рассматривать.

Читайте также: