Word vba if не равно

Условные обозначения:
a|b — вводится одно из нескольких возможных значений, [x] — необязательные параметры,
<информация, которая должна быть введена пользователем или программой>.

Введение

Прежде чем вы приступите к чтению, мне хотелось изложить определенный взгляд на этапы продвижения большинства пользователей по пути освоения программирования на VBA, в первую очередь — в Word.

Считаю чрезвычайно важным тот аспект, что VBA — единственный известный мне язык, позволяющий последовательно двигаться в своем развитии от абсолютной примитивности,
но остающийся при этом прикладным.

Каждый, кто будет приобщаться к разработке, неизбежно пройдет определенные стадии.

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

    Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


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

….

Операторы

Microsoft делит операторы в VBA на арифметические, объединения, сравнения и логические, что, в общем, сразу и нарушает.
Поэтому мы пойдем немного своим путем, что сути не изменит, но упростит понимание.

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

Оператор Название оператора Пример операции Результат
= Присваивание с = с + 1 Увеличение
значения x на 1
+ Сложение x = 2 + 5 x = 7
Вычитание x = 2 — 5 x = -3
* Умножение x = 2 * 5 x = 10
^ Возведение в степень x = 2^3 x = 8
/ Деление x = 2/5 x = 0,4
Целая часть от деления x = 125 x = 2
Mod Остаток от деления (modulo of division) x = 2 Mod 5
x = 10 Mod 4
x = 2 (5*0+2)
x = 2 (4*2+2)
&/+ Конкатенация (слияние) выражений с преобразованием их к типу String.
Может использоваться для соединения данных разного типа в символьный
x = «2» & «5»,
либо x = «2» & 5,
либо(!) x = «2» + «5»
x = «25»

В отличие от других операторов, присваивание может быть использовано в строке только один раз, в связи с чем во многих случаях для него используется
предварительное двоеточие: Unit:=wdCharacter.

В Visual Basic двоеточие служит для оформления нескольких строк в одну. Зачастую это не только делает текст более компактным, но и помогает быстрее его понять:

x(1,1) = «Иванов» : x(1,2) = «Иван» : x(1,3) = «Иванович» : x(1,4) = «01.01.1990»

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

Возвращают значение True, False или NULL.

Оператор Название оператора
= Тот же, что и присвоение
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
<> Не равно
Is Сравнение двух объектов
Like Сравнение двух строк с возможностью использования шаблона
Eqv Сравнение двух выражений

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

Логические операторы

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


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Переменные и типы данных

Именование переменных

См. в материале по основам программирования.

Создание переменных

Если не задана обязательность объявления переменной (Option Explicit), то любая переменная может быть создана самим фактом ее использования.
То есть строка x = 1 создаст переменную x с типом Variant и присвоит ей числовое значение единицы.

При этом ничто не препятствует использовать команду создания с указанием типа (необязательным), например,

Dim x As Integer

Несколько переменных в одной строке указываются через запятую.

Dim x As Integer, y As String

Создание массивов см. в разделе Действия над массивами.

Область видимости переменных

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

По умолчанию действует следующая схема.

  1. Переменные, объявляемые на уровне процедуры переменные доступны только внутри соответствующей процедуры.
  2. Переменные, объявляемые на уровне модуля (в области общих задач), доступны всем процедурам внутри этого модуля, но имеют статус Private.
  3. Переменные, объявляемые на уровне модуля как глобальные (общие, Public), доступны для всех процедур в проекте.
  4. Константы являются частными (Private) по умолчанию. Внутри процедур константы всегда являются частными, их видимость изменить нельзя.
    В стандартных модулях по умолчанию видимость констант уровня модуля(!) можно изменить с помощью ключевого слова Public.

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

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

В квадратных скобках указан размер в байтах. Кроме указания на место, занимаемое в памяти, для многих типов это определяет
возможный диапазон значений. Так, 2 байта для целых чисел дают 22*8 (65536) значений. Но один бит используется для указания знака,
что ограничивает диапазон значений 215 (до ±32768).

  • Логический (булевый, Boolean) [2]. Служит для хранения логической информации: True (истина) или False (ложь).
    Для обозначения используются True и False, для функции «Write #» — #TRUE# и #FALSE#.
  • Символьный (String, text, character, строковый) [длина строки]. Понятно, что львиная доля информации хранится в виде символов.
    Может содержать символы с кодами от 0 до 255!
    Делится на две разновидности:

    • Строка фиксированной длины [1–216].
      Объявляется командой типа (для 5 символов): Dim а As String * 5
    • Строка переменной длины [1–231].
  • Числовой (Numeric). Один из наиболее разветвленных видов, что связано с множеством условий и возможностей для работы с числовой информацией,
    а также её особой важностью для обработки программными средствами.

    • Целочисленный (integer, byte, long) [1–8]. Может хранить только целые числа.
      • Целочисленный (Byte) [1]. Число от 0 до 255. Парадокс, но в этом типе выгоднее хранить логическую информацию, чем в Boolean.
      • Целочисленный (Integer) [2]. Число от –32 768 до 32 767.
      • Целочисленный (Long) [4]. Число от –2 147 483 648 до 2 147 483 647.
      • Целочисленный (LongLong) [8]. Число от –9 223 372 036 854 775 807, до 9 223 372 036 854 775 807.
    • С плавающей точкой (Float) в чистом виде в VBA отсутствует и делится на два конкретных подвида.
      • Single [4]. Диапазоны:
        от –3,402823E38 до –1,401298E-45 для отрицательных значений,
        от 1,401298E-45 до 3,402823E38 для положительных значений.
      • Double [8]. Диапазоны:
        от –1,79769313486231E308 до –4,94065645841247E-324 для отрицательных значений
        от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений
    • Денежный (Currency) [8]. Точность указания чисел — с обязательными четырьмя десятичными разрядами.
      Иногда называют банковским типом, хотя последний должен содержать 8 десятичных разрядов.
      Может хранить число от –922 337 203 685 477,5808 до 922 337 203 685 477,5807.
    • Десятичный (Decimal) [12]. Диапазон хранимых данных зависит от точности (числа десятичных разрядов) и наличия знака.
  • Даты (Date) [8] в виде чисел с плавающей запятой. Диапазон дат: от 1 января 100 до 31 декабря 9999 г. Нулю соответствует 1 января 1900 г.
    Десятичная часть соответствует доле суток, то есть времени.
  • Время (Time) как описанный тип в VBA отсутствует, для него используется десятичная часть от Date.
    При этом команда MyTime = #17:04:23# создаст переменную, содержащую время, есть функции для его обработки. Мда…
  • Для Visual Basic и VBA характерно наличие особого универсального типа переменной (Variant), которая может хранить значения большинства других типов.
  • Другое. Collection, Dictionary, Object [4].

См. также сводку типов данных на сайте Microsoft.

Действия над данными

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

Символьные данные обычно используются в операции сложения (объединения/конкатенации), когда нужно собрать из кусочков выражение.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Логические данные полностью подчиняются законам алгебры логики.
Хотя бояться этого точно не стоит: подобные дебри бесконечно редко возникают в программировании, все остается на уровне максимального примитива.
Три оператора (Or, And, Not) покрывают более 99% случаев и относятся к области одновременной оценки нескольких объектов или разных характеристик одного объекта.

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

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

Действия над массивами

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

Соответственно, можно условно выделить три варианта:

  1. Одномерный массив, то есть состоящий из одной колонки.
  2. Двумерный массив представляет собой истинную простую таблицу (n колонок на m строк).
  3. Многомерный массив в VBA может содержать до 60 измерений.
    Реально можно представить трехмерный массив, в виде набора простых двумерных таблиц, расположенных друг за другом.

Нумерация элементов массива в VBA по умолчанию начинается с нуля.
Это определяется директивой Option Base.
Вызов команды Option Base 1 сменит нижнюю границу нумерации на 1.
Материал, приведенный ниже рассматривает ситуацию по умолчанию (Option Base 0).

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

A_Arr = Array(1, 5, 15)


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Функции

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

Вызов функций, как правило, одинаковый:

переменная = ИмяФункции([аргументы через запятую]).

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

Порядок указания аргументов задается строго. Менять их местами нельзя! Если значение среднего аргумента опускается, то должна быть поставлена пустая запятая:

MsgBox(«Сообщение», , «Заголовок»).

Но! В описании функции может быть указано, что первый аргумент необязательный, а его значение присваивается по умолчанию (см. InStr()).

Тип каждого аргумента также задается достаточно строго и в большинстве случаев не может быть изменен.

Вместе с тем, многие функции могут не иметь аргументов вообще, так как обрабатывают определенную заранее системную информацию.
Например, функция Date() во многих языках.

Ниже приведены некоторые наиболее важные функции с их разбивкой по принципу типа обрабатываемой информации (в алфавитном порядке).
Как показывает практика, подобное разделение наиболее эффективно.

Символьные (строковые) функции

Функция Назначение
Asc(<строка>) Возвращает ASCII-код (0–255) первого символа строки
Chr(<число>) Преобразует ASCII-код (0–255) в символ (строку)
InStr([начало, ]<строка, в которой ищем>, <искомая строка>) Находит позицию первого вхождения одной строки внутри другой. InStr(3, «корова», «о») вернет значение 4.
То есть, начиная с третьей буквы, «о» стоит на четвертой позиции в слове. (InstrRev работает также, но с конца строки.)
LCase(<строка>), UCase(<строка>) Возвращает строку, преобразованную в нижний и верхний регистры соответственно
Left(<строка>, <число символов>) Возвращает число первых (слева) символов строки. Если их меньше, чем запрошено, возвращается вся строка
Len(<строка>) Возвращает количество символов в строке (длину строки)
Mid(<строка>, <номер начального символа>[, <число символов>]) Выделяет фрагмент из строки. Mid(«корова», 2, 3) вернет «оро»: три символа, начиная со второго
Replace(<строка>, <что>, <на что>) Возвращает строку, заменив в ней одни фрагменты на другие
Right(<строка>, <число символов>) Возвращает указанное число последних (справа/концевых) символов строки
Space(<число>) Возвращает строку, состоящую из «числа» пробелов (специализированный String)
StrReverse(<строка>) Возвращает строку со знаками в обратном порядке
String(число, символ) Возвращает строку, состоящую из «числа» повторяющихся символов
Trim(<строка>), LTrim(<строка>) и RTrim(<строка>) Удаляют из строки пробелы слева (LTrim), справа (RTrim), или с обеих сторон (Trim)
Val(<строка>) Преобразует строку в число. Правильно обрабатываются только строки с десятичным разделителем точкой!

Коды (Asc/Chr) некоторых важных символов.

Символ ASCII-код
Табулятор 9
Enter 13
Esc 27
Пробел 32 (первый неслужебный знак)
! 33 (первый знак, который выводится на экран и на печать)
Цифры (0–9) 48–57
Английские буквы (A–Z) 65–90
Английские буквы (a–z) 97–122
Русские буквы (А–Я) 192–223
Русские буквы (а–я) 224–255

Функции даты и времени

Функция Назначение
DateAdd(интервал, число, дата) Прибавляет к дате «число» интервалов (лет, месяцев, недель и т.д.). Интервал задается символьным шаблоном
DateSerial(год, месяц, день) Возвращает значение даты. Каждый из числовых аргументов может быть математическим выражением
TimeSerial(час, минута, секунда) Возвращает значение времени. Каждый из числовых аргументов может быть математическим выражением
TimeValue(<строка времени>) Извлекает значение времени (Time) из его строкового представления в любом варианте, основанном на шаблоне разделения двоеточием («0:00:00»)
Hour(<время>) Выделяет из строки времени (тип Time) часы (тип Integer)
Minute(<время>) Выделяет из строки времени (тип Time) минуты (тип Integer)
Second(<время>) Выделяет из строки времени (тип Time) секунды (тип Integer)
Time Возвращает системное время компьютера. Тип — Time. В VBA используется без скобок (то есть MyTime = Time)
Date Возвращает системную дату компьютера. Тип — Date. В VBA используется без скобок (то есть MyDate = Date)
Now Возвращает системную дату и время компьютера. Today = Now
Timer Возвращает количество секунд (с дробной частью), прошедших после полуночи
Weekday(<дата>, [номер первого дня недели]) Возвращает номер дня недели указанной даты. По умолчанию, первый день недели — воскресенье.
Чтобы получить в привычном нам порядке, следует задать второй аргумент — двойку: Weekday(«01.01.2009», 2)

Числовые и математические функции

Функция Назначение
Abs(x) абсолютное значение (модуль) числа x
Atn(x) арктангенс угла x в радианах (от –π/2 до π/2)
Cos(x) косинус угла x в радианах
Exp(x) константа e (основание натурального логарифма ~2.718282) в степени x
Log(x) натуральный логарифм от числа
Rnd([x]) генерация случайного числа от 0 до 1. Аргумент x может задавать правила выбора значения
Round(x, [десятичных знаков]) округляет числа с заданной точностью
Sgn(x) знак числа, равно -1 для отрицательных чисел; 1 — для положительных и 0 для x = 0
Sin(x) синус угла x в радианах
Sqr(x) квадратный корень из x
Str(x) преобразует число x в строку. Для положительных чисел в начало добавляется пробел
Tan(x) тангенс угла x в радианах
Fix(x) Отбрасывает дробную часть числа и возвращает целое значение. В отличие от Int(), для отрицательных значений дает ближайшее большее целое (Fix(-3,3) = –3)
Int(x) Отбрасывает дробную часть числа и возвращает целое значение. В отличие от Fix(), для отрицательных значений дает ближайшее меньшее целое (Int(-3,3) = –4)

Производные тригонометрические функции (арксинус…) можно посмотреть здесь.

Чтобы преобразовать градусы в радианы, умножьте градусы на π/180 (π ≈ 3,1415926535897932).

Также имеется множество финансовых функций, не входящих в наш курс обучения.

Функции, задаваемые (или определяемые) пользователем (UDF)

Использование UDF (User Defined Function) позволяет многократно расширить возможности языка программирования и, в гораздо большей степени, уменьшить трудозатраты на разработку.

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

Вместе с тем, необходимым является понимание как самой идеи, так и технологии ее реализации. Дальнейшее использование неизбежно связано с методом проб и ошибок.

Основания для написания UDF:

  1. Очевидные. Необходимость одинаковых действий, осуществляемых из разных процедур и, особенно, для разных проектов.
    Начинающему программисту это очевидным не кажется, пока не нарастет критическая масса знаний и опыта.
  2. Неочевидные. Необходимость одинаковых действий из одной процедуры. Часто это может быть решено программно (всегда сложнее) и без создания функции.
  3. Скрытые. Уменьшение кода основной программы, очень сходное с рассуждениями на первых этапах устного описания бытовых алгоритмов:
    создается своего рода «черный ящик», обращение к которому и результат такового очевиден, но скрыт.
    Более сложным будет видение возможной перспективы выделения функции, когда, с большой вероятностью, ее удастся применить позже.
    Может быть с существенной переработкой, но первый шаг простимулирует обдумывание решения.

При определении функции вместо Sub используется Function, а для завершения — End Function.

Область видимости. Данный вопрос не обсуждается в литературе.
Сразу отметим, что ни одна функция не видна в списке макросов, так как ее запуск пользователем не подразумевается.
Вызвать функцию можно только обращением из программы.
При обычном определении, функция доступна из любого модуля проекта.
При определении Private Function, к ней можно обратиться только из текущего модуля.
Наоборот, Public Function доступна из любого модуля любого открытого проекта.

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

Чтобы использовать возвращаемое значение функции, следует назначить ее переменной, а аргументы заключить в скобки. То есть так же, как для встроенной функции.
Например, для вызова функции без аргументов с ожиданием возврата целого числа в диапазоне 0–255:

	Dim Var As Byte
	Var = MyFunc()

Значение, которое возвращается функцией, должно быть присвоено в процессе обработки переменной с именем функции.

	Function MyFunc() [As Byte]
	    'Необязательное добавление типа при объявлении позволит проверять тип возвращаемого значения 
	    Код функции...
	    MyFunc = 1 'Возвращаемое значение равно единице 
	End Function

Преобразование типов данных

Во всех языках программирования существует большое число функций, предназначенных для преобразования одного типа данных в другой.
Необходимость этого связана с тем, что многие действия можно производить только над данными одного типа. Например, нельзя сложить число 10 и строку из двух цифр: «20»
(в VBA — можно).
Если первое превратить в строку, то результат будет представлять собой четырехсимвольную строку «1020».
Наоборот, преобразовав «20» в число и опять сложив их, получим число 30.

В других ситуациях просто предполагаются разнообразные математические операции над числами, а результат нужно вывести в виде строки, снабженной поясняющими словами.
Например, обработали число 5 и получили число 120. Чтобы собрать строку: «Из числа 5 получен результат 120!», нужно провести преобразование чисел и их сложение с текстом:

«Из числа» + Str(5) + «получен результат» + Str(120) + «!»

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

Для проверки типа данных (точнее, их анализа) можно воспользоваться одной из функций в формате Функция(<переменная>):
IsArray, IsDate,
IsEmpty, IsError,
IsMissing, IsNull,
IsNumeric, IsObject.

Также можно применить общую функцию TypeName(имя_переменной), возвращающую название типа данных словом из списка:
Byte, Integer, Long, Single, Double, Currency, Decimal, Date, String, Boolean, Error, Empty, Null, Object.

Весьма небесполезна в этом плане также VarType(имя_переменной), возвращающая идентичную информацию, но числом.

Преобразования числа в строку: Str(<число>)

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

Для того, чтобы избавиться от этого пробела, можно использовать одну из двух функций Trim(<строка>) или Ltrim(<строка>).

Важно! В качестве десятичного разделителя распознается исключительно точка!

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

Format(Expression, [ Format ], [ FirstDayOfWeek ], [ FirstWeekOfYear ])

Ее побочным эффектом будет строка из числа без ведущего пробела. Синтаксис довольно сложный, так что приведем простейший пример:

Format(x, «General Number»)

Следующий вариант выведет число с отделением разрядов (классов) пробелами:

Format(x, «Standard»)

Преобразования строки в число: Val(<строка>)

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

  1. Функция обработает любую строку и, если она содержит в качестве первого знака цифру, производится преобразование для последующих цифр.
  2. При этом игнорируются пробелы, а первая(!) точка воспринимается как десятичный разделитель. Вторая точка прервет процесс.
  3. Анализ продолжается, пока выполняются пп.1 и 2.
  4. Если значащая цифра в начале не обнаружена, будет возвращен ноль.

Важно! В качестве десятичного разделителя распознается исключительно точка!
Если вам нужно обработать десятичную запятую, воспользуйтесь функцией

Replace(x, «,», «.»)

где x — строковая переменная, содержащая число с десятичной запятой.

Ветвление программ (условные операторы)

Для осуществления ветвления программ используются два основных оператора: If… Else… End If и Case…

Оператор If… Else… End If

По существу, оператор следует переводить как Если… Иначе… Конец Если.

1. Первичным следует считать использование так называемого неполного If. В этом случае не используется часть Else.

	If <условие> Then
	    ...[блок команд]
	End If

Таким образом, блок команд будет выполнен только когда будет истинным условие, заданное на входе оператора.

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

	If x > 10 Then
	    x = x/10
	End If

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

	If <условие> Then
	    ...[блок команд 1]
	Else
	    ...[блок команд 2]
	End If

Пример, в котором переменная памяти x возводится в квадрат, если она отрицательна, а иначе — в куб (ноль также будет возводиться в куб):

	If x < 0 Then
	    x = x^2
	Else
	    x = x^3
	End If

3. Наконец, ряд языков (как и VBA) позволяет составлять многоуровневую конструкцию без использования вложения If.

	If a = 1 Then
	    ...[блок команд 1]
	ElseIf a = 2 Then
	    ...[блок команд 2]
	ElseIf b > 0 Then
	    ...[блок команд 3]
	Else
	    ...[блок команд 4]
	End If

Функция IIf()

Так как чрезвычайно часто встречается ситуация, когда единственное назначение условного оператора — изменение переменной памяти по условию, все развитые языки содержат функцию IIf().
Она решает названную задачу в гораздо более компактном виде.

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

x = IIf(x < 0, 0, 1)

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

Оператор Case

В начале конструкции производится вычисление какого-либо выражения, значение которого проверяется на соответствие несколько раз:

	Select Case <проверяемое выражение>
	Case значение1
	    [действия1]
	[Case значение2
	    [действия2]]
	...
	[Case Else
	    [действия для любых других случаев]]
	End Select

Циклы

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

Цикл For…

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

Общий синтаксис:

	For счетчик = start To end [Step шаг]
	    [программа]
	    [Exit For]
	    [программа]
	Next [счетчик]

В приводимом далее примере находится произведение четных чисел (шаг = 2) от 2 до введенного пользователем значения y.
Если произведение превысит 1 трлн, то произойдет выход из цикла. Нетрудно убедиться, что i достигнет только 24, а y будет равен 1,961,990,553,600.

	Dim i As Byte, x As Double, y As Integer
	x = 1
	y = InputBox()
	For i = 2 To y Step 2
	    x = x * i
	    If x > 1000000000000 Then
	        Exit For
	    End If
	Next i

Программа не содержит никаких проверок и вывода результата, но, если пользователь введет не то, цикл просто не будет выполняться.
Далее — важный для начинающих момент.
Строка «x = x * i» означает, что переменной x будет присвоен результат ее текущего значения, умноженный на четное i.
После этого производится сравнение.
Запись триллиона в явном виде, а не как 10^9 экономит ресурсы, так как иначе производилось бы возведение в степень на каждом повторении цикла.

For Each In…Next

Объектно-ориентированное программирование предполагает наличие объектов, состоящих из «кучи» элементов.
Результатом стал специализированный цикл For без счетчика, но с перебором каждого (Each) элемента, спрятанного внутри какого-то объекта (In).

Общий синтаксис:

	For Each элемент In имя_объекта(массива)
	    [программа]
	    [Exit For]
	    [программа]
	Next [элемент]

Современная модель приложений MS Office во многом не позволяет обратиться к необходимым сведениям другим способом.

Цикл While…Wend

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

Общий синтаксис:

	While <условие>
	    [тело цикла]
	Wend

Условие является обязательным и может представлять собой символьное или числовое выражение, анализ которого возвращает истинное или ложное значение (то есть логическое).
Если результатом вычисления будет значение Null, то оно расценивается как ложное.

Тело цикла выполняется при истинном значении условия, вплоть до оператора Wend, а затем вновь возвращается на строку While для повторной оценки условия.
Если оно истинно, то происходит повтор тела цикла.
Иначе происходит завершение цикла и исполнение программы продолжается со строки, идущей после Wend.

Цикл While может быть вложенным.

Обратите внимание, что принудительного выхода из цикла нет: только анализ исходного условия!
Для того, чтобы его реализовать, следует воспользоваться циклом Do…Loop.
Эта реализация цикла лучше всего подходит для так называемого «зацикливания» программы, когда он повторяется бесконечно.

Ремарка: прервать ситуацию можно клавишами Esc (если разработчик ее не заблокировал) и Ctrl+C.

Цикл Do (While…|Until…)… Loop

Данный цикл в том или ином виде используется в большинстве языков программирования и исполняется, пока (While) истинно условие или пока условие не будет достигнуто (Until).

Общий синтаксис:

	Do {While|Until} <условие>
	    [тело цикла]
	    [Exit Do]
	    [продолжение тела цикла]
	Loop

или

	Do
	    [тело цикла]
	    [Exit Do]
	    [продолжение тела цикла]
	Loop {While|Until} <условие>

Из синтаксиса следует, что условие можно задать в конце. Тогда цикл будет обязательно исполнен хотя бы один раз.
Во многих языках, чтобы добиться этого, приходится предпринимать дополнительные усилия.

Число команд Exit Do внутри тела не ограничено и обычно реализуется через ветвление с использованием If…Then.
При таком завершении, исполнение программы продолжается со строки, идущей после Loop.

Конструкция With…End With

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

Она предназначена для случаев, когда объектные выражения с одинаковым началом (нередко довольно длинным) повторяются много раз.
Макрорекордер использует эту конструкцию слишком часто, что приводит к необходимости обратного действия — сборке конструкции в одну строку.

Понятно, что в следующем примере речь идет о поиске — всё, что внутри конструкции — строки которого не нужно выискивать в программе.
Фраза «Selection.Find» записана только один раз. Все строки, которые должны получить её в начало, следует начинать с точки.

	With Selection.Find
	    .ClearFormatting
	    .Replacement.ClearFormatting
	    .Text = "?"
	    .Replacement.Text = "!"
	    ...
	End With

Без With это выглядело бы так:

	Selection.Find.ClearFormatting
	Selection.Find.Replacement.ClearFormatting
	Selection.Find.Text = "?"
	Selection.Find.Replacement.Text = "!"
	...

Цвет

Далеко не все возможности работы с цветом однозначны, особенно учитывая отсутствие у многих объектов свойства Color в среде разработки (хотя оно есть).


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Некоторые мысли по оптимизации программного кода

«Идеальное» написание программы всегда было «идолом». Недостижимым даже теоретически.

Первичной проблемой является противоречие между быстродействием и использованием памяти.
Никуда также не девается читабельность кода и прямолинейность рассуждений программиста, почти всегда создающие не совсем правильный результат при первичной реализации.
То есть, всегда найдется, что поправить.

К сожалению, так как не существует решения для многих противоречий, невозможно создание наилучшего программного кода для многих ситуаций.


Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
1. Студент I/II курса ВХК РАН. 2. Бывший студент ВХК РАН. 3. Подготовка к ОГЭ. 4. Подготовка к ЕГЭ.


Работа с закладками (Bookmarks)

Закладки могут оказаться весьма востребованными при разработки программы,
так как обеспечивают однозначное перемещение в определенную точку документа, включая выделение фрагмента текста.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


….

Перенос текста программ из модулей

Примитивная задача, ведь все умеют копировать!
Попробуйте. Желаю успеха.
Я вижу два примитивных способа, основанные на одинаковом исходном действии.

Рассказ — на занятии. (PS! Чуйка говорит, что многие в 2021 году этого не услышат.)

Содержание

  • Список основных операторов сравнения в VBA
  • Равно
  • Не равно
  • Больше чем
  • Больше или равно
  • Меньше, чем
  • Меньше или равно
  • Оператор
  • Оператор Like

VBA позволяет использовать операторы сравнения для сравнения значений. Используя эти операторы, вы можете сравнивать значения и в результате возвращать логическое значение True или False.

Сначала мы отобразим список операторов сравнения, которые можно использовать в коде VBA:

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

Объяснение
=

Равно

Не равно

>

Больше чем

>=

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

<

Меньше, чем

<=

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

Равно

В Равно Оператор проверяет, равны ли два значения, и возвращает True или False. Вот пример кода:

123456789101112 Dim intA как целое числоDim intB как целое числоDim blnResult As BooleanintA = 5intB = 5Если intA = intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В этом примере мы хотим проверить, intA равно intB. Если это правда, значение Boolean blnResult будет True, в противном случае — False.

Сначала мы устанавливаем значения intA а также intB к 5:

После этого воспользуемся = в операторе If, чтобы проверить, соответствуют ли значения intA а также intB равны:

12345 Если intA = intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

Обе переменные равны 5, поэтому blnResult возвращает True:

Изображение 1. Использование оператора Equal To

Не равно

В Нет Равно Оператор проверяет, не равны ли два значения, и возвращает True или False. Вот пример кода:

Произошла ошибка. Пожалуйста, попробуйте позже.

В этом примере мы хотим проверить, intA не равно intB. Если это правда, значение Boolean blnResult будет True, в противном случае — False.

Мы используем в операторе If, чтобы проверить, соответствуют ли значения intA а также intB разные:

12345 Если intA intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

Значение intA равно 5, а значение intB равно 6, переменные не равны, поэтому blnResult возвращает True:

Изображение 2. Использование оператора Not Equal To

Больше чем

В Больше чем Оператор проверяет, больше ли первое значение второго и возвращает True или False. Вот пример кода:

123456789101112 Dim intA как целое числоDim intB как целое числоDim blnResult As BooleanintA = 6intB = 5Если intA> intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В этом примере мы хотим проверить, intA больше, чем intB. Если это правда, значение Boolean blnResult будет True, в противном случае — False.

Кроме того, мы используем > в операторе If, чтобы проверить, имеет ли значение intA больше, чем intB:

12345 Если intA> intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В заключение, посколькуintA больше, чем intB, то blnResult возвращает True:

Изображение 3. Использование оператора «Больше, чем»

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

В Больше или равно Оператор проверяет, больше ли первое значение второму или равно ему, и возвращает True или False. Вот пример кода:

123456789101112 Dim intA как целое числоDim intB как целое числоDim blnResult As BooleanintA = 5intB = 5Если intA> = intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В этом примере мы хотим проверить, intA Больше или равно intB. Если это правда, значение Boolean blnResult будет True, в противном случае — False.

Мы используем>= в операторе If, чтобы проверить, имеет ли значение intA Больше или равно intB:

12345 Если intA> = intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В заключение, поскольку обе переменные равны 5, blnResult возвращает True:

Изображение 4. Использование оператора «Больше или равно»

Меньше, чем

В Меньше, чем Оператор проверяет, меньше ли первое значение второго и возвращает True или False. Вот пример кода:

123456789101112 Dim intA как целое числоDim intB как целое числоDim blnResult As BooleanintA = 5intB = 6Если intA <intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В этом примере мы хотим проверить, intA меньше чем intB. Если это правда, значение Boolean blnResult будет True, в противном случае — False.

Мы используем < в операторе If, чтобы проверить, имеет ли значение intA меньше чем intB:

12345 Если intA <intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В качестве intA меньше чем intB, то blnResult возвращает True:

Изображение 5. Использование оператора «Меньше чем»

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

В Меньше или Равно Оператор проверяет, меньше ли первое значение или равно ему, и возвращает True или False. Вот пример кода:

123456789101112 Dim intA как целое числоDim intB как целое числоDim blnResult As BooleanintA = 5intB = 5Если intA <= intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В этом примере мы хотим проверить, intA меньше или равно intB. Если это правда, значение Boolean blnResult будет True, в противном случае — False.

Мы используем <= в операторе If, чтобы проверить, имеет ли значение intA меньше или равно intB:

12345 Если intA <= intB ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, если

В заключение, поскольку обе переменные равны 5, blnResult возвращает True:

Изображение 6. Использование оператора «Меньше или равно»

Оператор

Оператор Is проверяет, содержат ли две объектные переменные один и тот же объект:

12345678910111213 Sub CompareObjects ()Dim ws1 как рабочий лист, ws2 как рабочий листУстановить ws1 = Sheets («Sheet1»)Установить ws2 = Sheets («Sheet2»)Если ws1 Is ws2, тоMsgBox «Тот же WS»ЕщеMsgBox «Различные WS»Конец, еслиКонец подписки

Оператор Like

Оператор Like может использоваться для поиска неточных текстовых совпадений. В этом примере проверяется, начинается ли строка с «Мистер».

1234567891011121314 Sub LikeDemo ()Dim strName As StringDim blnResult As BooleanstrName = «Мистер Майкл Джеймс»Если strName Like «Mr *» ТогдаblnResult = TrueЕщеblnResult = ЛожьКонец, еслиКонец подписки

Если вы хотите узнать, как сравнивать строки, щелкните здесь: VBA Compare Strings — StrComp

Если вы хотите узнать, как использовать операторы сравнения, щелкните здесь: Логические операторы VBA

Операторы VBA: арифметические, логические, сравнения, присвоения

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

Арифметических операторов в VBA всего 7. Четыре стандартных: сложение (+), вычитание (-), умножение (*), деление (/) и еще три:

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

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

а можно еще проще: nVar = 10

Во втором случае не путайте знак равенства с оператором равенства.

Выражение nVar = 10 значит «присвоить переменной nVar значение 10», а если строка выглядит так:

If (nVar = 10) то это значит «если значение переменной nVar равно 10».

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

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

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

Операторы сравнения всегда возвращают true или false — true, если утверждение истинно, и false, если ложно.

Немного про сравнение строковых значений:

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

Option Compare Text

Чуть подробнее про оператор Like. Общий его синтаксис выглядит как

Выражение1 Like Выражение2

При этом Выражение1 — любое текстовое выражение VBA, а Выражение2 — шаблон, который передается оператору Like. В этом шаблоне можно использовать специальные подстановочные символы

 Подстановочные символы для оператора LIKE

Подстановочный символ

Значение

#

Любая цифра (только одна) от 0 до 9

*

Любое количество любых символов (включая нулевое)

?

Любой символ (только один)

[a,b,c]

Любой символ (только один) из приведенного списка

[!a,b,c]

Любой символ (только один), кроме приведенных в списке

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

  • AND — логическое И, должны быть истинными оба условия;
  • OR — логическое ИЛИ, должно быть истинным хотя бы одно из условий;
  • NOT — логическое отрицание, возвращает TRUE, если условие ложно;
  • XOR — логическое исключение. В выражении E1 XOR E2 возвращает TRUE, если только E1 = TRUE или только E2 = TRUE, иначе — FALSE;
  • EQV — эквивалентность двух выражений, возвращает TRUE, если они имеют одинаковое значение;
  • IMP — импликация, возвращает FALSE, если E1 = TRUE и E2 = FALSE, иначе — TRUE.

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

Почти в любой программе VBA используются операторы конкатенации. В VBA их два — + или &. Рекомендуется всегда использовать &, потому что:

  • при использовании & производится автоматическое преобразование числовых значений в строковые — нет опасности допустить ошибку;
  • при использовании оператора + сложение строкового значения со значением типа Null дает Null.

Возможно вам это будет интересно!

2020-11-30

Not Equal is an operator in VBA, also called a negation operator. It is a logical function, so the output returned by this function is either “True” or “False.” We know that the equal operator is “=” this but not equal is “<>” in VBA, so whatever the value we get from the equal operator, we will get the exact opposite value using the Not Equal operator.

“Not Equal” Operator in VBA

Usually, we do a logical test “whether something is equal to other things or not.” Sometimes, we also need to do the “inequality” test. The inequality test is nothing but not an equal test. Generally, we say if something is equal to another thing or not. If it is equal, perform some task if not a different task. Similarly, we can also do some operations using the Inequality test. For example, “NOT EQUAL” in VBA represents the combination of greater than and less than symbols. If both these operators are combined, then it becomes not equal, i.e., “<>.

Table of contents
  • “Not Equal” Operator in VBA
    • How Not Equal to Works in Excel VBA?
    • Examples of Not Equal to in Excel VBA
      • Example #1
      • Example #2
    • Hide and Unhide Sheets with Not Equal Sign
      • #1 – Hide All Sheets except One Sheet
      • #2 – Unhide All Sheets except One Sheet
    • Recommended Articles

How Not Equal Works in Excel VBA?

VBA Not Equal works exactly opposite to the logic of equal to operator. Equal to operator returns TRUE if the supplied test is satisfied is not, it will return FALSE. So, for example, if you say 10 = 10, it will return TRUE or else FALSE.

Conversely, “Not Equal” works in the opposite direction. If the supplied logical test in excelA logical test in Excel results in an analytical output, either true or false. The equals to operator, “=,” is the most commonly used logical test.read more is not equal, then only it will return TRUE or else FALSE.

For example, if you say 10 <> 10, it will return FALSE because 10 equals 10. Therefore, one value should not be equal to the other value to get a TRUE result.

VBA Not Equal

You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Not Equal (wallstreetmojo.com)

Examples of Not Equal to in Excel VBA

Below are the examples of not equal to the operator in Excel VBA.

Example #1

Now, we will see how to practically use the VBA Not Equal (<>) sign. Look at the below piece of code.

Code:

Sub NotEqual_Example1()

    Dim k As String

    k = 100 <> 100

    MsgBox k

End Sub

VBA Not Equal Example 1

Here, we are testing whether the number 100 is not equal to the number 100. We know the number 100 equals 100, so the result will be FALSE.

VBA Not Equal Example 1-1

Now, we will change the equation.

Code:

Sub NotEqual_Example1()

    Dim k As String

    k = 100 <> 99

    MsgBox k

End Sub

VBA Not Equal Example 1-2

Now, the test is whether the number 100 is not equal to 99. So the result will be TRUE.

VBA Not Equal Example 1-3

Example #2

Now, we will see how to use this not equal operator in real-time examples. For the demonstration, we have created some data.

VBA Not Equal Example 2

We have “Value 1” and “Value 2.”

Now, our requirement is if Value 1 is not equal to Value 2, then we need the result as “Different,” or else we need the result as “Same.”

Step 1: Define a variable as an Integer.

Code:

Sub NotEqual_Example2()

 Dim k As Integer

End Sub

VBA Not Equal Example 2-1

Step 2: Open FOR NEXT LOOP from 2 to 9.

Code:

Sub NotEqual_Example2()

  Dim k As Integer

  For k = 2 To 9

  Next k

End Sub

Example 2-2

Step 3: Inside the loop, we need to test whether Value 1 is not equal to Value 2. Since we need our results, we need to use IF Condition.

Code:

Sub NotEqual_Example2()

   Dim k As Integer

   For k = 2 To 9

      If Cells(k, 1) <> Cells(k, 2) Then
           Cells(k, 3).Value = "Different"
      Else
           Cells(k, 3).Value = "Same"
      End If

   Next k

End Sub

Example 2-3

Suppose the condition tests whether Value 1 is not equal to Value 2 or not. If not equal, it will return “Different.” If equal, it will return “Same.”

You can copy and paste the below VBA codeVBA code refers to a set of instructions written by the user in the Visual Basic Applications programming language on a Visual Basic Editor (VBE) to perform a specific task.read more.

Copy this code to your module and run using the F5 key or manually. It will return a result like this.

Example 2-4

Hide and Unhide Sheets with Not Equal Sign

The various ways of using not equal sign are enormous. However, we can use this sign to fulfill our needs.

#1 – Hide All Sheets except One Sheet

We have seen this kind of situation many times. We needed to hide all the sheets except the particular sheet.

For example, if you want to hide all sheets except the sheet name “Customer Data,” then you can use this code.

Code:

Sub Hide_All()

    Dim Ws As Worksheet

    For Each Ws In ActiveWorkbook.Worksheets

        If Ws.Name <> "Customer Data" Then
            Ws.Visible = xlSheetVeryHidden
        End If
    Next Ws

End Sub

Example 3

Note: Change the worksheet name to your worksheet name.

#2 – Unhide All Sheets except One Sheet

Similarly, we can also unhide all sheets except one sheet. Use the below code to do this.

Code:

Sub Unhide_All()

    Dim Ws As Worksheet

    For Each Ws In ActiveWorkbook.Worksheets

        If Ws.Name <> "Customer Data" Then
            Ws.Visible = xlSheetVisible
        End If
   Next Ws

End Sub

Example 3-1.

You can download this VBA Not Equal to Excel template here – VBA Not Equal Operator Template.

Recommended Articles

This article has been a guide to VBA, Not Equal. Here, we look at how to use the logical operator “Not Equal to” in VBA, along with practical examples and downloadable Excel sheets. Below are some useful VBA-related articles: –

  • Not Function in Excel VBA
  • VBA StrConv
  • VBA Integer

Like this post? Please share to your friends:
  • Word using prefix dis
  • Word vba how to
  • Word vba for next
  • Word vba find all words
  • Word vba excel range