Целая часть от деления vba excel

Арифметические (математические) операторы, использующиеся в VBA Excel. Их предназначение, особенности вычислений, приоритет в выражениях.

Обзор арифметических операторов

Операторы Описание
Оператор «+» Сложение двух чисел или объединение двух строк (для объединения строк предпочтительнее использовать оператор «&»)
Оператор «-» Вычитание (определение разности двух чисел) или отрицание (отражение отрицательного значения числового выражения: -15, -a)
Оператор «*» Умножение двух чисел
Оператор «/» Деление двух чисел (деление на 0 приводит к ошибке)
Оператор «^» Возведение числа в степень
Оператор «» Целочисленное деление
Оператор «Mod» Возвращает остаток от деления двух чисел

Особенности операторов «» и «Mod»

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

  • -3.5 => -4
  • -2.5 => -2
  • -1.5 => -2
  • -0.5 => 0
  • 0.5 => 0
  • 1.5 => 2
  • 2.5 => 2
  • 3.5 => 4

Следующие строки вызовут ошибку «Division by zero» («Деление на ноль»):

a = 3 Mod 0.5

a = 3 (2 2.5)

Чтобы избежать ошибок, когда требуется общепринятое математическое округление, округляйте делитель и делимое с помощью оператора WorksheetFunction.Round.

Приоритет арифметических операторов

Приоритет определяет очередность выполнения математических операторов в одном выражении. Очередность выполнения арифметических операторов в VBA Excel следующая:

  1. «^» – возведение в степень;
  2. «» – отрицание;
  3. «*» и «/» – умножение и деление;1
  4. «» – целочисленное деление;
  5. «Mod» – остаток от деления двух чисел;
  6. «+» и «» – сложение и вычитание.2

1 Если умножение и деление выполняются в одном выражении, то каждая такая операция выполняется слева направо в порядке их следования.
2 Если сложение и вычитание выполняются в одном выражении, то каждая такая операция выполняется слева направо в порядке их следования.

Для переопределения приоритета выполнения математических операторов в VBA Excel используются круглые скобки. Сначала выполняются арифметические операторы внутри скобок, затем — операторы вне скобок. Внутри скобок приоритет операторов сохраняется.

a = 3 ^ 2 + 1 ‘a = 10

a = 3 ^ (2 + 1) ‘a = 27

a = 3 ^ (2 + 1 * 2) ‘a = 1

Содержание

  1. Арифметические операторы VBA
  2. Оператор присваивания (=)
  3. Оператор сложения (+)
  4. Оператор вычитания (-)
  5. Оператор умножения (*)
  6. Оператор деления (/)
  7. Целочисленное деление ()
  8. Деление по модулю (Mod)
  9. Возведение в степень (^)
  10. Арифметические операторы VBA
  11. Арифметические операторы в Visual Basic
  12. Арифметические операции
  13. Попытка деления на ноль
  14. Битовые операции
  15. Безопасность типов
  16. Функции VBA для работы с числовыми значениями

Арифметические операторы VBA

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

Оператор присваивания используется для присваивания результата выражения переменной.

Операция присваивания имеет две синтаксические формы:

1 Let varname = expression
2 varname = expression

varname — любая переменная VBA

expression — любое выражение VBA

Первый вариант операции присваивания использовался в ранних языках программирования Basic. Второй вариант используется в современной версии VBA.

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

X = 5 + 7; Y = X + 5 ; Z = X — Y; A = B; I = I + 1

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

Например, если в операторе присваивания А = А +5, переменная А до операции присваивания содержала значение 7, то после операции она будет содержать значение 12 (7+5).

  • Можно присваивать любую численную переменную (или выражение) любой другой переменной численного типа (или переменной типа Variant);
  • Если присваивается численное выражение типизированной переменной с меньшей точностью (например, Double — Long), VBA округляет значение выражения для совпадения с точностью переменной, принимающей новое значение;
  • Если переменной типа String присваивается переменная типа Variant, содержащая число, VBA автоматически преобразует это число в строку.

Оператор сложения (+)

Оператор сложения выполняет простое сложение. Оба операнда должны быть численными выражениями или строками, которые VBA может преобразовать в число. Оператор сложения можно также использовать для выполнения арифметических операций с данными типа Date.

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

  • Результатом сложения типа Single и Long будет Double;
  • Результатом сложения типа Date с любым другим типом данных всегда будет Date;
  • Если результат превышает диапазон типа Integer, то VBA преобразует его в Long;
  • Если результат превышает типы Long, Single, Date, то VBA преобразует его в Double;
  • Если любой операнд в выражении сложения является Null, то результатом выражения сложения также будет Null.

Напомним порядок увеличения точности для численных типов данных: Byte, Integer, Long, Single, Double, Currency.

Следует сказать, что надо четко понимать как VBA преобразует типы данных в результате арифметических операций. Это поможет в дальнейшем избежать многих «ненужных» ошибок при написании кода.

Оператор вычитания (-)

Оператор вычитания выполняет две задачи: используется для вычитания одного числа из другого; обозначает унарный минус (это знак минус, который помещается пред числом для указания того, что это отрицательное число). Поместить унарный минус перед переменной или выражением означает то же, что умножить это число на -1.

Оба операнда в выражении вычитания должны быть численными переменными (выражениями) или строковыми выражениями, которое VBA может преобразовать в число. Можно использовать оператор вычитания для работы с датами.

VBA использует те же правила для определения типа данных результата выражения вычитания, что и для выражений, использующих оператор сложения. Но, есть дополнение:
Если оба операнда в выражении являются типом Date, то результат выражения будет иметь тип Double.

Оператор умножения (*)

Оператор умножения перемножает два числа — результатом выражения умножения является произведение двух операндов. Оба операнда в выражении умножения должны быть численными выражениями или строками, которые VBA может преобразовать в число.

VBA следует тем же правилам для определения типа данных результата выражения умножения, что и для выражений, использующих оператор сложения. В выражениях умножения все переменные Variant, которые содержат значения типа Date, преобразуются в численные значения.

Оператор деления (/)

Оператор деления с плавающей точкой выполняет обычное арифметическое деление своих операндов.

В выражениях деления первый операнд делится на второй операнд — результатом деления является частное.

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

Если хотя бы один операнд в выражении деления имеет тип Null, то результат деления также будет Null.

Типом данных операции деления с плавающей точкой является Double, за исключением:

  • Оба операнда в выражении деления имеют тип Integer или Single — результат Single;
  • Если результат выражения не переполняет диапазон значений для типа Single.

Целочисленное деление ()

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

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

Перед выполнением операции целочисленного деления VBA округляет каждый операнд до числа типа Integer или Long (такой же тип имеет и результат целочисленного деления).

VBA отбрасывает (но не округляет!) любой дробный остаток результата выражения целочисленного деления. Например, выражения 225 и 245 будут иметь один и тот же результат = 4.

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

Деление по модулю (Mod)

Деление по модулю как бы дополняет целочисленное деление. В делении по модулю выражение возвращает только остаток операции деления как целое.
22 Mod 5 = 2
24 Mod 5 = 4
25 Mod 5 = 0

Остальные свойства деления по модулю идентичны целочисленному делению.

Возведение в степень (^)

Оператор возведения в степень возводит число в степень.

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

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

Результат выражения имеет тип Double.

Если хотя бы один операнд в выражении имеет тип Null, то результат возведения в степень также будет Null.

Подведем итог вышеизложенному:

Арифметические операторы VBA

Оператор Синтаксис Описание
+ A + B Сложение: складывает А и В.
A — B Вычитание: вычитает из А В.
* A * B Умножение: перемножает А на В.
/ A / B Деление: делит А на В.
A B Целочисленное деление: делит А на В, отбрасывая дробную часть. Результат — целое число.
Mod A Mod B Деление по модулю: делит А на В, возвращая только остаток операции деления как целое число.
^ A ^ B Возведение в степень: возводит А в степень В.

В начало страницы

В начало страницы

Источник

Арифметические операторы в Visual Basic

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

Арифметические операции

Можно сложить два значения в выражении вместе с оператором + или вычесть одно из другого с помощью оператора — (Visual Basic), как показано в следующем примере.

Отрицание также использует оператор — (Visual Basic), но только с одним операндом, как показано в следующем примере.

Умножение и деление используют операторы * и / (Visual Basic) соответственно, как показано в следующем примере.

Экспоненциация использует оператор ^, как показано в следующем примере.

Целочисленное деление выполняется с помощью оператора (Visual Basic). Целочисленное деление возвращает частное значение, т. е. целое число, представляющее количество делений, которые делитель может разделить на дивиденд без учета остатка. Делитель и дивиденд должны быть целочисленными типами ( SByte , , Short Byte , UShort , Integer UInteger , Long , и ULong ) для этого оператора. Все остальные типы сначала должны быть преобразованы в целочисленный тип. В следующем примере показано целочисленное деление.

Арифметика модуля выполняется с помощью оператора Mod. Этот оператор возвращает остаток после деления делителя на дивиденд целое число раз. Если и делитель, и дивиденд являются целочисленными типами, возвращаемое значение является целочисленным. Если делитель и дивиденд являются типами с плавающей запятой, возвращаемое значение также является плавающей запятой. Следующий пример демонстрирует эту ситуацию.

Попытка деления на ноль

Деление на ноль имеет разные результаты в зависимости от используемых типов данных. В целочисленных делениях ( SByte , , UShort Short Byte , Integer , ULong UInteger Long ) платформа .NET Framework создает DivideByZeroException исключение. В операциях деления для Decimal типа данных или Single платформа .NET Framework также вызывает DivideByZeroException исключение.

В делениях с плавающей запятой, связанных с типом Double данных, исключение не возникает, и результатом является член класса, представляющий NaN, PositiveInfinityили NegativeInfinity, в зависимости от дивиденда. В следующей таблице перечислены различные результаты попытки разделить значение на Double ноль.

Тип данных dividend Тип данных делителя Дивидендная стоимость Результат
Double Double 0 NaN (не математически определенное число)
Double Double > 0 PositiveInfinity
Double Double > помощью оператора или влево с помощью SByte , Byte , Short , UShort , Integer , UInteger , Long , или ULong . Тип данных операнда величины сдвига должен быть Integer или должен быть расширен до Integer .

Арифметические сдвиги не являются циклическими. Это означает, что биты, сдвинутые с одного конца результата, не возвращаются на другом конце. Битовые позиции, освобожденные при смещении, задаются следующим образом:

0 для арифметического сдвига влево

0 для арифметического сдвига вправо положительного числа

0 для арифметического сдвига вправо типа данных без знака ( Byte , , UShort UInteger , ULong )

1 для арифметического сдвига вправо отрицательного числа ( SByte , Short , Integer или Long )

В следующем примере значение смещается влево Integer и вправо.

Арифметические сдвиги никогда не создают исключения переполнения.

Битовые операции

Помимо логических операторов, Not , Or , And и Xor выполняют побитовую арифметику при использовании числовых значений. Дополнительные сведения см. в разделе «Побитовые операции» статьи Логические и побитовые операторы в Visual Basic.

Безопасность типов

Операнды обычно должны иметь один и тот же тип. Например, если вы выполняете сложение с переменной Integer , следует добавить ее в другую Integer переменную и присвоить результат переменной типа Integer .

Одним из способов обеспечения правильного типобезопасного кодирования является использование оператора Option Strict. Если задано Option Strict On значение , Visual Basic автоматически выполняет типобезопасные преобразования. Например, при попытке добавить переменную Integer в переменную Double и присвоить ей Double значение, операция будет выполняться обычным образом, так как Integer значение можно преобразовать Double в без потери данных. С другой стороны, небезопасные преобразования типа вызывают ошибку компилятора с Option Strict On . Например, если попытаться добавить переменную в переменную Double и присвоить значение переменной Integer , компилятор выдает ошибку, так как переменная Double не может быть неявно преобразована в тип Integer . Integer

Однако если задано Option Strict Off значение , Visual Basic позволяет выполнять неявные сужающие преобразования, хотя они могут привести к непредвиденной потере данных или точности. По этой причине рекомендуется использовать Option Strict On при написании рабочего кода. Для получения дополнительной информации см. Widening and Narrowing Conversions.

Источник

Функции VBA для работы с числовыми значениями

  • ABS() — эта функция возвращает абсолютное значение переданного ей числа (то же число, но без знака). Например, ABS(3) и ABS(-3) вернут одно и то же значение 3.
  • Int() , Fix() и Round() позволяют по разному округлять числа:
    • Int() возвращает ближайшее меньшее целое;
    • Fix() отбрасывает дробную часть;
    • Round() округляет до указанного количества знаков после запятой.

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

    MsgBox Round(2.505, 2)

    то результатом будет 2,5 , хотя предполагалось получить 2,51 . Поэтому порой для округления лучше использовать Format :

    MsgBox Format(2.505, «#,##0.00»)

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

    MsgBox CDbl(Format(2.505, «#,##0.00»))

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

    MsgBox Application.Round(2.505, 2)

    Но здесь стоит учитывать, что это не чистый VB и этот метод сработает только в Excel, т.к. по сути мы обращаемся к встроенной в Excel функции округления ОКРУГЛ (ROUND) , которая применяет именно математическое округление.
    Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.

    Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum

    Источник

    Adblock
    detector

Арифметические операции в VBA: сложение, вычитание, умножение, деление и возведение в степень

Подробности

Категория: Основы VBA

 Опубликовано: 08 октября 2012

Подробно рассмотрим то, как 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 в диалоговом окне  

8.End Sub

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

Вычитание

Знак (-) используется для выполнения операции вычитания, а также для обозначения отрицательных чисел (когда ставится перед переменной или выражением и означает тоже самое, что и умножение на -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»        

8.End Sub

Умножение

Знак (*) используется для выполнения операции умножения, результатом этой операции является произведение операндов. Для определения типа данных результата выражения умножения 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.104                              ‘деление 10 на 4; возвращает значение 2

3.MyVar2                           ‘деление MyVar на 2

4.MyVarOtherVar                    ‘деление 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 использует наименьший тип, который подходит для результата выражения.

Возведение в степень

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

1.‘Пример арифметического выражения со знаком «^»

2.3 ^ 3                   ‘это то же, что и 3*3*3, возвращает значение 27

Условные обозначения:
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 выполняет такие арифметические операции, как сложение, вычитание, умножение, деление и возведение в степень, а также особые операции, такие как целочисленное деление и деление по модулю. Ниже, в таблице, представлены знаки операций, используемые при написании арифметических VBA-выражений.

Арифметические операции в VBA: сложение, вычитание, умножение, деление и возведение в степеньВыражение — это значение либо группа значений, выражающая отдельное значение. Результат выражения — одно значение определенного типа данных. Знаки (обозначения) операций используются для действий над определенными значениями в выражениях. Для присваивания результата выражения переменной используется оператор присваивания (=), который сохраняет любое значение, представленное выражением справа от оператора присваивания в ячейке памяти, на которую ссылается переменная слева от этого оператора.

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

Сложение

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

Sub Slozhenie()
'Пример арифметического выражения со знаком "+"
    Dim A1, A2, A3 As Integer     'объявление переменных
    A1=1                          'присваивание значения 1 переменной А1  
    A2=2                          'присваивание значения 2 переменной А2  
    A3=A1+A2                      'присваивание результата сложения переменной А3
    MsgBox A3                     'вывод А3 в диалоговом окне   
End Sub

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

Вычитание

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

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

Правило 1. Если в выражении вычитания один из операндов является типом Date, то и результат выражения будет иметь тип Date.

Правило 2. Если в выражении вычитания оба операнда являются типом Date, то результат выражения будет иметь тип Double.

Sub Vychitanie()
'Пример арифметического выражения со знаком "-"
    Dim D1, D2 As Date              'объявление переменных
    D1=Now                          'присваивание значения текущей даты переменной D1
    D2=Now-5                        'присваивание значения даты переменной D2
    MsgBox TypeName(D2), vbOKOnly, "Now-5"
    MsgBox TypeName(D1-D2), vbOKOnly, "D1-D2"         
End Sub

Умножение

Знак (*) используется для выполнения операции умножения, результатом этой операции является произведение операндов. Для определения типа данных результата выражения умножения VBA использует те же правила, что и для выражений, использующих сложение. В выражениях умножения все переменные Variant, содержащие значения типа Date, преобразуются в численные значения.

'Пример арифметических выражений со знаком "*"
4*10                              'умножение 4 на 10
MyVar*2                           'умножение MyVar на 2
MyVar*OtherVar                    'умножение MyVar на OtherVar

Деление

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

'Пример арифметических выражений со знаком "/"
10/4                              'деление 10 на 4
MyVar/2                           'деление MyVar на 2
MyVar/OtherVar                    'деление MyVar на OtherVar

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

Если в выражении деления оба операнда имеют тип Integer или Single, то результат выражения деления имеет тип Single. Если результат переполняет диапазон для типа Single, то VBA преобразует его в тип Double.

Целочисленное деление 

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

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

'Пример арифметических выражений со знаком ""
104                              'деление 10 на 4; возвращает значение 2
MyVar2                           'деление MyVar на 2
MyVarOtherVar                    'деление MyVar на OtherVar

Деление по модулю

Знак (Mod) используется для выполнения операции деления по модулю. При делении по модулю выражение возвращает только остаток от деления как целое.

'Пример арифметических выражений со знаком "Mod"
8 Mod 2                             'возвращает значение 0;
5.1 Mod 3                           'возвращает значение 2;
6 Mod MyVar                         'если MyVar содержит 3, возвращает 0

Доступное для понимания объяснение этой математической операции приведено на одном из форумов программистов. Приведу цитату оттуда: «представь, что есть полная 50л канистра и 3л банка. И ты начинаешь вычерпывать из канистры банкой воду (набирать можно только полную банку). 48л вычерпал, осталось 2 литра. Это и есть остаток от деления 50 на 3 по модулю.» Другими словами 50 Mod 3 возвращает 2.

Тип данных результата выражения деления по модулю — это Integer или Long. VBA использует наименьший тип, который подходит для результата выражения.

Возведение в степень

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

'Пример арифметического выражения со знаком "^"
3 ^ 3                   'это то же, что и 3*3*3, возвращает значение 27

Понравилась статья? Поделить с друзьями:
  • Целая с дробью в excel
  • Цветок для microsoft word
  • Цветовые темы для excel
  • Цветовые схемы для word
  • Цветовые значения в excel