Svinkovod.ru

Бытовая техника
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

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

Dim nMyAge As Integer

nMyAge = nMyAge + 10

Перед работой с переменной настоятельно рекомендуется ее объявить. Объявление переменной в нашем примере выглядит так:

Dim nMyAge As Integer

Как расшифровать эту строку:

Dim — это область видимости переменной. В VBA предусмотрено 4 ключевых слова для определения области видимости переменных:

  • Dim — используется в большинстве случаев. Если переменная объявлена как Dim в области объявлений модуля, она будет доступна во всем модуле, если в процедуре — только на время работы этой процедуры;
  • Private — при объявлении переменных в VBA значит то же, что и Dim;
  • Public — такая переменная будет доступна всем процедурам во всех модулях данного проекта, если вы объявили ее в области объявлений модуля. Если вы объявили ее внутри процедуры, она будет вести себя как Dim/Private;
  • Static — такие переменные можно использовать только внутри процедуры. Эти переменные видны только внутри процедуры, в которой они объявлены, зато они сохраняют свое значение между разными вызовами этой процедуры. Обычно используются для накопления каких-либо значений. Например:

Static nVar1 As Integer

nVar1 = nVar1 + 1

Если нет никаких особых требований, то есть смысл всегда выбирать область видимости Dim.

Второе слово в нашем объявление (nMyAge) — это идентификатор (проще говоря, имя) переменной. Правила выбора имен в VBA едины для многих элементов (переменные, константы, функции и процедуры и т.п.). Имя:

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

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

  • имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
    • str (или s) — String, символьное значение;
    • fn (или f) — функция;
    • c (или сделать все буквы заглавными) — константа;
    • b — Boolean, логическое значение (true или false);
    • d — дата;
    • obj (или o) — ссылка на объект;
    • n — числовое значение.
    • в ранних версиях VB не было слова Const — все константы определялись как переменные, а для отличия их записывали заглавными буквами, между словами ставили подчеркивания:

    Многие программисты используют такой подход для обозначения констант и сейчас (но использование ключевого слова Const теперь обязательно — об этом будет рассказано в следующем разделе).

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

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

    • числовые (byte — целое число от 0 до 255, integer — целое число от -32768 до 32767, long — большое целое число, currency (большое десятичное число с 19 позициями, включая 4 позиции после запятой), decimal (еще большее десятичное число с 29 позициями), single и double — значение с плавающей запятой (double в два раза больше));

    Внимание! Попытка объявить переменную с типом Decimal (например, Dim n As Decimal) приведет к синтаксической ошибке. Чтобы получить возможность работать с типом Decimal, переменную нужно изначально объявить как Variant или вообще объявить без типа (Dim n), поскольку тип данных Variant используется в VBA по умолчанию.

    • строковые (string переменной длины (до примерно 2 млрд символов) и фиксированной длины (до примерно 65400 символов);
    • дата и время (date — от 01.01.100 до 31.12.9999);
    • логический (boolean — может хранить только значения True и False);
    • объектный (object — хранит ссылку на любой объект в памяти);
    • Variant — специальный тип данных, который может хранить любые другие типы данных.

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

    Некоторые моменты, связанные с выбором типов данных для переменных:

    • общий принцип — выбирайте наименьший тип данных, который может вместить выбранные вами значения. Если есть какие-то сомнения — выбирайте больший тип данных во избежание возникновения ошибок;
    • если есть возможность, лучше не использовать типы данных с плавающей запятой (single и double). Работа с такими типами данных производится медленнее, кроме того, могут быть проблемы при сравнениях за счет округлений;
    • если есть возможность, лучше не пользоваться типом Variant. Этот тип все равно приводится VBA к одному из других типов, но памяти для него требуется больше. Кроме того, в ходе такого неявного образования могут возникнуть ошибки;
    • при определении переменных можно использовать так называемые символы определения типа (% — integer, $ — String и т.п.). Например, в нашем примере нужно закомментировать строку Dim nVar 1 As Integer, а во второй строке написать:

    Такой подход является устаревшим и к использованию не рекомендуется.

    При объявлении переменных можно и не указывать ее тип. Например, наше объявление может выглядеть так:

    В этом случае переменная будет автоматически объявлена с типом Variant.

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

    nVar1 = nVar1 + 1

    будет вполне работоспособным. Если мы используем переменную в программе без ее объявления, то будет автоматически создана новая переменная типа Variant. Однако объявлять переменные нужно обязательно! И при этом желательно явно указывать нужный тип данных. Почему:

    • сокращается количество ошибок: программа с самого начала откажется принимать в переменную значение неправильно типа (например, строковое вместо числового);
    • при работе с объектами подсказка по свойствам и методам действует только тогда, когда мы изначально объявили объектную переменную с нужным типом. Например, в Excel два варианта кода будут работать одинаково:

    Dim oWbk As Workbook

    Set oWbk = Workbooks.Add()

    Set oWbk = Workbooks.Add()

    Но подсказка по свойствам и методам объекта oWbk будет работать только во втором случае.

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

    а можно вставлять эту команду во все модули при их создании автоматически — установив в окне редактора кода флажок Require Variable Declarations (меню Tools -> Options, вкладка Editor).

    Проиллюстрировать, зачем они это делают, можно на простом примере:

    С виду код не должен вызывать никаких проблем и просто выводить в окне сообщения единицу. На самом деле он выведет пустое окно сообщения. Причина спрятана очень коварно: в третьей строке n — это вовсе не английская буква N, а русская П. На вид в окне редактора кода отличить их очень сложно. В то же время компилятор VBA, встретив такой код, просто создаст новую переменную с типом данных Variant, у которой будет пустое значение. На выявление такой ошибки может потребоваться определенное время.

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

    Можно объявить несколько переменных в одной строке, например, так:

    Dim n1 As Integer, s1 As String

    Присвоение значений переменным выглядит так:

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

    nVar1 = nVar1 + 1

    В обоих примерах знак равенства означает не "равно", а присвоить.

    При присвоении значений переменным нужно помнить о следующем:

    • строковые значения всегда заключаются в двойные кавычки:
    • значение даты/времени заключаются в "решетки" — символы фунта:

    Обратите внимание, что при присвоении значения даты/времени таким "явным способом" нам придется использовать принятые в США стандарты: 05 в данном случае — это месяц, 06 — день. Отображение же этого значения (например, в окне сообщения) будет зависеть от региональных настроек на компьютере пользователя.

    Если нужно передать шестнадцатеричное значение, то перед ним ставятся символы &H:

    Создание и использование именованных констант

    Как правило, мы часто пользуемся различными константами. Например, ставка НДС, налог на прибыль, различные математические константы и прочее. Как мы поступаем, чтобы их использовать? Мы берем отдельный лист, вносим туда эти константы и ссылаемся на них в лучшем случае закрепляя при этом ссылки на эти ячейки.

    Минусы данного способа очевидны:

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

    Решение

    Избавится от этого можно путем создания именованных констант. Например, создадим константу под именем НДС. Для этого:

    1. Перейдите на вкладку Формулы. Найдите группу Определенные имена и выберите команду Присвоить имя. Откроется диалоговое окно Создание имени.

    Присвоение имени

    1. Введите имя константы в поле Имя. В нашем случае это НДС.
    2. В поле Область следует указать значение Книга. В этом случае выбранная переменная будет доступна на всех листай файла Excel. Если необходимо, чтобы константа работала только на конкретном листе, следует выбрать название нужного листа.
    3. В поле Примечание можно указать любой текст при необходимости.
    4. В поле Диапазон введите значение константы =18% не ссылаясь на ячейки и нажмите кнопку ОК.

    Создание именованной константы в Excel

    Теперь на любом листе формула =НДС будет выдавать одинаковый результат 0,18. Теперь давайте используем нашу переменную и посчитаем, например, стоимость товара без НДС (пусть стоимость с НДС будет 18000). Для этого введем в ячейку следующую формулу =18000/НДС. В итоге ячейка примет значение 10 000. Согласитесь, что формула стала намного понятней, нежели вместо НДС была указана ссылка на некую ячейку (да еще на другом листе).

    Вставка именованной константыЧтобы вставить именованную константу в формулу не обязательно помнить ее точный синтаксис. Для удобства клавишей F3 можно вызвать список констант и выбрать ее из формы Вставка имени. Также это окно можно вызвать перейдя на вкладку Формулы -> Определенные имена -> Использовать в формуле.

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

    Значения констант можно менять по ходу работы. Для этого необходимо открыть окно диспетчера имен Формулы -> Определенные имена -> Диспетчер имен.

    Диспетчер имен в Excel

    Выберите переменную и нажмите кнопку Изменить. Введите новое значение переменной, закройте диспетчер имен. Excel заново пересчитает все все значения связанные с данной константой.

    Microsoft Excel/Visual Basic for Applications в Excel/Переменные и константы. Арифметические и логические выражения

    Для того, чтобы войти в надстройку Visual Basic for Applications и использовать её, нажмите Alt+F11 (более универсальный вариант) или выберите команду Вид → Макросы (→ Макросы) → Создать. При этом в поле «Находится в» должно стоять значение «Эта книга» (текущая открытая книга) или «Название_имеющейся_книги», чтобы надстройка могла быть связана с данной книгой, используемой в настоящий момент.

    Пусть мы создали макрос с именем My в книге Книга1. Появится окно редактирования и отладки программ, приведённое на рис. 3. В папке Modules мы увидем компонент Module1, в котором находится процедура My. Первоначально тело процедуры не заполнено и вся процедура выглядит так:

    Мы создали модуль Module1, содержащий процедуру My, который можно использовать в любой книге. Мы можем также создать модуль внутри данной книги. Для этого необходимо два раза нажать на меню «ЭтаКнига» («ThisWorkbook»). Создадим внутри книги процедуру Hello_World, которая выводит типичное для программистов сообщение «Hello World!» (по-русски — «Здравствуй, мир!») В поле General (Общая область) введём следующий код:

    Выполним программу. Для этого необходимо нажать клавишу F5 либо кнопку со стрелкой на панели инструментов Visual Basic. На экране мы увидим окно с надписью Hello World! и кнопкой ОК. Нажмём ОК — окно исчезнет, программа завершит свою работу и мы вернёмся в окно редактирования Visual Basic.

    Переменные [ править ]

    Ситуация с переменными в VBA похожа на ситуацию в языке программирования Pascal. Однако в Visual Basic, в отличие от Паскаля, можно не объявлять переменные до начала их использования в программе. VBA сам определяет тип переменной, когда встречает её в программе. Однако это не оптимальный вариант. Прежде всего, программа будет работать медленнее. Более того, если будет ошибка в имени переменной, то Visual Basic создаст новую переменную, а не выведет сообщение об ошибке. Для того чтобы нельзя было использовать переменных без их описания, мы должны в начало программы поместить оператор Option Explicit. Если после этого VBA обнаружит не объявленную ранее переменную, то на экран будет выведено сообщение «Variable not defined» («Переменная не определена»).

    Описание переменных задаётся следующим образом: Dim <имя_переменной> As <тип_переменной>

    В примере 3 было объявление нескольких переменных в одной строке

    Типы переменных [ править ]

    • Boolean (логический тип). Только два значения: True или False. 2 байта
    • Byte (байтовый). Целые числа в диапазоне от 0 до 255. 1 байт
    • Integer (целый). Целочисленные значения в диапазоне от -32768 до +32767. 2 байта
    • Long (длинное целое). Целочисленные значения в диапазоне от -2147483648 до +2147483647. 4 байта
    • Single (числа с плавающей точкой одинарной точности). Численные значения в диапазоне от -3,402823E+38 до +3,402823E+38. 4 байта
    • Double (числа с плавающей точкой двойной точности). Значения в диапазоне от -1,797693313486232D+308 до +1,797693313486232D+38. 8 байт
    • Currency (денежный). Денежные значения от -$922337203685477,5808 до $922337203685477,5808. 8 байт
    • Date/Time (дата/время). Значения даты и времени. Дата может находиться в диапазоне от 1 января 100 года до 31 декабря 9999 года. 8 байт
    • String (строковый). Строки, состоящие из 0-654000 алфавитно-цифровых символов. 1 байт на символ
    • Variant (общий). Для всех типов данных. 16 байт

    Преобразование типов [ править ]

    Для преобразования переменных одного типа в переменные другого типа есть набор функций с названиями, которые образуются следующим образом: (буква C — латинская)
    C<полное или сокращённое имя типа>

    После выполнения данного кода на экран выведется число 42.

    Таблица функций преобразования типов:

    CboolПреобразование к типу Boolean
    CCurПреобразование к типу Currency
    CDateПреобразование к типу Date
    CLngПреобразование к типу Long
    CDblПреобразование к типу Double
    CIntПреобразование к типу Integer
    CSngПреобразование к типу Single
    CStrПреобразование к типу String

    Оператор присваивания. Арифметические и логические выражения [ править ]

    Оператором присваивания в языке Visual Basic, как и во многих других языках, является знак = (равно), а не := , как в языке Pascal.

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

    +сложение
    вычитание
    *умножение
    /деление
    деление нацело
    Modцелочисленный остаток от деления

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

    Значение первого выражения будет True, а второго — False.

    Константы [ править ]

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

    Общий вид описания констант: Const <имя константы> = <выражение>

    Пример использования константы:

    Visual Basic задаёт тип константы автоматически в зависимости от значения выражения. Если необходимо задать конкретный тип константы, то используется следующая структура:
    Const <имя константы> As <имя типа> = <выражение>

    Пример задания типа константы:

    Константы можно определять через константы, определённые ранее:

    Операторы ввода и вывода [ править ]

    Как уже упоминалось выше, MsgBox — процедура, которая используется для вывода информации на экран. Единственный параметр строкового типа — сообщение, которое необходимо вывести на экран. Тем не менее, если в качестве параметра указана переменная другого типа, то VBA сам преобразует её в тип строки. Нужно помнить, что процедура принимает ровно один параметр, то есть в процедуре MsgBox не может быть более одной переменной в списке вывода.

    Чтобы вынести несколько переменных, их нужно преобразовать к строковому типу и объединить в одну строку путём конкатенации (сложения) строк. Для сложения строк мы можем использовать как знак &, так и знак +, как в языке Pascal.

    Например, следующая процедура

    выведет на экран текст «Товар стоит 1000 рублей».

    Чтобы, наоборот, ввести информацию, мы можем использовать функцию InputBox(<текст>). В качестве параметра <текст> указывается строка — тот текст, который мы хотим видеть в окне ввода качестве подсказки.

    Задачи [ править ]

    Задача 1 [ править ]

    С клавиатуры вводится число типа Double. Вычислить косинус данного числа в градусах и вывести ответ на экран в виде: Cos <число> градусов = <результат> . Например, при вводе числа 60 результат равняется 0.5. Для ввода константы Pi (Пи) воспользуетесь выражением: WorksheetFunction.Pi

    Задача 2 [ править ]

    С клавиатуры вводится целое четырёхзначное число. Найти сумму его цифр и вывести ответ в виде: Сумма цифр <число> равняется <результат>

    Задача 3 [ править ]

    С клавиатуры вводятся две строки. Вывести на экран слово False, если хотя бы одна из строк пустая, либо если первая строка больше второй, и слово True во всех остальных случаях.

    Чтение и запись значения ячейки в VBA

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

    Обращение к конкретной ячейке

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

    Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:

    • С помощью Range
    • С помощью Cells

    Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1

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

    Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе

    Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).

    Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.

    Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.

    Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.

    Чтение значения из ячейки

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

    • Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
    • Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
    • Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».

    По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.

    Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

    Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

    При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.

    Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

    Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

    Запись значения в ячейку

    Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

    Пример 8: Записать в ячейку A1 активного листа значение 123,45

    Все три строки запишут в A1 одно и то же значение.

    Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года

    В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.

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

    голоса
    Рейтинг статьи
    Читайте так же:
    Как восстановить несохраненный документ word 2016
Ссылка на основную публикацию
Adblock
detector