- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
VBA для чайников - Стив Каммингс
Шрифт:
Интервал:
Закладка:
В VBA есть целый ряд встроенных функций для преобразования одних типов данных в другие. Эти функции рассматриваются в главе 11 и с их помощью вы можете управлять такими преобразованиями. Но важно знать, что всегда, когда это следует из контекста, VBA автоматически конвертирует данные к подходящему типу. Например, если в выражении участвуют строка, состоящая только из цифр, и числовое значение, связанные знаком операции +, то к числовому значению будет прибавлено число, определяемое строкой. Точно так же, если присвоить целой переменной значение с десятичными знаками, то VBA автоматически округлит это значение.
Часто такие автоматические преобразования типов вполне соответствуют тому, что вам нужно. Но основная проблема здесь состоит в том, что даже если вы позаботитесь о явном объявлении типов данных для всех своих переменных, вероятность появления ошибок не исчезает как раз из-за стремления VBA предугадать ваши желания.
Тип Variant
Тип Variant обеспечивает "безразмерный" контейнер для хранения данных. Переменная этого типа может хранить данные любого из допустимых в VBA типов, включая числовые значения, строки, даты и объекты. Более того, одна и та же такая переменная в одной и той же программе в разные моменты может хранить данные различных типов. Например, следующий фрагмент программного кода вполне допустим (хотя вряд ли продуктивен):
Dim varЧтоУгодно As Variant
varЧтоУгодно = 3
varЧтоУгодно = "Я полагаю."
varЧтоУгодно =#12/31/99 11:59:59 РМ#
VBA не только допускает такой набор операторов, но еще и помнит, данные какого типа вы помещаете в переменную типа Variant. Например, после выполнения последнего из приведенных выше операторов varЧтоУгодно будет идентифицироваться как переменная типа Variant/Date. Выяснить, данные какого типа хранятся в переменной типа Variant в данный момент, можно с помощью функции VBA TypeName. Например, если бы предыдущий фрагмент программного кода продолжался оператором
strVariantType = TypeName (varЧтоУгодно)
то значением переменной strVariantType было бы Date, поскольку данные именно такого типа находятся в varЧтоУгодно.
Благодаря такой своей гибкости переменные типа Variant очень удобны. Вместо того чтобы заботиться об использовании конкретных типов данных, можно всем переменным назначить тип Variant, и тогда в них легко помешать данные любых типов. Однако такой подход тоже имеет свои недостатки, о которых уже говорилось в разделе "Использование конкретного типа данных по сравнению с типом Variant: за и против".
Но даже если вы назначите конкретные типы данных всем своим переменным, переменные типа Variant не утратят своей роли хотя бы как черновые переменные для простых вычислений в небольших процедурах. А в VBA 5 и VBA 6 такие переменные придется использовать, если вам потребуется максимально допустимая в VBA точность вычислений (подробности - в следующем разделе).
Выбор числового типа данных
Если назначить переменным определенные типы данных, а не тип Variant, и при этом в каждом конкретном случае выбрать наиболее подходящий тип данных, то программа будет выполняться быстрее, будет меньше по объему и, возможно, вероятность ее правильной работы будет выше. Ясно, что переменная должна занимать в памяти объем, достаточный для хранения любого из возможных для нее значений, а все сверх этого - пустая трата памяти.
Например, если в программе требуется одна переменная для хранения информации о дне недели (диапазон возможных значений от 1 до 7) и одна переменная для числа месяца (диапазон 1-31), то вполне достаточными для этого будут переменные типа Byte, позволяющие хранить числовые значения в диапазоне от 0 до 255. Если же для работы вам нужны 365 дней в году, придется использовать переменную типа Integer.
Диапазоны допустимых значений для переменных каждого из допустимых в VBA типов данных были приведены в табл. 7.1. Вот еще несколько советов об использовании некоторых типов данных.
* Для хранения целых чисел (т.е. не имеющих дробной части) используйте переменные типов Boolean, Byte, Integer или Long.
* Используйте переменные типов Single или Double, чтобы хранить числа с плавающей запятой и показателем степени, имеющие до 15 значащих цифр. Хотя в этом случае диапазон допустимых значений просто огромен, не упускайте из виду возможность ошибок округления, когда выполняются операции со значениями, сильно отличающимися по порядку. Чтобы присвоить, например, значение 4,72X10-22 переменной типа Single или Double, используйте следующий формат (когда знак + или - после буквы Е пропущен, VBA считает показатель экспоненты положительным):
sngFloating = 4 . 7 2Е-2 2
Если требуется еще более высокая точность вычислений, тип данных Currency обеспечит 19 значащих цифр, а тип данных Decimal - все 29 (эти типы данных в своих представлениях чисел не используют экспоненты). Однако в настоящей версии VBA Decimal не является самостоятельным типом данных- это значит, что нельзя объявить переменную типа Decimal, а тип данных Decimal существует только как возможное значение для типа Variant. Чтобы поместить в переменную типа Variant числовое значение не как значение с плавающей запятой, а как значение типа Decimal, используйте в операторе присваивания функцию CDec.
Вот пример того, как это реализовать (обратите внимание, что для функции CDec значения с большим количеством значащих цифр придется представлять в виде строк):
Dim decvar Pi As Variant
decvar Pi = CDec("3.1415926535897932384626433833" )
Если в программе выполняются вычисления с использованием значений некоторых переменных, то тип данных этих переменных должен быть достаточно емким, чтобы хранить результат вычисления, даже если этим переменным сам результат и не присваивается. Для примера внимательно ознакомьтесь со следующим фрагментом программного кода:
Dim bytBytei As Byte
Dim bytByte2 As Byte
Dim intInteger As Integer
byuBytel = 255 ' максимальное значение для типа Byte
bytByte2 = 1
intInteger = bytBytei + bytByte2 ' ошибка!
Здесь, несмотря на то, что переменная intInteger вполне допускает хранение значения, соответствующего результату вычисления, в последней строке этого фрагмента программного кода VBA зафиксирует ошибку переполнения. Чтобы вычисления выполнялись, необходимо в данном случае хотя бы вместо одной из переменных типа Byte использовать переменную типа Integer.
Когда использовать логические переменные
Переменные типа Boolean могут хранить только два значения: True (в числовом представлении это 1) или False (0). Используйте переменные типа Boolean, когда нужно выяснить, какое из двух альтернативных условий имеет место в данный момент. Например, можно использовать переменную boolВключенс, которая должна принимать значение True (Истина), когда что бы то ни было, к чему переменная относится, включено, и значение False (Ложь), когда это нечто выключено.
Другим полем для использования переменных типа Boolean является определение констант со значениями True и False. Тогда имена переменных могут быть вполне нейтральными, а вот константы должны явно указывать на существование двух альтернатив для этих переменных. В общем, проще показать пример, чем пытаться объяснить:
Dim boolПузо As Boolean
Const Прикрыто As Boolean = True
Const Видно As Boolean = False
If boolПузо = Видно Then
НемногоПощекотать
End If
Вот вам один просто замечательный совет! Чтобы переключить на противоположное значение переменной или свойства объекта типа Boolean, используйте ключевое слово Not. Например, в Word вы можете включить или отключить отображение на экране схемы документа с помощью такой строки программного кода:
ActiveWindow. Docurr.entMap = Not ActiveWindow. DocumentMap
Работа с денежными значениями
Главная цель использования типа данньк Currency (Денежный)- получение точного результата. Хотя типы данных Single и Double с плавающей запятой и могут хранить числа с дробной частью - какими обычно бывают денежные значения - вычисления, выполняемые над числами с плавающей запятой, часто порождают небольшие ошибки, а это заставляет сильно нервничать тех, кто занят подсчетом денежных знаков.
Адаптация к местному формату представления денежных величин
Одна из сильных сторон VBA - это возможность автоматической настройки форматов представления дат и денежных величин в соответствии с местными стандартами. В правильно построенную программу вам не придется включать символы типа S, Г или J - VBA добавит именно тот символ, который нужен, основываясь на выборе языка и страны, которые были сделаны с помощью панели управления Язык и стандарты в Windows.
Рассмотрим, например, следующий фрагмент программного кода:
Const ccurMoneyTalks As Currency = 5463.72
MsgBox format ( ccur MoneyTalks, "Currency")
В результате выполнения этого фрагмента в США в окне сообщения появится
$5,463/72, а та же программа во Франции отобразит 5463, 72F.
Используемая здесь функция Format достаточно подробно рассматривается в главе 31.
Чтобы отобразить содержимое переменной в виде правильно представленного денежного значения, совсем не обязательно объявлять эту переменную переменной типа Currency. Функция Format с именованным форматом

