Разработка учебно-методического пособия VBA for EXCEL
учебно-методическое пособие по информатике и икт (9 класс)
Разработка позволит пройти обучение по данной теме. Расписаны уроки с заданиями и примерами макросов. Методическое пособие будет полезно обучающимся и студентам на уроках информатики.
Скачать:
Вложение | Размер |
---|---|
razrabotka_uch-met_posobiya_vba_ror_excel_.doc | 1018 КБ |
Предварительный просмотр:
РАЗРАБОТКА УЧЕБНО-МЕТОДИЧЕСКОГО ОБЕСПЕЧЕНИЯ ДЛЯ ДИСТАНЦИОННОГО ОБУЧЕНИЯ ПО ТЕМЕ «VBA FOR EXCEL» |
Содержание
Введение………………………………………………………………..…………3
1. Теоретические сведения
1.1.Урок №1. Функции записи макросов, знакомство с редактором VBA,
функции и процедуры…………………………………………………….….5
1.2.Урок №2. Создание и обработка форм. Окна ввода и вывода данных
InputBox, MsgBox……………………………………………………………16
1.3. Урок №3. Основы программирования на VBA . Операции ветвления,
выбора, циклы……………………………………………………………….21
1.4. Урок №4. Основные элементы рабочей книги и способы обращения к
ним на языке VBA…………………………………………………………..28
1.5. Урок №5. Сортировка многомерных массивов. Поиск элемента………..30
1.6. Урок №6. Алгоритмы обработки и статистики данных………………….34
1.7. Урок №7. Управление файлами……………………………………………57
2 Задачи для самостоятельной работы
2.1. Урок №1……………………………………………………………………...67
2.2. Урок №2………………………………………………………………….…..67
2.3. Урок №3……………………………………………………………………...68
2.4. Урок №5……………………………………………………………………...68
2.5. Урок №6……………………………………………………………………...69
2.6. Урок №7…………………………………………………………………...…70
3. Контрольные вопросы
3.1. Урок №1………………………………………………………………...........71
3.2. Урок №2…………………………………………………………………...…71
3.3. Урок №3………………………………………….…………………………..71
3.4. Урок №4………………………………………………..…………………….72
3.5. Урок №5……………………………………………….……………………..72
3.6. Урок №6…………………………………………………….………………..73
3.7. Урок №7…………………………………………………….……………….74
4. Приложение …………………………………………………………………..75
Заключение……………………………………………………………………….84
Список использованной литературы………………………………..………….85
Введение
Язык программирования VBA – один из существенных компонентов среды разработки пользовательских приложений. В нем предусмотрено немало интересных возможностей, которые находятся в глубинах, неведомых простому пользователю. Кроме того, некоторые хорошо известные средства можно использовать по-новому. Освоив этот универсальный язык программирования, вы не только получите ключ ко всем возможностям приложений Office и других, перечисленных ранее, но и будете готовы к тому, чтобы создавать полноценные приложения на Visual Basic и использовать все возможности языка VBScript.
Данное электронно-методическое обеспечение предназначено для дистанционного обучения «VBA for Excel» при проведении курсов в учебных центрах и при организации обучения на предприятиях. В работе рассмотрены 7 тем:
1.Функции записи макросов, знакомство с редактором VBA, функции и
процедуры.
2. Создание и обработка форм. Окна ввода и вывода данных InputBox,
MsgBox.
3. Основы программирования на VBA . Операции ветвления, выбора,
циклы.
4. Основные элементы рабочей книги и способы обращения к ним на языке
VBA
5. Сортировка многомерных массивов. Поиск элемента.
6. Алгоритмы обработки и статистики данных.
7. Управление файлами.
После изучения представленного материала учащиеся должны:
Урок №1: иметь понятие о макрорекордере, понятие макроса, знать принцип работы макрорекордера, создания макроса, функций и процедур, знать их типы.
Урок №2: иметь знания связанные с созданием и обработкой форм: элементы управления, панель инструментов и т.п. Уметь формировать окна ввода и вывода.
Урок №3: знать синтаксис и уметь использовать конструкции Go to, If-then, With-End With, Select Case, For Each Next в программировании.
Урок №4: иметь понятия об объектах Excel, их свойствах и методах.
Урок №5: знать способы сортировки многомерных массивов, поиска элемента с наименьшим и элемента наибольшим значением.
Урок №6: иметь понятие о типах данных, о константах; знать основные алгоритмы обработки информации: нахождение суммы значений диапазона ячеек; определение количества элементов в диапазоне ячеек, обладающих заданными свойствами (счетчик); определение максимального и минимального значений в диапазоне ячеек; сортировка элементов в диапазоне; подсчет количества диаграмм на листе; вычисление математического ожидания и дисперсии
Урок №7: иметь понятие атрибута файла; уметь создавать директории; копировать, перемещать, переименовывать и удалять файлы; проводить операции поиска файлов, копирования в файл, записи в файл.
В работе представлены практические работы по темам с порядком выполнения необходимых действий и их подробным объяснением, приводятся решения примеров с комментариями. Также предусмотрены контрольные вопросы и задания для самостоятельной работы. Все примеры в работе приведены для приложений Microsoft Office 2003 и Office XP.
1. Теоретические сведения
1.1. Урок №1.
Тема: «Функции записи макросов, знакомство с редактором VBA,
функции и процедуры»
Приобретаемые знания: понятие макрорекордера, принцип работы макрорекордера, понятие макроса, создание макроса. Общие сведения о редакторе, окна в редакторе. Функции и процедуры, их типы.
Основной материал:
- Функции записи макросов.
- Знакомство с редактором.
- Функции и процедуры.
1. Функции записи макросов
В большинство программ Microsoft Office встроено замечательное средство, которое позволяет создавать программы, вообще ничего не зная о программировании. Это средство называется макрорекордером.
Макрорекордер — это средство для записи макросов.
Макрос — всего лишь еще одно название для VBA-программы, а макрорекордер — средство для его автоматического создания.
Приложения Microsoft Office 2003 по умолчанию настроены так, что не позволяют запускать макросы. Поэтому перед тем, как приступать к созданию макросов, в меню Сервис | Макрос | Безопасность переставьте переключатель Уровень безопасности в положение Средняя или Низкая, а потом закройте и снова откройте данное приложение. Это потребуется сделать только один раз в начале работы. Принцип работы макрорекордера больше всего похож на принцип работы магнитофона: мы нажимаем на кнопку — начинается запись тех действий, которые мы выполняем. Мы нажимаем на вторую кнопку — запись останавливается, и мы можем ее проиграть (т. е. повторно выполнить ту же последовательность действий). Макрорекордер позволяет написать только самые простые VBA-программы. Однако и он может принести много пользы. Например, можно "положить" на горячие клавиши те слова, словосочетания, варианты оформления и т. п., которые вам часто приходится вводить (должность, название фирмы, продукт, ФИО директора и ответственного исполнителя и т. д.), этим вы сэкономите много времени.
Перед созданием макроса в макрорекордере:
- необходимо очень тщательно спланировать макрос, хорошо продумав, что вы будете делать и в какой последовательности. Если есть возможность, определите подготовительные действия. Например, если нужно вставить текущую дату в начало документа, может быть, имеет смысл первой командой макроса сделать переход на начало документа (
+ ); - посмотрите, нет ли готовой команды, которую можно сразу назначить клавише или кнопке на панели инструментов без создания макроса. Сделать это можно при помощи меню Сервис | Настройка. С вкладки Команды можно перетащить нужную команду на требуемую панель управления.
Чтобы создать макрос в макрорекордере (для тех программ Microsoft Office, для которых это средство предусмотрено, например, Word, Excel, PowerPoint, Project):
1. В меню Сервис | Макрос выберите команду Начать запись. В открывшемся окне Запись макроса (см.рис. 1.1 ) вам потребуется определить:
- Имя макроса. Правило такое: имя не должно начинаться с цифры, не должно содержать пробелы и символы пунктуации. Максимальная длина в Excel — 64 символа, в Word — 80 символов. Можно писать по-русски;
- будет ли макрос назначен кнопке на панели управления или комбинации клавиш. Где сохранить макрос. В Excel в вашем распоряжении текущая книга, возможность создать макрос одновременно с созданием новой книги и личная книга макросов PERSONAL.XLS (макросы из этой скрытой книги будут доступны во всех книгах).
- Описание. В это поле лучше ввести информацию о том, для каких целей создается этот макрос — это подарок не только для других пользователей, но и для себя (через несколько месяцев). (см.рис.1.1)
2. После нажатия кнопки OK или назначения кнопки или клавиатурной комбинации начнется запись макроса. Указатель мыши при этом примет вид магнитофонной кассеты и появится маленькая панель Остановить запись. На ней всего две кнопки — Остановить запись и Пауза. Если вы случайно закрыли эту панель, остановить запись можно через меню Сервис | Макрос | Остановить запись.
3. Самый простой способ запустить макрос, которому не назначена кнопка или клавиатурная комбинация, — в меню Сервис выбрать Макрос | Макросы (или нажать комбинацию клавиш
2. Знакомство с редактором
Во многих ситуациях макрорекордер очень удобен, но в реальной работе одним им обойтись невозможно. Слишком много не умеет делать макрорекордер: он не умеет проверять значения, чтобы в зависимости от этого выполнять какое-либо действие, не работает с циклами, не умеет перехватывать и обрабатывать ошибки. Он использует только ограниченный и не лучший набор объектов (например, при вводе текста в Word использует чувствительный к действиям пользователя объект Selection вместо более надежного объекта Range). Макросы, которые созданы в макрорекордере, очень ограничены с функциональной точки зрения. Полные возможности программирования в Office раскрываются при использовании редактора Visual Basic, и при серьезной работе без него не обойтись.
Во всех приложениях Office это делается одинаково:
- самый простой способ — в меню Сервис | Макрос выбрать Редактор
Visual Basic;
- самый быстрый способ — нажать клавиши
+ ; - можно также воспользоваться кнопкой на панели инструментов Visual
Basic (предварительно сделав ее видимой);
- можно вызвать редактор при возникновении ошибки в макросе;
- можно открыть готовый макрос для редактирования в диалоговом окне
Макрос.
В любом случае откроется окно, похожее на представленное на рис. 2.1. В окне редактора Visual Basic можно работать одновременно с работой в приложении, откуда этот редактор был вызван. Переход между окнами осуществляется через
Всего в редакторе Visual Basic предусмотрено 9 дополнительных окон:
- Project Explorer — окно проводника проекта. По умолчанию оно открыто и находится в левой части окна редактора Visual Basic. В нем можно просмотреть компоненты проекта и выполнить множество операций.
- UserForm — окно формы. Появляется тогда, когда вы редактируете пользовательскую форму при помощи дизайнера форм.
- Toolbox — панель инструментов управления. Из нее можно добавить элементы управления в форму или в сам документ.
- Properties — одно из самых важных окон. Через него можно просмотреть свойства элемента управления или компонента проекта и изменить их.
- Code — окно программного кода. В этом окне выполняется основная работа по написанию кода макроса. При открытии программного модуля открывается автоматически.
- Object Browser — обозреватель объектов. Необходим для получения информации о классах, доступных программе.
- Watch — окно контролируемых выражений. Используется во время отладки для отслеживания значений выбранных переменных программы и выражений.
- Locals — окно локальных переменных. Нужно для отслеживания во время отладки значений переменных текущей процедуры;
- Immediate — окно для немедленного выполнения команд в ходе отладки. Оно позволяет выполнить отдельные строки программного кода и немедленно получить результат.
Найти какое-либо окно можно очень просто: нужно выбрать в меню View одноименную команду, и если окно было скрыто, оно появится в редакторе. Рассмотрим по подробней следующие окна:
Окно проводника проекта (Project Explorer) и структура проекта VBA
Окно проводника проекта при первой активизации редактора Visual Basic обычно открыто. Если оно случайно было закрыто, то вызвать его можно тремя способами:
- нажать клавиши
+ ; - нажать кнопку Project Explorer на панели инструментов Standard;
- воспользоваться меню View | Project Explorer.
В окне Project Explorer представлено дерево компонентов вашего приложения VBA. Самый верхний уровень — это проект (Project), которому соответствует документ Word, рабочая книга Excel, презентация PowerPoint или другой файл, с которым работает данное приложение. Например, если вы открыли редактор Visual Basic из Word, то в Project Explorer будут представлены все открытые в настоящее время файлы Word и шаблон Normal.dot. Если редактор Visual Basic открыт из Excel, то в Project Explorer будут открытые книги Excel и специальная скрытая книга PERSONAL.XLS. Кроме того, что обычно содержится в документах Office (текст, рисунки, формулы и т. п.), каждый проект (который и является документом) — это одновременно и контейнер для хранения стандартных модулей, модулей классов и пользовательских форм. Добавить в проект каждый из этих компонентов можно при помощи меню Insert или через контекстное меню в Project Explorer.
Стандартный модуль — это просто блок с текстовым представлением команд VBA. В модуле этого типа может быть только два раздела:
- раздел объявлений уровня модуля (объявление переменных и констант уровня модуля);
- раздел методов модуля (расположение процедур и функций).
Модули классов позволяют создавать свои собственные классы — чертежи, по которым можно создавать свои объекты. Обычно модули классов используются только в очень сложных приложениях.
Пользовательская форма является одновременно хранилищем элементов управления и программного кода, который относится к ним, к самой форме и происходящими с ними событиями. Еще одна полезная возможность Project Explorer — настройка свойства проекта. Для этого нужно щелкнуть правой кнопкой мыши по узлу Project (VBAProject в Excel) и в контекстном меню выбрать Project Properties (окно свойств проекта можно открыть и через меню Tools | Project Properties).
В этом окне можно:
- изменить имя проекта. Это может потребоваться, если у вас есть ссылки на проект с таким же именем;
- ввести описание проекта, информацию о файле справки и параметры, которые будут использоваться компилятором;
- защитить проект, введя пароль. Не зная этот пароль, проект нельзя будет просмотреть или отредактировать.
Тем не менее в окне Project Explorer обычно приходится выполнять следующие действия. Если вам нужно создать свой макрос вручную, а макросов в данном документе еще нет, то нужно щелкнуть правой кнопкой мыши по узлу проекта (строке, выделенной полужирным шрифтом) и в контекстном меню выбрать команду Insert | Module. В проекте будет создан новый модуль и сразу открыт в окне редактора кода. Если вы уже создавали макросы в этом проекте (макрорекордером или вручную), то модуль будет уже создан. Его можно увидеть под контейнером Modules. Чтобы его открыть в окне редактора кода, достаточно щелкнуть по модулю два раза левой кнопкой мыши. Там можно будет найти макросы, созданные вами ранее средствами макрорекордера. Обязательно подумайте, где вам будет нужен создаваемый код — только в одном документе или во всех документах данного приложения. Если он будет нужен только в одном документе, используйте стандартный программный модуль этого документа. Если во всех, то используйте программные модули проекта PERSONAL.XLS (в Excel). Если вам нужно создать графическую форму с элементами управления (кнопками, текстовыми полями, раскрывающимися списками и т. п.), то нужно щелкнуть правой кнопкой мыши по узлу проекта и в контекстном меню выбрать Insert | UserForm. Новая форма будет создана и открыта в режиме дизайнера форм. Теперь, когда программный модуль создан (или найден), можно приступать к работе с редактором кода VBA.
Работа с редактором кода (Code Editor)
Как открыть редактор кода и как он устроен
В редакторе кода выполняется основная часть работы по программированию, поэтому знать приемы работы с ним нужно очень хорошо. Открыть окно редактора кода можно несколькими способами:
- дважды щелкнуть по объекту модуля в Project Explorer (или выделить его и нажать клавишу
); - выбрать нужный элемент (в Project Explorer, в дизайнере форм и т. п.) и в контекстном меню выбрать View Code;
- выделить нужный элемент и нажать клавишу
(альтернатива — команда меню View | Code).
Редактор программного кода — это, по сути, обычный текстовый редактор, и в нем вы можете вырезать и вставлять код, перетаскивать фрагменты кода, скопировать путем перетаскивания с нажатой клавишей
Список объектов и список событий
В верхней части окна редактора кода находятся два раскрывающихся списка. Слева находится список объектов. В нем вы можете выбрать объект, к которому будет относиться ваш код. Если вы открыли программный код модуля, то здесь будет только пункт General. Другое дело, если открыта форма, то в этом списке вы сможете выбрать саму форму или любой ее элемент управления и записать для него код.
Список справа — это список процедур и событий. В нем есть раздел Declarations — объявления уровня всего модуля и список всех процедур (макросов) для стандартного модуля или событий, если создается код для формы. При выборе нужного события будет автоматически создана нужная процедура, обрабатывающая это событие.
Закладки и разделение окна редактирования
Иногда в процессе написания программного кода в одном месте вам в голову приходит идея, относящаяся к другой части кода. Хочется перепрыгнуть в другое место, но разыскивать потом ту строку, где была прервана работа, очень не хочется. В этом случае опытные программисты используют закладки. Закладка (как и в случае с обычной книгой) — это метка, при помощи которой можно быстро найти нужное место. Работа с закладками производится либо с панели инструментов Edit (ее вначале нужно сделать видимой), либо через меню Edit | Bookmark. Для того чтобы включить или отключить закладку, нужно установить указатель ввода на нужную строку и воспользоваться командой Toggle Bookmark.
Часто бывает очень удобным разделение окна редактирования на две части — для просмотра разных частей модуля, для копирования и т. п. Делается это при помощи линии разбивки — маленького бегунка над вертикальной полосой прокрутки.
Как редактор помогает писать код
В редактор кода встроено множество средств, которые облегчают жизнь разработчику. Рассмотрим самые важные из них.
Самое полезное средство — это получение списка свойств и методов.
Показ списка свойств и методов в редакторе Visual Basic включен по умолчанию. Пользоваться этой возможностью очень просто: достаточно напечатать имя переменной, представляющей объект, и поставить после него точку. Автоматически откроется список всех свойств и методов этого объекта.
В этом списке можно выбрать нужное свойство или метод (клавишами со стрелками или мышью, а если список большой, то можно набрать первые буквы имени свойства или метода), а затем нажать клавишу
Если показ списка свойств и методов у вас отключен, то включить его можно при помощи меню Tools | Options (флажок Auto List Members на вкладке Editor окна Options).
Редактор Visual Basic готов показать вам не только перечень всех свойств и методов, но и все параметры, которые принимает данный метод. Это свойство также работает автоматически: достаточно после имени метода напечатать пробел. Для того чтобы явно вызвать список всех параметров, можно воспользоваться меню Edit | Parameter Info или клавишами
Включить или отключить автоматический показ информации о параметрах можно при помощи флажка Auto Quick Info на той же вкладке Editor окна Options.
Список констант (допустимых значений для данного свойства) также появляется автоматически после того, как вы напечатаете знак равенства '='.
Можно воспользоваться также меню Edit | List Constants или комбинацией клавиш
Ключевые слова VBA и имена доступных в данный момент классов очень удобно вводить при помощи автоматического дополнения слов. Для этого достаточно выбрать меню Edit | Complete Word или нажать клавиши
Приведем еще несколько моментов, связанных с редактором кода:
- если вы напечатаете одну строку кода с отступом, то такой же отступ будет установлен для следующих строк. Изменить поведение можно при помощи параметра Auto Indent в диалоговом окне Options;
- если редактор кода распознает ключевое слово, он автоматически делает его первую букву заглавной и выделяет все слово синим цветом;
- часто бывает необходимо закомментировать или раскомментировать несколько строк сразу. Для этой цели можно включить отображение панели инструментов Edit и воспользоваться кнопками Comment Block и Uncomment Block;
- если при создании процедуры вы пишете ключевое слово Sub или Function, то редактор автоматически дописывает оператор End Sub или End Function. Между процедурами вставляется строка-разделитель;
- если при переходе на новую строку редактор кода обнаружит синтаксическую ошибку, то вам будет выдано предупреждение. Меня, например, такое поведение обычно сильно раздражает. Отменить протесты редактора можно, сняв флажок Auto Syntax Check в диалоговом окне Options. Работе это сильно не повредит, потому что синтаксически неверные строки в любом случае будут автоматически выделяться красным цветом;
- в редакторе кода вполне допускается работа сразу с несколькими окнами редактирования кода. Переход между ними осуществляется по клавишам
+ или + ; - по умолчанию редактор кода работает в режиме Full Module View — показ всего содержимого модуля. Если вы хотите просматривать процедуры по отдельности, переключитесь в режим Procedure View. Кнопки для переключения находятся в левом нижнем углу окна редактора кода.
3. Функции и процедуры
Процедуры — это самые важные функциональные блоки языка VBA. В VBA вы можете выполнить только тот программный код, который содержится в какой-либо процедуре (обычной в стандартном модуле, событийной для элемента управления на форме и т. п.).
В VBA предусмотрены следующие типы процедур:
- процедура типа Sub (подпрограмма) — универсальная процедура для выполнения каких-либо действий:
Sub Farewell()
MsgBox "Goodbye"
End Sub
- Макрос в VBA — это процедура типа Sub, не имеющая параметров. Только макросы можно вызывать по имени из редактора VBA или из приложения Office. Все другие процедуры нужно вызывать либо из других процедур, либо специальными способами, о которых будет рассказано далее;
- процедура типа Function (функция) — набор команд, которые должны быть выполнены. Принципиальное отличие только одно: функция возвращает вызвавшей ее программе (или процедуре) какое-то значение, которое будет там использовано. Пример функции:
Function Tomorrow()
Tomorrow = DateAdd("d", 1, Date())
End Function
и пример ее вызова:
Private Sub Test1()
Dim dDate
dDate = Tomorrow()
MsgBox dDate
End Sub
В тексте функции необходимо предусмотреть оператор, который присваивает ей какое-либо значение. В нашем случае это строка:
Tomorrow = DateAdd("d", 1, Date())
В принципе, процедуры типа Sub тоже могут возвращать значения — при помощи переменных, передаваемых по ссылке. Зачем же тогда нужны функции? Все очень просто: функцию можно вставлять практически в любое место программного кода. Например, наш последний пример может выглядеть намного проще:
Private Sub Test1()
MsgBox Tomorrow()
End Sub
В VBA предусмотрены сотни встроенных функций (и гораздо большее количество функций предусмотрено в объектных моделях приложений Office). Даже в нашем примере используются две встроенные функции: Date(), которая возвращает текущую дату по часам компьютера, и DateAdd(), которая умеет прибавлять к текущей дате определенное количество дней, недель, месяцев, лет и т. п.
В VBA имеются также процедуры обработки событий (event procedure) — процедуры типа Sub специального назначения, которые выполняются в случае возникновения определенного события, например, при открытии формы или нажатии на ней кнопки. Есть еще процедуры типа Property (процедуры свойства). Они нужны для определения свойств создаваемого вами класса.
Область видимости процедур
По умолчанию все процедуры VBA (за исключением процедур обработки событий) определяются как открытые (Public). Это значит, что их можно вызвать из любой части программы — из того же модуля, из другого модуля, из другого проекта. Объявить процедуру как Public можно так: Public Sub Farewell() или, поскольку процедура определяется как Public по умолчанию, то можно и так: Sub Farewell()
Можно объявить процедуру локальной: Private Sub Farewell(). В этом случае эту процедуру можно будет вызвать только из того модуля, в котором она расположена. Можно ограничить область видимости открытых процедур (тех, которые у вас определены как Public) в каком-то модуле рамками одного проекта. Для этого достаточно в разделе объявлений этого модуля вписать строку Option Private Module. Если при объявлении процедуры использовать ключевое слово Static, то все переменные в этой процедуре автоматически станут статическими и будут сохранять свои значения и после завершения работы процедуры. Например: Private Static Sub Farewell().
Объявление процедур
Объявить процедуру можно вручную, например, добавив в код строку:
Private Sub Farewell()
При этом редактор кода автоматически добавит строку End Sub и линию- разделитель. А можно объявить процедуру, воспользовавшись меню Insert | Procedure. Разницы нет никакой.
Передача параметров
Параметры — это значения, которые передаются от одной процедуры к другой. В принципе, можно обойтись и без параметров, воспользовавшись только переменными уровня модуля, но при использовании параметров читаемость программы улучшается. Чтобы процедура имела возможность принимать параметры, ее вначале нужно объявить с параметрами.
Пример: простая функция, которая складывает два числа и возвращает результат:
Function fSum(nItem1 As Integer, nItem2 As Integer)
fSum = nItem1 + nItem2
End Function
Ее вызов может выглядеть так:
MsgBox fSum(3, 2)
В данном случае мы объявили оба параметра как обязательные, и поэтому попытка вызвать функцию без передачи ей какого-либо параметра (например, fSum(3)) приведет к ошибке "Argument not optional" — "Параметр не является необязательным". Чтобы можно было пропускать какие-то параметры, их нужно сделать необязательными. Для этой цели используется ключевое слово Optional:
Function fSum(nItem1 As Integer, Optional nItem2 As Integer)
В справке по встроенным функциям VBA необязательные параметры заключаются в квадратные скобки. Для проверки того, был ли передан необязательный параметр, используется либо функция IsMissing (если для этого параметра был использован тип Variant), либо его значение сравнивается со значениями переменных по умолчанию (ноль для числовых данных, пустая строка для строковых и т. п.). Вызов функции с передачей параметров может выглядеть так:
nResult = fSum(3, 2)
Однако здесь есть несколько моментов, которые необходимо рассмотреть. В нашем примере мы передаем параметры по позиции, т. е. значение 3 присваивается первому параметру (nItem1), а значение 2 — второму (nItem2). Однако параметры можно передавать и по имени:
nResult = fSum(nItem1 := 3, nItem2 := 2)
Обратите внимание, что, несмотря на то, что здесь выполняется вполне привычная операция — присвоение значений, оператор присваивания используется не совсем обычный — двоеточие со знаком равенства (:=), как в C++. При использовании знака равенства возникнет ошибка. Конечно, вместо явной передачи значений (fSum(3, 2)) можно использовать переменные. Однако что произойдет с переменными после того, как они "побывают" в функции, если функция изменяет их значения? Останутся ли эти значения за пределами функции прежними или изменятся?
Все зависит от того, как именно передаются параметры: по ссылке (по умолчанию, можно также использовать ключевое слово byRef) или по значению (ключевое слово byVal). Если параметры передаются по ссылке, то фактически в вызываемую процедуру передается ссылка на эту переменную в оперативной памяти. Если эту переменную в вызываемой процедуре изменить, то значение изменится и в вызывающей функции. Это принятое в VBA поведение по умолчанию. Если параметры передаются по значению, то фактически в оперативной памяти создается копия этой переменной и в вызываемую процедуру передается эта копия. Конечно же, чтобы вы не сделали с копией, на исходную переменную это никак не повлияет и в вызывающей процедуре не отразится. Продемонстрировать разницу можно на простом примере:
Private Sub TestProc()
'Объявляем переменную nPar1 и присваиваем ей значение
Dim nPar1 As Integer
nPar1 = 5
'Передаем ее как параметр nItem1 функции fSum
MsgBox fSum(nItem1:=nPar1, nItem2:=2)
'А теперь проверяем, что стало в нашей переменной nPar1
'после того, как она побывала в функции fSum
MsgBox nPar1
End Sub
Function fSum(nItem1 As Integer, nItem2 As Integer)
'Используем значение переменной
fSum = nItem1 + nItem2
'А затем ее меняем!
nItem1 = 10
End Function
Проверьте, что будет, если поменять строку объявления функции:
Function fSum(nItem1 As Integer, nItem2 As Integer)
на другую: Function fSum(byVal nItem1 As Integer, nItem2 As Integer)
Можно продемонстрировать компилятору VBA, что значение, возвращаемое функцией, нас совершенно не интересует. Для этого достаточно не заключать ее параметры в круглые скобки. Например, для нашей функции это может выглядеть так: fSum 3, 2.
Такой код будет работать совершенно нормально. Однако если нам потребуется все-таки узнать, что возвращает функция, то придется передаваемые ей параметры заключать в круглые скобки: nResult = fSum(3, 2)
Для многих встроенных функций компилятор VBA в принципе не дает возможности игнорировать возвращаемое значение, заставляя помещать параметры в круглые скобки и принимать возвращаемое значение. В противном случае он сообщает о синтаксической ошибке.
Вызов и завершение работы процедур
С примерами вызова процедур и функций из кода мы уже сталкивались. Для этого достаточно записать имя процедуры или функции, передать ей необходимые параметры, а для функции еще и принять возвращаемое значение. Одни процедуры можно вызывать из других процедур. Но как дать пользователю возможность запустить самую первую процедуру? В нашем распоряжении следующие возможности:
- создать макрос (т. е. специальную процедуру, не принимающую параметров, в модуле NewMacros) и запустить его по имени, кнопке или комбинацией клавиш. Макрос затем может вызывать и другие процедуры;
- создать форму и воспользоваться набором событий этой формы и элементов управления на ней (об этом будет рассказано в гл. 5) или просто элементом управления на листе Excel или документе Word;
- назначить процедуре специальное имя (AutoExec(), AutoNew() и т. п.). Полный список таких специальных имен можно посмотреть в документации. Правда, поскольку раньше эти возможности активно использовались вирусами, в Office 2003 по умолчанию эти макросы запускаться не будут. Для того чтобы обеспечить им (и многим другим макросам) возможность запуска, необходимо изменить установленный уровень безопасности в меню Сервис | Макрос | Безопасность или обеспечить цифровые подписи для ваших макросов;
- вместо специального имени для макроса использовать событие: например, событие запуска приложения, событие открытия документа и т. п. Это рекомендованный Microsoft способ обеспечения автоматического запуска программного кода.
- можно запустить приложение из командной строки с параметром /m и именем макроса, например: winword.exe /mMyMacros
- Очень удобно в этом случае использовать ярлыки, в которых можно указать этот параметр запуска. В VBA вполне допустима ситуация, когда функция запускает на выполнение саму себя. Однако подобных вызовов лучше избегать (по возможности заменяя их на циклы). Причина — проблемы с читаемостью и возможное (в случае бесконечного запуска) исчерпание оперативной памяти (переполнение стека), чреватое серьезными системными ошибками. Для завершения выполнения процедуры в VBA предусмотрены конструкции End и Exit. Синтаксис их очень прост:
- Exit Sub, End Sub. Делают они одно и то же — завершают работу текущей процедуры. Однако используются в разных ситуациях:
- оператор End — это завершение работы процедуры после того, как все сделано. После оператора End код процедуры заканчивается;
- оператор Exit — это немедленное завершение работы функции в ходе ее работы. Обычно помещается в блок оператора условного перехода, чтобы произвести выход, как только выяснилось, что функции по каким-то причинам дальше выполняться не нужно (например, дальше идет код обработчика ошибок).
1.2 . Урок №2
Тема: Создание и обработка форм. Окна ввода и вывода данных
InputBox и MsgBox
Приобретаемые знания: Приобретаются знания связанные с созданием и обработкой форм: элементы управления, панель инструментов и т.п. Окна ввода и вывода. Понятие сообщения, атрибуты.
Основной материал:
- Создание и обработка форм.
- Окна ввода и вывода данных InputBox и MsgBox
1. Создание и обработка форм
Объектно-ориентированное программирование позволяет создавать графический интерфейс разрабатываемых приложений на основе использования управляющих элементов. Элементы управления являются объектами. Поэтому, как любые объекты, они обладают свойствами, методами и могут откликаться на события. Элементы управления можно вставлять как в рабочие листы, так и в экранные формы. Экранные формы (их также называют пользовательскими формами, от англ. UserForm) — это окна (обычного вида либо диалоговые), являющиеся частью интерфейса приложения.
Работа с пользовательской формой состоит из нескольких этапов:
- Открыть или создать файл для работы;
- Перейти в редактор Visual Basic;
- Создать пользовательскую форму;
- Применить к созданной форме свойства;
- Создать в форме элементы управления; (см.рис.2.1.)
- Написать процедуры обработки событий.
При создании экранной формы автоматически отображается “Панель инструментов”(см.рис.2.3). “Панель инструментов” содержит элементы управления, которые можно использовать в экранной форме. Если панель инструментов не появилась при создании экранной формы, то вызвать элементы управления можно, используя команду View | ToolBox или нажав на кнопку .
“Панель инструментов” (или “Панель элементов управления”) предназначена для создания и редактирования объектов вашего приложения. При написании программ на VBA вы обязательно столкнетесь с английскими названиями элементов управления, поэтому в таблице даны русские и английские названия элементов управления.
Label (надпись) — статическая область текста, обычно содержащая какую-либо поясняющую информацию, а также это поле часто используют для вывода полученных результатов.
TextBox (поле) — элемент для ввода текста пользователем, который в последующем используется в программе.
CommandButton (кнопка управления) — элемент, с помощью которого в пользовательскую форму можно вставить командную кнопку. При нажатии на командную кнопку выполняются запрограммированные вами действия.
ListBox (список) — применяется для хранения списка значений. В списке пользователь может выбрать одно или несколько значений, которые в дальнейшем используются в программе.
ComboBox (поле со списком) — применяется для хранения списка значений. Этот элемент сочетает возможности элементов ListBox и TextBox.
ScrolBar (полоса прокрутки) как элемент управления — это не совсем то, чем вы привычно пользуетесь для прокрутки, например, рабочего листа. В данном случае полосы прокрутки применяются в качестве механизмов выбора. В графических программах вы, наверное, видели, как с помощью полос прокрутки можно выбрать цвет либо сделать изображение более светлым или более темным.
SpinButton (счетчик) — используется для ввода или изменения числовых значений.
OptionButton (переключатель) — позволяет выбрать один из нескольких взаимоисключающих параметров или действий. Переключатели обычно отображаются группами, обеспечивая возможность альтернативного выбора.
CheckBox (флажок) — предоставляет пользователю возможность выбора. Флажок обычно имеет два состояния: установленное и сброшенное.
Togglebutton (выключатель) — кнопка, которая остается нажатой после щелчка на ней, и возвращается в исходное состояние после повторного щелчка.
Frame (рамка) — используется для визуального объединения каких-либо элементов управления в группу, показывая, что эти элементы связаны между собой.
Image (рисунок) — позволяет вставлять графические элементы в экранные формы. С помощью этого элемента можно вставлять изображения из графических файлов следующих типов: bmp; cur; gif; ico; jpg; wmf.
MultiPage (набор страниц) — этот элемент управления внешне похож на набор вкладок и также содержит одну или несколько страниц. Отличие между ними заключается в том, что страницы являются формами, содержащими собственные элементы управления (включая наборы вкладок), которые можно отформатировать всеми средствами форматирования экранных форм.
TabStrip (набор вкладок) — элемент управления, который содержит одну или несколько вкладок. Используется для организации в группы связанной информации.
RefEdit (поле со свертыванием) — этот элемент похож на обычное поле ввода, но имеет кнопку с правой стороны поля, которая сворачивает экранную форму, что позволяет легко выбрать любой диапазон ячеек на рабочем листе.
Для нашей работы мы будем использовать не все элементы управления. Наиболее часто используемыми являются:
- Label (надпись);
- TextBox (поле);
- CommandButton (кнопка управления);
- Image (рисунок);
- OptionButton (переключатель);
- CheckBox (флажок).
Для создания пользовательской формы надо выполнить следующие действия:
1. Открыть новый файл или любой файл, в котором вы уже работали.
2. Выполнить команду меню Сервис | Макрос | Редактор Visual Basic. Откроется окно редактора Visual Basic.
3. Щелкнуть на кнопке Insert UserForm панели инструментов окна редактора Visual Basic или выполнить команду Insert | UserForm (Вставка | Экранная форма)(см.рис.2.4).
Созданная экранная форма имеет по умолчанию строку с заголовком UserForm1. Сетка на макете формы помогает размещению элементов управления, при отображении формы в приложении сетка не видна. После создания формы необходимо просмотреть свойства этого объекта и изменить установки, если это требуется по условию задачи. Для отображения окна свойств надо выбрать команду View | Properties Window (Вид | Окно свойств) или щелкнуть по одноименной кнопке на панели инструментов (см.рис.2.5)
Используя панель элементов управления, из незаполненной формы можно сконструировать любое требуемое диалоговое окно. Размещение элементов управления в форме производится следующей последовательностью действий:
- Нажать значок того элемента, который вы хотите размеcтить в форме.
- Поместить указатель мыши на то место, где будет располагаться элемент управления.
- Нажать левую кнопку мыши и, не отпуская ее, растянуть появившийся прямоугольник до нужных размеров.
- Отпустить кнопку мыши, элемент создан.
В экранной форме можно также перемещать или изменять размеры элементов управления. Кроме того, можно изменить размеры и самой экранной формы, перетащив ее маркеры изменения размеров.
После успешного завершения разработки экранной формы можно просмотреть в действии полученный результат с помощью команды “Run | Run Sub/UserForm” (“Выполнить | Выполнить процедуру/экранную форму”) или нажать клавишу . Форма отобразится поверх текущей рабочей книги. Щелчок на кнопке “Закрыть” (находится в верхнем правом углу формы) закроет экранную форму и возвратит вас в редактор Visual Basic. Разрабатываемое на языке приложение называется проектом. Проект включает в себя не только форму с размещенными на ней управляющими элементами, но и программные модули обработки событий, которые описывают поведение объектов приложения и взаимодействие объектов между собой.
2. Окна ввода и вывода данных InputBox и MsgBox
- Окно сообщения
Функция для создания окна сообщений записывается так:
MsgBox (Сообщение [,Атрибуты] [,Заголовок]).
Сообщение — текст, отображаемый в диалоговом окне, является обязательным аргументом. Эта строка должна быть заключена в двойные кавычки. Текст может содержать до 1024 символов. Использование круглых скобок указывает на то, что в данном случае MsgBox является функцией, возвращающей значение.
Атрибуты определяют особенности окна, т.е. различные кнопки и значки, отображаемые в нем. Аргумент Атрибуты позволяет управлять следующими параметрами окна сообщения: количеством кнопок в окне, типом кнопок и их размещением в окне, пиктограммой, отображаемой в окне. Этот аргумент является целым числом и для достижения желаемого результата может быть представлен как сумма двух слагаемых:
Атрибуты = Параметр1 + Параметр2.
Значение Параметр1 устанавливает число и тип кнопок в окне сообщений. В таблице приведены возможные значения этого параметра(см.рис.2.5). Если аргумент Атрибуты не указан, то VBA предполагает, что в диалоговом окне сообщений присутствует только кнопка “ОК”. Значение Параметр2 определяет вид сообщения и пиктограмму, которая помещается в окно сообщений(см.рис.2.7)
Заголовок — строка в заголовке окна сообщений. Если этот аргумент опущен, то в строке заголовка отображается “Microsoft Excel”.
MsgBox как функция должна возвращать значение. Синтаксис функции MsgBox совпадает с синтаксисом одноименного оператора. Возвращаемое значение зависит от кнопки, нажатой пользователем. В таблице представлен список значений, возвращаемых функцией MsgBoх(см.рис.2.8).
- Окно ввода
Окно ввода, как и окно сообщений, может отображаться оператором или функцией. Функция InputBox применяется для ввода чисел или текста. Эта функция отображает диалоговое окно ввода, содержащее поле ввода и поясняющий текст; ее синтаксис таков:
InputBox(Сообщение[, Заголовок ] [, Умолчание]).
Сообщение — единственный обязательный аргумент; он служит подсказкой пользователю, какую информацию необходимо занести в поле ввода.
Заголовок — это надпись в строке заголовка окна ввода.
Умолчание — значение, которое будет отображаться в поле ввода по умолчанию, пока пользователь не введет свое значение. Если этот аргумент опустить, то поле ввода отображается пустым.
Возвращаемым значением данной функции является информация, вводимая пользователем. Возвращаемое значение можно использовать в окнах сообщений, поместить в ячейку рабочего листа, применить в вычислениях и т.д.
В отличие от MsgBox параметр Атрибуты отсутствует, но появляется параметр Умолчание: в нем задается строка, которая по умолчанию будет находиться в текстовом поле. При нажатии кнопки “ОК” содержимое поля присваивается переменной, а при нажатии на кнопку “Cancel” возвращается строка нулевой длины.
ВНИМАНИЕ! Функция InputBox возвращает строку, а функция MsgBox возвращает значение целого типа(см.рис.2.9).
- Объединение текстовых строк
При объединении нескольких текстовых строк в одну используется символ конкатенации “&” (амперсенд) или “+” (плюс). Можно объединять числовые и символьные значения.
Например: “Создание окон сообщений” (см.рис.2.10)
Private Sub CommandButton1_Click()
MsgBox "Очистить папку?", 32 + 4, "Очистка папки"
MsgBox "У Вас заканчиваются деньги!",
48, "Предупреждение"
MsgBox "До конца работы осталось 30 минут", 64,
"Информационное сообщение"
MsgBox "Спасите наши души!!!", 18, "SOS"
End Sub
1.3. Урок№3
Тема: Основы программирования на VBA . Операции ветвления, выбора, циклы.
Приобретаемые знания: синтаксис и использование конструкций Go to, If-then, With-End With, Select Case, For Each Next в программировании.
Основной материал:
1. Операторы GoTo
2. Конструкция If-Then
3. Конструкции Select Case
4. Конструкция With_End With
5. Конструкция For Each_Next
6. Массивы
1. Операторы GoTo
Оператор GoTo используется для изменения последовательности операций в коде. Он перенаправляет ход выполнения программы на новую инструкцию, которая помечена специальным образом (текстовая строка, заканчивающаяся двоеточием, или число без двоеточия, указанные перед инструкцией). Процедуры VBA могут содержать любое количество меток, а оператор GoTo не определяет переход за пределы процедуры.
Пример 1.1. Получение имени пользователя.
Если имя пользователя отличается от Ховард, то процедура переходит к метке WrongName, на чем заканчивает свою работу. В противном случае процедура выполняет дополнительные операции. Оператор Exit Sub заканчивает выполнение процедуры.
Sub GoToDemo()
UserName = InputBox("Введите своё имя:")
If UserName <> "Ховард" Then GoTo WrongName
MsgBox ("Привет, Ховард.")
Exit Sub
WrongName:
MsgBox "Извините,эту процедуру может запускать только Ховард."
End Sub
Оператор GoTo, как правило, используется, если другого способа выполнить действие просто не существует. Единственной ситуацией,когда оператор GoTo в VBA действительно необходим, является перехват ошибок.
2. Конструкция If-Then
Конструкция If-Then используется для группировки инструкций VBA. Эта конструкция наделяет приложения способностью принимать решения.
Стандартный синтаксис конструкции If-Then :
If условие Then инструкции_истина [Else инструкции_ложь]
Конструкция If-Then используется для выполнения одного или более операторов при справедливости заданного условия. Оператор Else необязателен. Он позволяет выполнять одну или более инструкций в случае несправедливости условия.
Пример 2.1. Управлением временными данными.
Sub GreetMe()
If Time < 0.5 Then MsgBox "Доброе утро "
If Time >= 0.5 Then MsgBox "Добрый день"
End Sub
или:
Sub GreetMe1()
If Time < 0.5 Then MsgBox "Доброе утро" Else _
MsgBox "Добрый день"
End Sub
В данном случае введен символ продолжения строки _, а If-Then-Else является одним оператором. Для эффективности следует включить структуру, заканчивающую процедуру, когда одно из условий выполняется при этом не оцениваются дополнительные условия:
If условиеThen
[операторы_истина]
[Elseif условие-n Then
[альтернативные_операторы]]
[Else
[операторы_по_умолчанию ]]
End If
Пример 2.2.
Sub GreetMe2()
If Time < 0.5 Then
MsgBox "Доброе утро"
Elseif Time >=0.5 And Time < 0.75 Then
MsgBox "Добрый день"
Else
MsgBox "Добрый вечер"
End If
End Sub
или ( вложенные конструкции If-Then-Else (без ElseIf),при этом для каждого оператора If существует свой оператор End If):
Sub GreetMe3()
If Time < 0.5 Then
MsgBox "Доброе утро"
Else
If Time >=0.5 And Time < 0.75 Then
MsgBox "Добрый день"
Else
If Time >=0.75 Then
MsgBox "Добрый вечер"
End If
End If
End If
End Sub
3. Конструкции Select Case
Конструкция Select Case применяется при выборе между тремя и более вариантами. Она справедлива также для двух вариантов и является хорошей альтернативой структуре If-Then-Else. Конструкция Select
Case имеет следующий синтаксис.
Select Case тестируемое_выражение
[Case список_условий-n
[операторы-n]]
[Case Else
[операторы_по_умолчанию]]
End Select
Пример 1.3.1.
Sub GreetMe2()
Select Case Time
Case Is < 0.5
Msg = "Доброе утро"
Case 0.5 To 0.75
Msg = "Добрый день"
Case Else
Msg = "Добрый вечер"
End Select
MsgBox Msg
End Sub
В операторе Case может также использоваться оператор Or.
Пример 3.2.Определение, каким днем является текущий (субботой или воскресеньем).
Sub GreetUser()
Select Case Weekday(Now)
Case 1 Or 7
MsgBox "Это выходные."
Case Else
MsgBox "Это не выходные."
End Select
End Sub
Под каждым оператором Case может указываться любое количество инструкций,и они выполняются при условии Case, имеющем значение True. Если вы используете в каждом случае Case только одну инструкцию (как в предыдущем примере), то можете поместить ее в той же строке, что и ключевое слово Case (но не забудьте про символ разделения операторов в VBA – двоеточие).
Пример 3.3.Определение скидки.
Sub Discount()
Quantity = InputBox("Введите количество: ")
Select Case Quantity
Case "": Exit Sub
Case 0 To 24: Discount = 0.1
Case 25 To 49: Discount = 0.15
Case 50 To 74: Discount = 0.2
Case Is >= 75: Discount = 0.25
End Select
MsgBox "Скидка: " & Discount
End Sub
Структуры Select Case можно вкладывать друг в друга.
Пример 3.4. Проверка состояния окна Excel (развернутое,свернутое,нормальное).
Sub AppWindow()
Select Case Application.WindowState
Case xlMaximized: MsgBox "Окно приложения развернуто"
Case xlMinimized: MsgBox "Окно приложения свернуто"
Case xlNormal: MsgBox "Окно приложения в нормальном
состоянии"
Select Case ActiveWindow.WindowState
Case xlMaximized: MsgBox "Окно книги развернуто"
Case xlMinimized: MsgBox "Окно книги свернуто"
Case xlNormal: MsgBox "Окно книги в нормальном состоянии"
End Select
End Select
End Sub
Можно создавать конструкции Select Case любой степени вложенности, но каждому оператору Select Case должен соответствовать свой оператор End Select.
4. Конструкция With_End With
Конструкция With_End With позволяет выполнять несколько операций над одним объектом. Чтобы понять, как она работает, проанализируйте следующие эквивалентные примеры, изменяющие пять счвойств одного обьекта.
Пример 4.1. (см.рис.3.1)
Sub ChangeFont1()
Selection.Font.Name = "Times New Roman"
Selection.Font.FontStyle = "Bold Italic"
Selection.Font.Size = 12
Selection.Font.Underline = xlUnderlineStyleSingle
Selection.Font.ColorIndex = 5
End Sub
Пример 4.2.
Sub ChangeFont2()
With Selection.Font
.Name = "Times New Roman"
.FontStyle = "Bold Italic"
.Size = 12
.Underline = xlUnderlineStyleSingle
.ColorIndex = 5
End With
End Sub
Использование конструкции With-End With для изменения нескольких свойств одного объекта помогает повысить эффективность выполнения кода.
5. Конструкция For Each_Next
Коллекция – это группа однородных объектов.Чтобы использовать конструкцию For Each_Next, необязательно знать, сколько элементов насчитывает коллекция.
For Each_Next используется для выполнения действий над всеми объектами коллекции, для оценивания всех объектов коллекции и совершения действия при выполнении определенных условий.
Синтаксис конструкции For Each_Next :
For Each элемент In группа
[инструкции]
[Exit For]
[инструкции]
Next [элемент]
Пример 5.1. Поочередное обращение к каждому из шести членов массива фиксированной длины.
Sub Macro1()
Dim MyArray(5)
For i = 0 To 5
MyArray(i) = Rnd
Next i
For Each n In MyArray
Debug.Print n
Next n
End Sub
Пример 5.2.Отображение свойства Name каждого рабочего листа коллекции Sheets активной рабочей книги.
Sub CountSheets()
Dim Item as WorkSheet
For Each Item In ActiveWorkBook.WorkSheets
MsgBox Item.Name
Next Item
End Sub
Пример 5.3.Циклический просмотр всех объектов коллекции Windows.
Sub HiddenWindows()
Dim AllVisible As Boolean
Dim Item As Window
AllVisible = True
For Each Item In Windows
If Item.Visible = False Then
AllVisible = False
Exit For
End If
Next Item
MsgBox AllVisible
End Sub
Если окно скрыто, то значение переменной AllVisible изменяется на False и процедура выходит из цикла For Each-Next. В окне сообщения отображается True (если все окна видимы) и False (если хотя бы одно окно скрыто). Оператор Exit For необязателен. Он предоставляет способ досрочно выйти из цикла For Each-Next. Обычно заданная конструкция применяется вместе с оператором If-Then (см. далее в этой главе).
Пример 5.4. Закрытие всех рабочих книг, кроме активной.
Sub CloseInActive()
Dim Book as Workbook
For Each Book In Workbooks
If Book.Name <> ActiveWorkbook.Name Then Book.Close
Next Book
End Sub
6.Массивы
Массив – это группа элементов одного типа, которые имеют общее имя; на конкретный элемент массива ссылаются, используя имя массива и индекс. Например, можно определить массив из 12-ти строк так, чтобы каждая переменная соответствовала названию месяца. Если вы назовете массив MonthNames, то можете обратиться к первому элементу массива как MonthNames(0), ко второму – как MonthNames(1) и т.д., до MonthNames(11).
Объявление массивов
Массив, как и обычные переменные, объявляется с помощью операторов Dim или Public:
Dim MyArray(0 To 100) As Integer
Dim MyArray(100) As Integer
Если вы хотите, чтобы в качестве первого индекса всех массивов использовалась единица, то вам необходимо перед первой процедурой модуля сделать следующее объявление :Option Base 1.
Пример 6.1. Присвоение элементам массива значений.
Sub массив()
Dim A(0 To 5, 0 To 6) As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 5
For j = 0 To 6
A(i, j) = i + j
Next j
Next i
End Sub
Объявление многомерных массивов
Массивы VBA могут иметь до 60-ти измерений, хотя обычно используется не более трех (трехмерные массивы). Показанный ниже оператор объявляет двухмерный 100-элементный массив целых чисел.
Dim MyArray(1 To 10, 1 To 10) As Integer
Этот массив можно рассматривать как матрицу значений 10×10. Чтобы обратиться к конкретному элементу двухмерного массива, используйте два индекса. Например, таким образом присваивается значение элементу предыдущего массива: MyArray(3, 4) = 125
Трехмерный массив можно рассматривать как куб, но не существует способа визуально представить данные массива, в котором больше трех измерений. Динамический массив не имеет предопределенного количества элементов. Динамический массив объявляется с незаполненными значениями в скобках.
Dim MyArray() As Integer
Тем не менее, прежде чем динамический массив можно будет использовать в программе, необходимо обратиться к оператору ReDim, указывающему VBA, сколько элементов находится в массиве (или ReDim Preserve, если вы решили сохранить текущую длину массива). Оператор ReDim можно использовать сколько угодно раз, изменяя, если требуется, размер массива.
1.4. Урок № 4
Тема: Основные элементы рабочей книги и способы обращения к ним на языке VBA
Приобретаемые знания: объекты Excel, их свойства и методы.
Основной материал:
1. Объект Aplication(Приложение)
2. Объекты Workbook, Workbooks и ActiveWorkbook
3. Объекты Worksheet, Workshets и ActiveSheet
4. Объекты Range, Selection и ActiveCell
1. Объект Aplication(Приложение)
Он управляет установками приложения (теми которые в окне параметры Excel) и встроенными функциями-свойствами объекта Aplication . К свойствам относятся также :
- ActiveWorkbook-активная книга.
- ActiveSheet- активный лист активной книги.
- ActiveCell-активная ячейка на активном листе активной книги.
- Calculation-режим вычислений.Основные значения этого свойства:
X1CalculationAutomatic-автоматический расчет(при изменении данных в ячейках перерасчет по формулам производится автоматически)
X1CalculationManual-расчет вручную
- Dialogs-коллекция диалоговых окон.С его помощью можно производить открытие диалоговых окон ,где Show –метод этого объекта: Application.Dialogs(x1DialogOpen).Show (открытие документа)
Методы объекта Application :
- Quit-выход из Excel: Application.Quit
- Calculate-принудительные вычисления.
- OnTime-запуск макроса в заданный момент времени,где имя и время макроса являются параметрами метода.
2.Объекты Workbook, Workbooks и ActiveWorkbook
Свойства Workbook:
- Name-имя книги с расширением (xls или xlsx,если в книге нет макросов, и xlsxm, если макросы есть);
- FullName-имя книги с путем и расширением (полное имя книги).
- Методы Workbook:
- Close-закрытие книги.
- Save-сохранение книги.
- SaveAs-сохранение книги(имеет ряд необязательных параметров: FileName(имя файла), FileFormat(формат файла), Password(пароль)).
- Объекты типа Workbook. обладают свойствами и методами объекта Workbook.
- Объект Workbooks (книги) – объект, содержащий все открытые книги.
Основные методы Workbook:
- Activate-активизация указанной книги(из открытых), при которой ее первый лист становится активным.
- Add—создание новой книги, которая сразу становится активной.
3.Объекты Worksheet, Workshets и ActiveSheet
Свойства Worksheet:
- Name-имя листа.
- Cells-Коллекция всех ячеек листа и конкретная ячейка, если в скобках указаны номера строки и столбца, на пересечении которых она расположена. При этом первый индекс в скобках задает номер строки, а второй номер столбца. Между индексами ставится запятая.
Методы Worksheet:
- Activate-активизация листа.
- Delete удаление листа из книги.
Объекты типа Worksheet обладают свойствами и методами объекта Worksheet.
Worksheets(листы) –объект , содержащий все листы Excel. Каждый лист может быть идентифицирован либо по номеру, либо по имени:
Worksheets(1) или Worksheets(«Лист1»)
Коллекции обладают свойством Count(счет), которое позволяет определить количество объектов , составляющих коллекцию.
4.Объекты Range, Selection и ActiveCell
Объект Range(Диапазон) позволяет работать со следующими элементами Excel:
1) диапазон ячеек;
2) диапазон столбцов;
3) диапазон строк;
4) отдельная ячейка.
Свойства Range :
- Formula-формула в ячейках диапазона при стиле адресации А1.
- FormulaR1C1-формула в ячейках диапазона при стиле адресации R1C1.
- Address-адрес ячейки.
- Offset-диапазон, смещенный относительно активного (выделенного) диапазона согласно значениям, заключенным в скобки. При этом первый индекс- смещение по вертикале, второй –по горизонтали.
- Value-массив значений в ячейках диапазона (или одно значение, если диапазон содержит одну ячейку).
- Columns-коллекция столбцов, из которых состоит диапазон.
- Rows-коллекция строк, из которых состоит диапазон.
- Cells- коллекция ячеек диапазона.
Методы Range:
- Clear-удаление содержимого ячеек диапазона.
- Select-активизация(выделение) ячеек диапазона.
Объекты типа Range обладают свойствами и методами объекта Range.
Объект Selection(выделение) позволяет работать с выделенными (активными) ячейками.Являясь объектом типа Range , он обладает свойствами Columns, Rows и Cells-коллекции соответственно столбцов, строк и ячеек выделенного (активного) диапазона.
Свойство ActiveCell(активная ячейка) объекта Application является объектом типа Range, соответствующим активной ячейке на активном листе активной книги. Свойство ActiveCell обладает свойствами и методами объекта Range.
1.5. Урок №5
Тема: Сортировка многомерных массивов. Поиск элемента
Приобретаемые знания: способы сортировки многомерных массивов, поиск элемента с наименьшим и элемента наибольшим значением.
Основной материал:
1. Пузырьковая сортировка
2. Сортировка выбором
3. Примеры
Сортировка многомерных массивов сводиться к сортировке одномерных следующими процедурами (на примере двумерного массива):
Sub многмер_в_одномер()
Dim A(0 To n,0 To m) As Integer
Dim B(0 To (n+1)*(m+1)-1) As Intege [ так как в матрице А (n+1)*(m+1)
элементов ]
Dim i As Integer
Dim j As Integer
Dim k As Integer
k=0
For i=0 to n
For j=0 To m
B(i+j+k)=A(i,j) [ так как номер в массиве В увеличивается, а i+j
снова 1 ]
k=k+ m
Next j
Next I
End Sub
Sub одномер_в_многомер()
Dim A(0 To n,0 To m) As Integer
Dim B(0 To (n+1)*(m+1)-1) As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
k=0
For i=0 to n-1
For j=0 To m-1
A(i,j)=B(i+j+k)
k=k+ m
Next j
Next I
End Sub
1. Пузырьковая сортировка.
Дан массив А[0],A[1],…,A[n] . Последовательно сравнивая А[0] с A[1], А[1] с A[2] и т.д., меняя местами А[i] с A[i+1], если А[i]>A[i+1]. Тогда A[n] получит наибольшее значение, а A[0]-наименьшее. Если на некотором проходе по массиву обменов не было, то массив отсортирован, и дальнейшие проходы не нужны.
Sub BubbleSort()
Dim A(0 To n) As Integer
Dim Temp As Integer
For i = 0 To n-1
For j = i + 1 To n
If A(i) > A(j) Then
Temp = A(j)
A(j) = A(i) [ если A[i] >A[j], то мы меняем их местами ]
A(i) = Temp
End If
Next j
Next i
End Sub
2. Сортировка выбором.
Просмотрим все элементы массива от А[0] до A[n] и найдем элемент с наименьшим значением и это значение поменяем с А[0]. Затем выберем наименьшее значение среди A[1],…,A[n] и поменяем его местами с A[1] и т.д. Тогда A[n] получит наибольшее значение, а A[0]-наименьшее.
Sub selectSort()
Dim A(0 To n) As Integer
Dim Temp As Integer
For i = 0 To n – 1
min = A(i)
Imin = i
For j = i + 1 To n [ ищем минимальный среди A[i],…,A[n]]
If A(j) > min Then
min = A(j)
imin = j
End if
If imin > I Then [ меняем местами A[i] и минимальный ]
Temp = A(j)
A(j) = A(imin)
A(imin) = Temp
End If
Next j
Next i
End Sub
Также поиск наибольшего и наименьшего элемента можно осуществить с помощью следующей процедуры:
Sub poisk()
Dim A(0 To n,0 To m) As Integer
Dim min As Integer
Dim max As Integer
Dim i Integer
Dim j Integer
min = A(0,0)
max = A(0,0)
For i = 0 To n
For j = 0 To m
If A(i,j) < min Then [ сравниваем A[i,j] с min, и если A[i,j]]
присваиваем min=A[i,j] ]
min = A(i,j)
End if
If A(i,j) > max Then [ сравниваем A[i,j] с min, и если A[i,j]]>max,
то присваиваем max=A[i,j] ]
max= A(i,j)
End If
Next j
Next i
End Sub
3. Примеры.
Пример 1. Пузырьковая сортировка матрицы 3*4 (см.рис.5.1)
Sub сорт1()
Dim A(0 To 2, 0 To 3) As Integer
Dim B(0 To (2 + 1) * (3 + 1) - 1) As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim Temp As Integer
k = 0
For i = 0 To 2
For j = 0 To 3
A(i, j) = i + j
B(i + j + k) = A(i, j)
Worksheets(1).Cells(i + 1, j + 1) = A(i, j)
Next j
k = k + 3
Next i
For i = 0 To 11 - 1
For j = i + 1 To 11
If B(i) > B(j) Then
Temp = B(j)
B(j) = B(i)
B(i) = Temp
End If
Next j
Next i
For i = 0 To 11
Worksheets(1).Cells(6, i + 1) = B(i)
Next i
k = 0
For i = 0 To 2
For j = 0 To 3
A(i, j) = B(i + j + k)
Worksheets(1).Cells(i + 8, j + 1) = A(i, j)
Next j
k = k + 3
Next i
End Sub
Пример 2. Сортировка выбором матрицы 3*4.
Sub сорт2()
Dim A(0 To 2, 0 To 3) As Integer
Dim B(0 To (2 + 1) * (3 + 1) - 1) As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim Temp As Integer
Dim Min As Integer
Dim imin As Integer
k = 0
For i = 0 To 2
For j = 0 To 3
A(i, j) = i * j + 1
B(i + j + k) = A(i, j)
Worksheets(1).Cells(i + 1, j + 1) = A(i, j)
Next j
k = k + 3
Next i
For i = 0 To 11 - 1
Min = B(i)
imin = i
For j = i + 1 To 11
If B(j) > Min Then
Min = B(j)
imin = j
End If
If imin > i Then
Temp = B(j)
B(j) = B(imin)
B(imin) = Temp
End If
Next j
Next i
For i = 0 To 11
Worksheets(1).Cells(6, i + 1) = B(i)
Next i k = 0
For i = 0 To 2
For j = 0 To 3
A(i, j) = B(i + j + k)
Worksheets(1).Cells(i + 8, j + 1) = A(i, j)
Next j
k = k + 3
Next i
End Sub
1.6. Урок №6
Тема: Алгоритмы обработки и статистики данных с помощью Visual Basic for Application
Приобретаемые знания: понятие о типах данных, понятие о константах; основные алгоритмы обработки информации: нахождение суммы значений диапазона ячеек; определение количества элементов в диапазоне ячеек, обладающих заданными свойствами (счетчик); определение максимального и минимального значений в диапазоне ячеек; сортировка элементов в диапазоне; подсчет количества диаграмм на листе; вычисление математического ожидания и дисперсии
Основной материал:
1. Представление данных в памяти
2. Типы данных
3. Идентификаторы, переменные, массивы
4. Операции, выражения, операторы
5.Функции для форматирования данных
6. Примеры
1. Представление данных в памяти
Данные - величины, обрабатываемые программой. Имеется три основных вида данных: константы, переменные и массивы.
Константы - это данные, которые зафиксированы в тексте программы и не изменяются в процессе ее выполнения. Константы представляются в виде лексем, изображающих фиксированные числовые, логические, символьные или строковые значения.
Числовые константы могут быть целыми, вещественными (с фиксированной или плавающей точкой) и перечислимыми.
Целые константы могут быть десятичными, восьмеричными и шестнадцатеричными. Десятичная целая константа определена как последовательность десятичных чисел, начинающаяся не с нуля, если это не число нуль. Восьмеричные константы в Visual Basic for Application начинаются с префикса &O и содержат числа от 0 до 7. Шестнадцатеричные числа начинаются с префикса &H и содержат числа от 0 до 9 и латинские буквы от A до F. Вещественные константы записываются в десятичной системе счисления и в общем случае содержат целую часть (десятичная целая константа), десятичную точку, дробную часть (десятичная целая константа), признак (символ) экспоненты E и показатель десятичной степени (десятичная целая константа, возможно со знаком).
Примеры констант: 123.456; 3.402823E38;123; &O24;, &H1F.
Перечислимые константы - это набор обычных целочисленных констант. Перечисляемый набор может содержать конечный набор уникальных целых значений, каждое из которых имеет особый смысл в текущем контексте. Перечисляемые наборы являются удобным инструментом, обеспечивающим выбор из ограниченного набора параметров. Например, если пользователь должен выбрать цвет из списка, то можно установить соответствие: черный = 0, белый = 1 и т.д.
Логические (булевы) константы могут иметь лишь одно из двух значений: да (истина, TRUE), нет (ложь, FALSE).
Символьные и строковые константы. В отличие от большинства языков программирования, где существуют отдельно символьные (содержащие один символ алфавита) и строковые (массив символов) константы, в VBA существуют только строковые, имеющие два типа значений:
- Строки переменной длины, которые могут содержать до приблизительно 2 миллиардов (2^31) символов.
- Строки постоянной длины, которые могут содержать от 1 до приблизительно 64K (2^16) символов.
В зависимости от значения константы по разному представляются в памяти ПК. Целые представляют последовательный набор фиксированного количества байтов, а вещественные, даже не отличаясь от целых по значению, имеют другую форму внутреннего представления, обусловленную применением арифметики с плавающей точкой при операциях с такими константами и представлением вещественного числа. В общем случае форма представления данных в памяти ПК определяется типом данных.
2. Типы данных
Тип данных определяет, каким образом биты данных, представляющие конкретное значение, хранятся в памяти ПК. В каждом языке программирования имеется свой фиксированный набор базовых типов данных. Некоторые языки позволяют создание дополнительных (пользовательских) типов данных. В VBA имеются следующие типы данных:
Тип данных | Размер | Диапазон значений |
Byte (байт) | 1 байт | От 0 до 255. |
Boolean (логический) | 2 байт | True или False. |
Integer (целое) | 2 байт | От -32 768 до 32 767. |
Long (длинное целое) | 4 байт | От -2 147 483 648 до 2 147 483 647. |
Single (с плавающей точкой обычной точности) | 4 байт | От -3,402823E38 до -1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,402823E38 для положительных значений. |
Double (с плавающей точкой двойной точности) | 8 байт | От -1,79769313486232E308 до -4,94065645841247E-324 для отрицательных значений; от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений. |
Currency (денежный) | 8 байт | От -922 337 203 685 477,5808 до 922 337 203 685 477,5807. |
Decimal (масштабируемое целое) | 14 байт | +/-79 228 162 514 264 337 593 543 950 335 без дробной части; +/-7,9228162514264337593543950335 с 28 знаками справа от запятой; минимальное ненулевое значение имеет вид +/-0,0000000000000000000000000001. |
Date (даты и время) | 8 байт | От 1 января 100 г. до 31 декабря 9999 г. |
Object (объект) | 4 байт | Любой указатель объекта. |
String (строка переменной длины) | 10 байт + длина строки | От 0 до приблизительно 2 миллиардов. |
String (строка постоянной длины) | Длина строки | От 1 до приблизительно 65 400. |
Variant (числовые подтипы) | 16 байт | Любое числовое значение вплоть до границ диапазона для типа Double. |
Variant (строковые подтипы) | 22 байт + длина строки | Как для строки (String) переменной длины. |
Тип данных, определяемый пользователем (с помощью ключевого слова Type) | Объем определяется элементами | Диапазон каждого элемента определяется его типом данных. |
Поясним некоторые характерные для VBA типы данных.
Byte - Массивы данного типа служит для хранения двоичных данных, например, изображений. Использование данного типа предохраняет двоичные данные во время преобразования формата.
Boolean - для хранения логических (булевых) значений. По умолчанию значением булевской переменной является False- ложь.
Currency - для хранения чисел с дробной частью до четырех цифр и целой частью до 15 цифр, то есть данных с фиксированной десятичной точкой, удобных для денежных вычислений. Числа с плавающей десятичной точкой (Single, Double) имеют больший диапазон значений, но могут приводить к ошибкам округления.
Decimal - в версии 5.0 поддерживается использование типа данных Decimal только в пределах типа Variant, т.е. невозможно описать переменную с типом Decimal. Пользователь, однако, имеет возможность создать переменную типа Variant с подтипом Decimal с помощью функции CDec.
Object - поскольку VBA является объектно-ориентированным языком, в нем можно манипулировать различными объектами, адреса расположения которых в памяти (указатели) имеют этот тип.
String - по умолчанию данные строкового типа имеют переменную длину и могут удлиняться или укорачиваться. Однако такие строки занимают на 10байт памяти больше, поэтому можно объявить строки фиксированной длины, явно указав количество символов. Если количество символов будет меньше объявленного, то свободные места заполняются пробелами, при попытке занесения большего количества символов лишние отбрасываются.
Variant - может быть использован для хранения данных всех базовых типов без выполнения преобразования (приведения) типов. Применение данного типа позволяет выполнять операции, не обращая внимание на тип данных, которые они содержат. Удобен для объявления переменных, тип которых заранее неизвестен. Переменные этого типа могут содержать специальные значения: Empty, Null, Error.
3. Идентификаторы, переменные, массивы
Имена (идентификаторы) - употребляются для обозначения объектов программы (переменных, массивов, процедур и дp.). В VBA имена констант, переменных и процедур должны удовлетворять следующим требованиям:
- должны начинаться с буквы;
- не могут содержать точки и символов объявления типа;
- не могут быть длиннее 255 символов. Длина имен объектов не должна
превышать 40 символов.
- не могут быть ключевыми словами (именами операций, операторов,
встроенных функций).
Переменные представляют собой зарезервированное место в памяти ПК для хранения значения. Переменные обозначаются именами - словами, используемыми для ссылки на значение, которое содержит переменная, и характеризуются типом, определяющим вид данных, которые можно хранить в переменной. Переменные могут изменять свои значения в ходе выполнения программы. По умолчанию переменные имеют тип данных Variant, если в модуле отсутствует инструкция DefТип. Для явного указания типа переменной можно в конце ее имени указать символ описания типа:
Currency - @; Double - #; Integer - %; Long - &; Single - !; String - $.
Объявить переменную - значит заранее сообщить программе о ее существовании. Объявление переменной производится специальным оператором. Одновременно с объявлением переменной после ее имени можно записать ключевое слово As, после которого задается тип переменной.
Инструкции DefТип используются на уровне модуля (т.е. их нельзя использовать внутри процедур) для задания типа данных, используемого по умолчанию для переменных, имена которых начинаются с соответствующих символов. Функции: DefBool, DefByte, DefInt,DefLng, DefCur, DefSng, DefDbl, DefDec, DefDate, DefStr, DefObj, DefVar
Пример: DefBool диапазонБукв [диапазонБукв]
Обязательный аргумент диапазонБукв имеет следующий синтаксис:
буква_1[-буква_2]
Аргументы буква_1 и буква_2 указывают диапазон имен, для которых задается тип данных по умолчанию. Каждый аргумент представляет первую букву имени переменной и может быть любой буквой алфавита. Регистр символов в аргументе диапазонБукв не существенен.
Массивы - последовательности логически связанных элементов одного типа, которым присвоено одно имя. Положение элемента в массиве однозначно определяется его индексами (одним, в случае одномерного массива, или несколькими, если массив многомерный). Имена массивов имеют те же ограничения, что и имена переменных, тип данных, хранящихся в массиве, задается так же, как для переменных. Однако если массив имеет тип Variant, его отдельные элементы могут содержать данные разных типов.
В VBA существуют два вида массивов: массив фиксированного размера и динамический массив, размер которого может изменяться во время выполнения программы с помощью специальных операторов. При объявлении массива фиксированной длины за его именем в круглых скобках задаются через запятую верхние границы каждой размерности, не превышающие максимального значения типа Long. По умолчанию нижняя граница равна 0, но ее можно задать явно с помощью ключевого слова To:
Lines (100 To 120) As String
При объявлении динамического массива список его размерностей оставляют пустым, а затем с помощью специального оператора назначают действительное число размерностей и элементов массива.
Примечание. В VBA массивы любых типов данных требуют 20 байт памяти плюс 4 байт на каждую размерность массива плюс число байт, требуемых для хранения данных. Объем памяти, требуемый для сохранения данных, рассчитывается как произведение числа элементов на размер элемента.
Например, данные в одномерном массиве, который содержит четыре элемента типа Integer, требующих по 2 байт на элемент, занимают 8 байт. Вместе с 20 байт на массив и 4 байт на размерность общий требуемый объем составляет 32 байт.
Структуры - в VBA нет понятия структуры, но есть определяемый пользователем с помощью инструкции Type тип данных.
Типы данных, определяемые пользователем, могут содержать один или несколько элементов любого типа данных, массивы или ранее определенные пользователем типы. Например:
Type MyType
' Имя записывается в строковую переменную.
MyName As String
' День рождения записывается в переменную даты.
MyBirthDate As Date
' Пол записывается в целую переменную
' (0 для женщины, 1 для мужчины).
MySex As Integer
End Type
4. Операции, выражения, операторы
Операции.
В VBA существуют следующие типы операций:
- арифметические операции, используемые для выполнения математических вычислений: ^, *, /, \, Mod, +, -.
- Здесь \ - Возвращает результат целого деления двух чисел, Mod - Возвращает остаток при целом делении двух чисел (значение по модулю).
- операции сравнения, используемые для выполнения операций сравнения
- < , > , <=, >= , = , <> ;
- логические операции, используемые для выполнения логических операций
And - Возвращает результат конъюнкции (логического И) для двух выражений с операциями сравнения, либо выполняет поразрядное сравнение двух числовых выражений:
Eqv - Используется для проверки логической эквивалентности двух выражений с операциями сравнения, либо выполняет поразрядное сравнение двух числовых выражений:
Imp - Выполняет операцию логической импликации для двух выражений с операциями сравнения, либо выполняет поразрядное сравнение двух числовых выражений:
Not - Выполняет над выражением операцию логического отрицания, а также поразрядное изменение значений каждого разряда переменной:
Or - Выполняет операцию логического ИЛИ (сложения) для двух выражений:
Xor - Выполняет операцию исключающего ИЛИ для двух выражений:
- операция конкатенации символьных значений дpуг с другом с образованием одной длинной строки:
& - Используется для слияния двух строковых выражений.
Выражения - предназначаются для выполнения необходимых вычислений, состоят из констант, переменных, функций (например, exp(x)), объединенных знаками операций.
Выражения записываются в виде линейных последовательностей символов (без подстрочных и надстрочных символов, "многоэтажных" дробей и т.д.), что позволяет вводить их в компьютер, последовательно нажимая на соответствующие клавиши клавиатуры.
Различают выражения арифметические, логические и строковые.
- Арифметические выражения служат для определения одного числового значения.
Например, (1+sin(x))/2. Значение этого выражения при x=0 равно 0.5,
а при x = p/2 - единице.
- Логические выражения описывают некоторые условия, которые могут удовлетворяться или не удовлетворяться.
Таким образом, логическое выражение может принимать только два значения - "истина" или "ложь" (да или нет).
Рассмотрим в качестве примера логическое выражение x*x + y*y < r*r, определяющее принадлежность точки с координатами (x,y) внутренней области круга радиусом r c центром в начале координат.
При x=1, y=1, r=2 значение этого выражения - "истина", а при x=2, y=2, r=1 - "ложь".
- Значения строковых выражений - тексты. В них могут входить литерные константы, литерные переменные и литерные функции, разделенные знаком операции сцепки.
Например, А & В означает присоединение строки В к концу строки А. Если А = "куст ", а В = "зеленый", то значение выражения А&В есть "куст зеленый".
Операторы (команды).
Оператор - это наиболее крупное и содержательное понятие языка: каждый оператор представляет собой законченную фразу языка и определяет некоторый вполне законченный этап обработки данных. В состав операторов входят:
- ключевые слова;
- данные;
- выражения и т.д.
Операторы подразделяются на исполняемые и неисполняемые. Неисполняемые операторы предназначены для описания данных и структуры программы, а исполняемые - для выполнения различных действий (например, оператор присваивания, операторы ввода и вывода, условный оператор, операторы цикла, оператор процедуры и дp.).
При создании программ VBA настоятельно рекомендуется определиться с правилами, по которым будут присваиваться имена объектам — соглашение об именовании.
- имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
str (или s) — String, символьное значение;
fn (или f) — функция;
sub — процедура;
c (или все буквы имени заглавные) — константа;
b — Boolean, логическое значение (True или False);
d — дата;
obj (или o) — ссылка на объект;
n — числовое значение;
- имена функций, методов и каждое слово в составном слове должно начинаться с заглавной буквы:
MsgBox objMyDocument.Name
Sub CheckDateSub()
- в ранних версиях VB не было слова Const, все константы определялись как переменные, а для отличия их записывали заглавными буквами, между словами ставили символ подчеркивания, например COMPANY_NAME.
5.Функции для форматирования данных
Для форматирования данных в вашем распоряжении функция Format() и целый набор функций, которые начинаются с префикса Format... (FormatNumber(), FormatCurrency(), FormatDateTime() и т. п.)
Синтаксис функции Format() выглядит так:
Format(выражение, "формат"). Эта функция принимает выражение и форматирует его в соответствии с параметром формат.
Несколько примеров использования Format() :
Format(15/20, "Percent")
Format(Date, "Long Date")
Format(1, "On/Off")
Format(334.9, "###0.00")
Format("Просто текст", ">" )
6. Примеры
Пример №1
“Разнести числа по листам”
Подготовка исходных данных
1. На Листе1 (Числа) в ячейки А1–А20 занести случайным образом значения из интервала (–50; 50).
2. На Лист1 (Числа) в ячейку С1 записать “Количество +”, а в ячейку D1 поместить подсчитанное значение с количеством положительных чисел.
3. На Лист1 (Числа) в ячейку С2 записать “Количество –”, а в ячейку D2 поместить подсчитанное значение с количеством отрицательных чисел.
4. На Лист1 (Числа) в ячейку С3 записать “Количество 0”, а в ячейку D3 поместить подсчитанное значение с количеством чисел, равных нулю.
5. На Лист2 (Положительные) в ячейку В1 записать “Положительные” и, начиная с ячейки B2, в столбик поместить все положительные числа.
6. На Лист3 (Отрицательные) в ячейку С1 записать “Отрицательные” и, начиная с ячейки D1, в строку поместить все отрицательные числа.
7. Создать кнопку “Количество” на листе “Числа”.
8. Создать кнопку “Перенос” на листе “Числа”.
9. Создать кнопку “Очистить” на листе “Положительные”.
10. Создать кнопку “Очистить” на листе “Отрицательные”.
План работы
1. Переименуйте: Лист1 в “Числа”, Лист2 в “Положительные”, Лист3 в “Отрицательные”.
2. Примените к столбцу А (лист “Числа”) условное форматирование. После заполнения диапазона ячеек числами к положительным числам будет применяться такой формат: полужирный курсив, красный цвет; к отрицательным — полужирный курсив, синий цвет; нулевые значения — полужирный курсив, зеленый цвет. Для этого: выделите столбец А; выполните команду Формат |Условное форматирование. Появится диалоговое окно, в котором введем значения по образцу. (см.рис.6.1)
3. Перейдите в редактор VBA.
4. Создайте модуль с помощью команды Insert | Module.
5. Создайте в модуле процедуру с помощью команды Insert | Procedure. Присвойте имя процедуре “Числа”.
6. Напишите текст программы для занесения чисел на лист.
Public Sub Числа()
Dim I As Integer
Randomize Timer
For I = 1 To 20
Sheets("Числа").Cells(I, 1) =
Int(Rnd * 100) - 50
Next I
7. Нарисуйте на листе “Числа” автофигуру. Назначьте ей процедуру выполнения программы Числа (см.рис.6.2).
Для этого:
- Выделите фигуру.
- Вызовите контекстно-зависимое меню.
- Выполните команду “Назначить макрос”.
- Выберите в открывшемся диалоговом окне только что созданную программу “Числа”.
8. Проверьте работоспособность программы.
9. Создайте макрос “Очистка_Чисел” для очистки диапазона ячеек А1:D20 листа “Числа”.
Public Sub Очистка()
Sheets("Положительные").Select
Range("B1:B20").Select
Selection.ClearContents
Sheets("Отрицательные").Select
Range("B1:B20").Select
Selection.ClearContents
Sheets("Числа").Select
End Sub
10. Подготовьте автофигуру и привяжите к ней макрос. (см. рис.6.3)
11. Создайте в этом же модуле еще одну процедуру Количество для подсчета количества положительных, отрицательных и нулевых значений.
Public Sub Koличество()
Rem Объявление переменных
Rem Pol — переменная для подсчета количества положительных чисел
Rem Otr — переменная для подсчета количества отрицательных чисел
Rem Nul — переменная для подсчета нулевых значений
Dim I As Integer, Pol As Integer, Otr As Integer,
Nul As Integer
Rem обнуление переменных
Pol = 0
Otr = 0
Nul = 0
Rem Открытие цикла для проверки чисел
For I = 1 To 20
If Sheets("Числа").Cells(I, 1) > 0 Then
Pol = Pol + 1
ElseIf Sheets("Числа").Cells(I, 1) < 0 Then
Otr = Otr + 1
Else
Nul = Nul + 1
End If
Next I
Rem Вывод на лист "Числа" результатов подсчета
With Sheets("Числа")
.Range("C1") = "Количество +"
.Range("D1") = Pol
.Range("C2") = "Количество -"
.Range("D2") = Otr
.Range("C3") = "Количество 0"
.Range("D3") = Nul
End With
End Sub
12. Создайте автофигуру с именем “Количество” на листе “Числа” и привяжите к ней программу Количество.
13. Создайте в этом же модуле еще одну процедуру Перенос для переноса положительных и отрицательных чисел по разным листам.
Public Sub Перенос()
Rem Объявление переменных
Dim I As Integer, IndPol As Integer, IndOtr As Integer
IndPol = 2
IndOtr = 4
Rem Занесение в ячейку B1 слово "Положительные"
Sheets("Положительные").Range("B1") = "Положительные"
Rem Занесение в ячейку B1 слово "Отрицательные"
Sheets("Отрицательные").Range("C1") = "Отрицательные"
For I = 1 To 20
If Sheets("Числа").Cells(I, 1) > 0 Then
Sheets("Положительные").Cells(IndPol, 2) =
Sheets("Числа").Cells(I, 1)
IndPol = IndPol + 1
ElseIf Sheets("Числа").Cells(I, 1) < 0 Then
Sheets("Отрицательные").Cells(1, IndOtr) =
Sheets("Числа").Cells(I, 1)
IndOtr = IndOtr + 1
End If
Next I
End Sub
14. Создайте автофигуру с именем “Перенос” на листе “Числа” и привяжите к ней программу Перенос. (см.рис.6.4)
15. Сохраните работу.
Пример №2
“Нахождение суммы в диапазоне ячеек”
Найти максимальный и минимальный элементы, сумму значений из ячеек диапазона, среднее значение можно обычным способом, используя стандартные алгоритмы. Но приложение Excel содержит более 400 встроенных функций рабочего листа. Вызвать их позволяет объект Application: Application. Функция Рабочего Листа (Аргументы).
Задача.
Нахождение суммы в диапазоне ячеек
Напишите программу вычисления суммы чисел, находящихся в диапазоне ячеек B1:B20, и выведите результаты вычисления с поясняющими надписями в ячейки A22:B22.
Решим эту задачу двумя способами.
1-й способ (стандартный алгоритм)
Подготовка исходных данных.
1. Переименуйте Лист1 в “Пример1”.
2. Заполните диапазон ячеек В1:В22 целыми числами.
Подготовка текста программы.
3. Войдите в редактор VBA. Вставьте модуль.
4. Вставьте в модуле новую процедуру с именем Сумма1способ.
5. Наберите текст программы.
Public Sub Сумма1способ()
Dim i As Byte, Sum As Integer
Sum = 0 'Вычисление суммы
With Sheets("Пример1")
For i = 1 To 20
Sum = Sum +.Cells(i,2)
Next i
.Cells (22,1)="Сумма1 =": .Cells (22,2) = Sum
End With
End Sub
2-й способ (применение функции)
Текст программы:
Public Sub Сумма2способ()
Dim i As Byte, Sum As Integer
Sum=0 'Вычисление суммы
Sum = Application.Sum(Sheets("Пример1".Range("В1:В20"))
Sheets("Пример 1").Cells(23,1)="Сумма2 ="
Sheets("Пример 1").Cells(23,2) = Sum
End Sub
6. Интерфейс (см.рис. 6.5.)
7. Сохраните работу
Пример №3
“Сравнение чисел”
Напишите программу, которая из пары чисел А2 и В2, А3 и В3 и т.д. будет выбирать большее и помещать в столбец D, начиная с ячейки D2. Создайте кнопку для стирания результатов из столбцов А, В и D.
Условия:
Количество пар чисел для сравнения, а также сами числа должны генерироваться случайным образом.
В ячейки А1, B1, D1 надписи “1-е число”, “2-е число” и “Большее” должны заноситься программно.
Программа начинает выполняться при нажатии на кнопку, созданную на этом же листе.
План работы:
Подготовка исходных данных.
1. Переименуйте Лист2 в “Пример2”.
2. Заполните диапазон ячеек А1:В30 целыми числами. (см.рис.6)
Подготовка текста программы.
3. Войдите в редактор VBA. На экране появится окно проекта; вставьте модуль.
4. Вставьте в модуле новую процедуру с именем Сравнение_чисел.
5. Наберите текст программы.
Public Sub Сравнение_чисел()
Dim I As Integer, N1 As Integer, A As Integer, B As Integer
Randomize Timer
Rem N1 — количество пар
N1 = 1 + Int(Rnd * 30)
Rem Заполнение ячеек случайными числами в диапазоне от -50 до +50
With Sheets("Большее")
For I = 2 To N1
.Cells(I, 1) = Int(Rnd * 100) - 50
.Cells(I, 2) = Int(Rnd * 100) - 50
Next I
Rem Занесение пояснительных надписей в ячейки и форматирование
.Range("A1:D1").Font.Size = 11
.Range("A1:D1").Font.Bold = True
.Range("A1:D1").Font.Color = vbBlue
.Range("A1") = "1-е число"
.Range("B1") = "2-е число"
.Range("D1") = "Большее"
.Range("A1:D1").Select
Selection.Columns.AutoFit
For I = 2 To N1
A = .Cells(I, 1).Value
B = .Cells(I, 2).Value
If A > B Then
.Cells(I, 4).Value = A
ElseIf A = B Then
.Cells(I, 4).Value = "равны"
Else
.Cells(I, 4).Value = B
End If
Next I
End With
End Sub
6. Создайте кнопку для стирания результатов из столбцов А, В и D любым известным вам способом.
7. Интерфейс (см.рис.6.6.)
8. Сохраните свою работу.
Пример №4
“Функции листа”
Напишите программу вычисления максимума, минимума, среднего значения и произведения чисел, находящихся в диапазоне ячеек А1:А10 на листе “Пример3”. Выведите результаты вычисления с поясняющими надписями в ячейки С2:D5. Решите эти задачи двумя способами.
Подготовка исходных данных
1. Для того чтобы узнать правильное написание функции рабочего листа и ее применение, вспомним работу № 1, в которой мы обращались к окну Object Browser.
2. Войдем в окно просмотра объектов. Выберем в раскрывающемся списке Проект | Библиотека в верхнем левом углу экрана библиотеку объектов Excel.
3. В окне Классы выберем Application.
4. В окне списка Компоненты выберем WorksheetFunction. В нижней части окна появится Property WorksheetFunction As WorksheetFunction (ссылка).
Нажмем на ссылку, и в окне Компоненты появится список всех функций.
Подготовка текста программы.
5. Войдите в редактор VBA. На экране появится окно проекта; вставьте модуль.
6. Вставьте в модуле новую процедуру с именем Функции_листа.
7. Наберите текст программы.
Public Sub Функции_листа()
Dim I As byte, m As Integer, m1 As Integer,
SR As Long, proiz As Long
Randomize Timer
For I = 1 To 10
Sheets("Пример3").Cells(I, 1) = Int(Rnd * 10)
Next I
'Нахождение минимума
m = Application.Min(Sheets("Пример3").Range("A1:A10"))
'Нахождение максимума
m1 = Application.Max(Sheets("Пример3").Range("A1:A10"))
'Произведение
proiz = Application.Product(Sheets("Пример3").Range("A1:A10"))
'Среднее значение
SR = Application.Average(Sheets("Пример3").Range("A1:A10"))
'Вывод результатов
With Sheets("Пример 3")
.Cells(2, 3) = "МIN ="
.Cells(2, 4) = m
.Cells(3, 3) = "МAX ="
.Cells(3, 4) = m1
.Cells(4, 3) = "Произведение ="
.Cells(4, 4) = proiz
.Cells(5, 3) = "Среднее = "
.Cells(5, 4) = SR
End With
End Sub
8. Интерфейс (см.рис.6.7.)
9. Сохраните работу.
Пример №5
“Количество диаграмм”
Написать программу подсчета количества диаграмм на листе.
Подготовка исходных данных
- Заполните диапазон ячеек А1:А11 числами от -5 до 5 (использовать автоматическое заполнение по первым двум числам) (см. рис.10)
- Заполнить диапазон В1:В11 квадратами чисел диапазона А1:А11
- Заполнить диапазон С1:С11 квадратами чисел диапазона А1:А11 с противоположными знаками.
- Построить 2 графика : 1 график – переменные А1:А11, значение функции – В1:В11; 2 график – переменные А1:А11, значение функции – С1:С11.
Подготовка текста программы.
5. Войдите в редактор VBA. На экране появится окно проекта; вставьте модуль.
6. Вставьте в модуле функцию с именем КоличествоД.
7. Наберите текст программы.
Public Sub КоличествоД()
MsgBox ActiveSheet.ChartObjects.Count _
& " диаграммы"
End Sub
6. Интерфейс (см.рис.6.8)
Пример №6
“Сортировка данных”
Написать программу сортировки данных, находящихся в диапазоне ячеек А1:А20.
Подготовка исходных данных
- Заполните диапазон ячеек А1:А20 случайными целыми числами. (см.рис.11)
Подготовка текста программы.
2. Войдите в редактор VBA. На экране появится окно проекта; вставьте модуль.
3. Вставьте в модуле процедуру с именем Случайные числа. (см.прим. № 1)
4. Вставьте в модуле функцию с именем Сортировка.
5. Наберите текст программы.
Public Sub Сортировка()
Worksheets("Сортировка").Range("A1:A20").Sort _
Key1:=Worksheets("Сортировка ").Range("A1")
End Sub
6. Интерфейс (см.рис.6.9.)
7. Сохраните работу.
Пример №7
“Поиск”
Написать программу поиска числа в диапазоне. Найти количество вхождений.
Подготовка исходных данных
1. Заполните диапазон ячеек А1:А20 случайными целыми числами. (см.рис.12)
Подготовка текста программы.
2. Войдите в редактор VBA. На экране появится окно проекта; вставьте модуль.
3. Вставьте процедуру с именем Случайные числа. (прим. № 1)
4. Вставьте в модуле функцию с именем Поиск.
5. Наберите текст программы.
Public Sub Поиск()
Dim i As Integer, Col As Integer, A As Integer, B As Integer
Col = 0
.Range("A1:D1").Font.Size = 11
.Range("A1:D1").Font.Bold = True
.Range("A1:D1").Font.Color = vbBlue
.Range("A1") = "Числа"
.Range("B1") = "Искомое число"
.Range("C1") = "Количество"
.Range("A1:D1").Select
Selection.Columns.AutoFit
For i = 2 To 20
A = .Cells(i, 1).Value
B = .Cells(2, 2).Value
If A = B Then
Col = Col + 1
End If
.Cells(2, 3).Value = Col
Next i
End With
End Sub
6. Интерфейс (см.рис.6.10.)
7. Сохраните работу.
Пример №8
“Математическое ожидание”
Вычислить математическое ожидание и дисперсию по табличным данным:
Х | -2 | -1 | 0 | 2 |
Р | 0,3 | 0,1 | 0,4 | 0,2 |
Подготовка текста программы.
1. Войдите в редактор VBA. На экране появится окно проекта; вставьте модуль.
2. Вставьте в модуле функцию с именем Ожидание.
3. Наберите текст программы.
Public Sub Ожидание()
Dim i As Integer, X, P, Mx, Mx2, M2x, D As Single
With Sheets("Ожидание")
.Range("A1:A4").Font.Size = 11
.Range("A1:A4").Font.Bold = True
.Range("A1:A4").Font.Color = vbRed
.Range("A1") = " X "
.Range("A2") = " P "
.Range("A3") = " M {X} = "
.Range("A4") = " D = "
Mx = 0
Mx2 = 0
For i = 2 To 20
X = .Cells(1, i).Value
P = .Cells(2, i).Value
Mx = P * X + Mx
M2x = Mx * Mx
Mx2 = P * X * X + Mx2
D = Mx2 - M2x
Next i
.Cells(3, 2).Value = Mx
.Cells(4, 2).Value = D
End With
End Sub
4. Интерфейс (см.рис.6.11.)
5. Сохраните работу.
1.7. Урок №7
Тема: Управление файлами с помощью Visual Basic for Application
Приобретаемые знания: понятие атрибута файла; создание директории; копирование, перемещение, переименовывание и удаление файлов на диске; понятие текущего диска; поиск файлов, копирование в файл, запись в файл.
Основной материал:
1. Понятие об управлении файлами.
2. Атрибуты файла
3. Средства Visual Basic для управления файлами.
4. Примеры
1. Понятие об управлении файлами.
Когда говорят об управлении файлами, то имеют в виду операции, выполняемые с файлами на диске вашего компьютера. Оно включает в себя такие действия, как их резервное копирование, удаление ненужных файлов с целью очистить место на диске, перенос с одного диска или каталога на другой и создание или удаление папок на диске. Есть так же возможность просматривать в папке список файлов и определять их размер, а так же дату и время последнего изменения.
2. Атрибуты файла
Каждый файл на диске имеет атрибуты, какого бы типа ни был дисковод. Windows и DOS используют атрибуты файла, чтобы определить, какие действия по управлению файлами допустимы по отношению к нему. Например, эти системы запрещают вам – и любой прикладной программе – удалять, модифицировать или переименовывать файлы с атрибутом Только чтение.
Windows создает атрибуты, когда вами или работающей на компьютере прикладной программой создается файл. В сущности, атрибуты файла похожи на свойства объекта: они дают файлу некоторую характеристику. Атрибуты – это часть информации о файле, хранящемся на дисковом носителе. Windows хранит эту информацию вместе с именем файла, размером и данными о дате и времени.
Windows автоматически поддерживает и обновляет атрибуты файла. В основном вам не надо о них беспокоиться, и обычно нет причины знать, что это такое – атрибуты файла. Нов некоторых случаях уметь пользоваться ими очень важно. Знакомство с ними и их значениями особенно пригодиться при работе с функцией Dir системы VBA.
Для определения характеристик файла система Windows (и DOS) применяют всего 7 атрибутов файлов. Каждый из может быть скомбинирован с другими атрибутами, за исключением метки тома. Например, у файла одновременно могут быть атрибуты Скрытый, Системный, Архивный и Только чтение. Ниже перечислены имена и значения всех таких атрибутов.
- Архивный. Указывает, был ли файл изменен с того времени, как было проведено последнее резервное копирование такими программами, как Windows BACKUP, или средствами других производителей, например, Fastback!, BackIt, Norton Backup и т.д. если у файла установлен атрибут Архивный, то ему требуется резервное копирование. Если такого атрибута нет, то со времени последней такой операции файл изменен не был.
- Каталог. Если у файла атрибут Каталог, то это означает, что он в действительности каталог или подкаталог (по терминологии Windows – папка). Дисковый каталог в сущности файл, в котором хранится информация о других файлах; при создании каталога Windows создает соответствующий файл с атрибутом Каталог. Этот атрибут позволяет распознать файл с данными о других файлах и не дает его переименовать, скопировать или удалить как обычный файл данных.
- Скрытый. Если у файла атрибут Скрытый, то Windows «Скрывает» такой файл, не показывая его в большинстве случаев вывода каталогов на экран. Однако имеется режим просмотра, позволяющий показывать имена таких файлов.
- Обычный. Если у такого файла атрибут Обычный, то это, в сущности, означает отсутствие у него каких-либо специальных атрибутов. Это так называемый обычный атрибут файла (иногда называемый общим) только означает, других атрибутов файла нет, кроме, возможно, архивного, если требуется резервное копирование.
- Только чтение. Означает, что файл можно считывать, но не изменять. Windows запрещает изменять, удалять или переименовывать файлы с атрибутом Только чтение.
- Системный. Указывает Windows, что файл является частью операционной системы компьютера. Эта накладывает запрет на изменение файла, как и в случае с атрибутом Только чтение. Если с помощью DOS-команды Sys (или панели управления Windows) создается диск для загрузки, то на него переносится все файлы с атрибутом Системный.
- Метка тома. Указывает Windows, что файл является меткой тома на диске. Метка – это имя, которое дается жесткому или гибкому диску при его форматировании: для этого используется команда Dos Label или меняется свойство Метка в окне свойств диска. Метка диска, в сущности, - не полный файл, а только имя файла в корневом каталоге диска, имеющее атрибут файла Метка тома. На диске может быть только одна метка.
В Windows каждый отдельный атрибут файла представлен уникальным числовым кодом и сохраняется вместе с именем файла и данными о его размере. Если у файла несколько атрибутов, то их коды складываются, а сумма сохраняется.
Константы Visual Basic для атрибутов файлов | |||
Константа VBA | Десятичное значение | Двоичное значение | Атрибут |
vbNormal | 0 | 00000000 | Обычный |
vbReadOnly | 1 | 00000001 | Только чтение |
vbHidden | 2 | 00000010 | Скрытый |
vbSystem | 4 | 00000100 | системный |
vbVolume | 8 | 00001000 | Метка тома |
vbDirectiry | 16 | 00010000 | Каталог |
vbArchive | 32 | 00100000 | Архивный |
3. Средства Visual Basic для управления файлами.
В VBA предусмотрен набор встроенных функций для выполнения различных операций с файлами, каталогами, дисками и прочими объектами файловой системы.
Встроенные функции для работой с файловой системой, предусмотренные в VBA:
- CurDir() — функция, которая возвращает путь к текущему каталогу, в котором будут сохраняться файлы нашего приложения по умолчанию.
- Dir() — позволяет искать файл или каталог по указанному пути на диске
- EOF() — при операции записи в файл на диске эту функция вернет True, если вы находитесь в конце файла. Используется при записи в файл своего собственного формата. При сохранении документов Word, книг Excel и т.п. лучше использовать стандартные методы объектов этих документов: Save и SaveAs().
- Error() — позволяет вернуть описание ошибки по ее номеру. Генерировать ошибку нужно при помощи метода RaiseError() специального объекта Err (см. главу 6, в которой рассказывается про перехват ошибок и отладку).
- FileAttr() — позволяет определить, как именно был открыт вами файл в файловой системе: на чтение, запись, добавление, в двоичном или текстовом режиме и т.п.
- FileDateTime() — позволяет получить информацию о последнем времени обращения к указанному вами файлу. Если к файлу после создания ни разу не обращались, то это будет время создания файла.
- FileLen() — позволяет определить длину указанного вами файла в байтах.
- FreeFile() — позволяет определить следующую свободную цифру, которую можно использовать как номер файла при его открытии.
- GetAttr() — возможность обратиться к файлу к файловой системе и получить информацию об его атрибутах (скрытый, доступен только для чтения, архивный и т.п.)
- Input() — позволяет считать информацию из открытого файла.
- Вариант этой функции — InputB() позволяет указывать количество байт, которые надо скачать из файла.
- Loc() — от Location, то есть местонахождение — возвращает число, которое определяет текущее место вставки или чтения в открытом файле. Похоже работает функция Seek(), но она возвращает информацию о позиции, с которой будет выполняться следующая операция чтения или вставки.
- LOF() — от length of file — позволяет определить длину открытого файла в байтах.
- DoEvents() — очень важная функция. Она позволяет на время отвлечься от выполнения какой-то операции VBA и передать управление операционной системе, чтобы обработать накопившиеся в операционной системе события (например, нажатия клавиш пользователем). После этого продолжение операции VBA продолжается. Если у вас работает очень долгая операция (поиск на дисках, обработка большого объема данных и т.п.) и вы хотите дать пользователю возможность быстро прервать эту операцию, можно выполнять эту команду, например, каждый раз после обработки определенной "порции" данных.
- Environ() — возвращает абсолютный путь для переменных окружения компьютера (полный список переменных, доступных на вашем компьютере, можно просмотреть, если в командной строке выполнить команду SET). Например, вам нужно записать что-то в файл во временном каталоге. Абсолютный путь к временному каталогу на вашем компьютере можно получить так: MsgBox Environ("TEMP")
- GetAllSettings() — получить (в виде двухмерного массива) из реестра все параметры, которые относятся к указанному вами приложению. SaveSetting() позволяет записать эту информацию в реестр, DeleteSetting() — удалить. GetSetting() позволяет получить информацию об определенном параметре. Замечу, что эти методы позволяют обращаться только к одному очень далекому уголку реестра в ветви HKEY_CURRENT_USERS. Обращаться к другим параметрам реестра при помощи этих методов бесполезно. Рекомендую для работы с реестром использовать объектную библиотеку Windows Script Host Object Model, которая также есть на любом компьютере под управлением Windows 2000, XP и 2003. Нужный объект называется WSHShell, методы — RegRead(), RegWrite() и RegDelete().
- Partition() — позволяет определить, к какому диапазону из наборов значений относится переданное вами число и возвращает описание этого диапазона (в виде строки). Обычно используется при выполнении запросов к базам данных.
- QBColor() — позволяет перевести обозначение цвета из древнего номерного обозначения с возможными 16 значениями в RGB-код, который понимается VBA. Обычно используется при переделке унаследованных программ.
- RGB() — еще одна функция для работы с цветом. Позволяет вернуть цветовой код, который можно использовать для присвоения цвета в коде, приняв три значения для цветов: красного (Red), зеленого (Green) и синего (Blue). Значение для каждого из основных цветов могут варьироваться от 0 до 255. Например, самый зеленый из возможных цветов получится, если переданные этой функции значения будут выглядеть как RGB(0,255,0).
- Shell() — позволяет запустить из VBA внешний программный файл и вернуть информацию о его Program ID в операционной системе. Обычно используется опытными разработчиками при применении ими в программах возможностей Windows API. С практической точки зрения эту функцию можно использовать для запуска любых внешних программ из вашего приложения, хотя, с моей точки зрения, применение специальных объектов WshShell и WshExec из библиотеки Windows Script Host Object Model удобнее (можно передавать в окно клавиатурные комбинации, принимать и передавать значения через командную строку и т.п.).
- TypeName() — функция, которая возвращает имя типа данных для переданной ей переменной. Очень удобна для определения типа данных для значения, полученного из базы данных или путем вызова метода какого-то объекта.
- VarType() — делает почти то же самое, но вместо имени возвращает числовой код, который обозначает тип данных. Можно использовать для программных проверок типов данных для переменных.
4. Примеры
Пример 1. Использование функции CurDir для получения текущих каталога и дисковода
Sub Получение_текущих_каталога_и_дисковода ()
1: Dim dirName As String
2: Dim dirLetter As String
3: dirName = CurDir()
4: dirLetter = Left(dirName, 1)
5: MsgBox "Текущий дисковод - " & dirLetter
6: MsgBox "Текущая директория - " & dirName
7: dirName = CurDir("D")
8: MsgBox "Текущая директория на диске D - " & _
9: dirName
10: End Sub
В строках 1 и 2 описаны переменные этой процедуры. Переменная DirName предназначена для хранения результата выполнения CurDir, а DirLetter – для хранения буквы дисковода, извлеченной из DirName.
В строке 3 вызывается функция CurDir без аргументов, чтобы получить текущие папку и дисковод, результат же выполнения присваивается переменной DirName. В строке 4 для копирования первой буквы у CurDir и присвоения ее DirLetter используется функция Left. Поскольку CurDir возвращает полный путь, с буквой дисковода включительно, первый символ результата выполнения этой функции всегда является буквой дисковода.
В каждой из строк 5 и 6 на экран выводятся сообщения; в первом из них говорится о букве текущего дисковода, а во втором – о текущей папке этого дисковода.
Затем в строке 7 снова вызывается функция CurDir, на этот раз с аргументом – буквой D. в данном случае требуется получить текущую папку на диске D. если при выполнении процедуры в этом дисководе нет диска, то вы можете получить сообщение об ошибки времени выполнения.
В строке 8 выводится сообщение о текущей папке на дисководе D.
Пример 2. Использование функции MkDir для создания нового каталога
Sub Создание_нового_каталога ()
1: Dim newDir As String
2: newDir = "D:\test1"
3: MkDir newDir
4: ChDir newDir
5: MsgBox "Текущая директория на диске D: - " & _
6: CurDir("D")
7: End Sub
В строке 1 описана переменная newDir типа String для хранения имени новой папки.
В строке 2 этой переменной присваивается значение D:\test1.
В строке 3 для создания новой папки используется инструкция MkDir.
В строке 4 новая папка назначается текущей на диске D.
В строках 5 и 6 для вывода на экран сообщения о текущей папке на D используется MsgBox (как подтверждение создания новой папки).
Пример 3. Использование функции RmDir для удаления каталога
Sub Удаление_каталога ()
1: Dim delDir As String
2: delDir = "D:\test1"
3: If CurDir("D") = delDir Then ChDir "D:\"
4: RmDir delDir
5: MsgBox "Удален каталог test1"
6: End Sub
В строке 1 описана переменная delDir типа String для хранения имени удаляемой папки.
В строке 2 этой переменной присваивается значение D:\test1 (предполагается, что папка test1 существует на диске D).
В строке 3 для определения на диске D текущей папки вызывается функция CurDir. Если удаляемая папка оказывается текущей, то в этой же строке 3 вызывается функция ChDir, чтобы на диске D сделать текущим корневой каталог. Папку нельзя удалить, если она является текущей или не пустой. В строке 4 для удаления с диска D подкаталога test1 используется инструкция RmDir.
Пример 4. Использование функции FileCopy для копирования файла на другой диск или в другую директорию
Sub Копирование_файла ()
1: Dim sName As String
2: Dim dName As String
3: Do
4: With Application
5: sName = .GetOpenFilename(Title:= _
6: "Выбор копируемого файла")
7: If sName = "False" Then Exit Sub
8: dName = .GetSaveAsFilename(Title:= _
9: "Выбор места для копии")
10: If dName = "False" Then Exit Sub
11: End With
12: FileCopy Source:=sName, Destination:=dName
13: Loop
14: End Sub
Эта процедура дает пользователю возможность выбрать для копирования файл, а затем указать диск и папку, куда копировать, и имя для копии (целевого файла).
В строках 1 и 2 описаны 2 переменные типа String для хранения имен исходного и целевого файлов.
В строке 3 начинается бесконечный цикл Do (цикл без определенных условий). Цикл из строк с 3 по 13 выполняется до тех пор, пока пользователь не отменит одну из двух файловых операций.
В строке 4 начинается инструкция With Application.
В строках 5 и 6 находится инструкция, которая вызывает метод GetOpenFilename для вывода на экран окна открытия файла и присваивает имя файла (результат выполнения метода) переменной sName.
В строке 7 проверяется, не отменил ли пользователь открытие файла. Если да, то процедура завершается. Если не отменил, то VBA продолжает работу и выполняет в строках 8 и 9 инструкцию, вызывающую метод GetSaveAsFilename, чтобы дать пользователю выбрать для целевого файла имя, дисковод и папку.
В строке 10 проверяется, не отменил ли пользователь эту операцию. Если отменил, то процедура завершается. Если нет, то VBA продолжает работу и выполняет в строке 12 инструкцию FileCopy. При выполнении этой инструкции происходит копирование файла (чье имя хранится в sName) в другой файл, чье имя, дисковод и папка хранятся в dName. После копирования цикл Do повторяется.
Пример 5. Использование функции Kill для удаления файлов
Sub Удаление_файла ()
1: Dim fName As String
2: Dim Ans As Integer
3: Do
4: With Application
5: fName = .GetOpenFilename(Title:="Удаление
файла")
6: End With
7: If fName = "False" Then Exit Sub
8: Ans = MsgBox(prompt:="Удалить " & fName & "?", _
9: Title:="Удаление файла ", _
10: Buttons:=vbQuestion + vbYesNo)
11: If Ans = vbYes Then
12: Kill fName
13: End If
14: Loop
15: End Sub
В этой процедуре вначале используется метод GetOpenFilename, чтобы пользователь выбрал имя файла, затем подтверждается удаление, удаляется файл и затем выполнение повторяется.
В строке 1 описана переменная типа String для хранения имени файла, а в строке 2 переменная типа Integer для хранения ответа пользователя на сообщение с просьбой дать подтверждение.
В строке 3 начинается бесконечный цикл Do, который выполняется до тех пор, пока пользователь не отменит операцию с файлом.
В строке 4 начинается инструкция With.
В строке 5 вызывается метод GetOpenFilename и присваивается имя файла (результат выполнения метода) переменной fName.
В строке 7 проверяется, не отменил ли пользователь открытие файла. Если да, то процедура завершается.
В строках 8-10 находится инструкция MsgBox, которая просит пользователя подтвердить удаление выбранного файла. В случае подтверждения VBA в строке 12 выполняет инструкцию Kill, которая удаляет файл.
! Перед удалением файлов следует проверять их атрибуты. В случае попытки удалить файлы с атрибутами Скрытый, Системный или Только чтение VBA выдаст сообщение об ошибке времени выполнения. Если требуется удалить файлы с этими атрибутами, используйте такие функции как GetAttr, чтобы узнать атрибуты, и SetAttr, чтобы их изменить.
Пример 6. Использование функции Name для переименование и перемещения файлов
Sub Переименование_и_или_премещение_файла ()
1: Const iTitle = "Переименование - "
2: Dim oldName As String
3: Dim newName As String
4: Dim oldDir As String
5: oldDir = CurDir()
6: With Application
7: oldName = .GetOpenFilename(Title:=iTitle & "Выбор
файла")
8: If oldName = "False" Then Exit Sub
9: newName = .GetSaveAsFilename (InitialFileName:=
oldName, _
10: Title:=iTitle & "Новое имя")
11: If newName = "False" Then Exit Sub
12: End With
13: If Left(oldName, 1) = Left(newName, 1) Then
14: Name oldName As newName
15: Else
16: FileCopy oldName, newName
17: Kill oldName
18: End If
19: ChDrive oldDir
20: ChDir oldDir
21: End Sub
Эта процедура переименовывает и перемещает файл. Пользователь выбирает имя, папку и дисковод для первоначального файла и для его нового имени и/или места расположения.
В строке 1 описана строковая константа, используемая в заголовках окон, выводимых в процедуре. Переменная oldName предназначена для хранения старого имени файла и newName – для нового, а oldDir предназначена для хранения имени диска и папки, являющихся текущими в момент начала выполнения процедуры, с тем чтобы восстановить их после ее завершения.
В строке 5 вызывается функция CurDir и присваивается ее результат переменной oldDir.
В строке 6 начинается инструкция With Application.
В строке 7 используется метод GetOpenFilename, чтобы пользователь выбрал файл, который надо переименовать или переместить.
В строке 8 используется инструкция If для проверки, не отменил ли пользователь открытие файла. Если да, то процедура завершается.
В строке 9 вызывается метод GetSaveAsFilename, чтобы дать пользователю выбрать новые имя, дисковод и папку.
В строке 11 проверяется, не отменил ли пользователь эту операцию. Если отменил, то процедура завершается.
В строке 13 начинается инструкция If…Then…Else, которая проверяет, выбрал ли пользователь для переноса файл на другой диск. В ее логическом выражении для получения первой буквы из каждой строки oldName и newName используется функция Left. Если буквы одни и те же, то это значит, что пользователь переименовывает или переносит файл на том же диске.
В строке 14 выполняется инструкция Name, чтобы переименовать файл. Если пути по каталогам в oldName и newName различны, то Name переносит файл в новую папку.
Если первые буквы в строках oldName и newName различны, это значит, что пользователь выбрал перенос файла на другой диск. В этом случае нельзя использовать инструкцию Name, поэтому в процедуре вначале для копирования файла с одного на другой применяется FileCopy, а затем для удаления исходного файла – Kill.
! Не путайте инструкцию Name со свойством Name, которое имеется у многих объектов. Инструкция переименовывает файлы, а свойство хранит имя объекта.
Не пытайтесь с помощью инструкции Name переместить файл с одного диска на другой.
Не пытайтесь переименовать открытый файл. Если вы это сделаете, VBA выдаст сообщение об ошибке времени выполнения. Файл вначале надо закрыть.
Пример 7. Использование функции GetAttr и интерпретация ее результата
*: Sub Атрибут (fName As String)
1: Dim fAttr As Integer
2: Dim mStr As String
3: fAttr = GetAttr(fName)
4: mStr = UCase(fName)
5: mStr = mStr & " имеет следующие атрибуты: " &
vbCr
6: If (fAttr And vbReadOnly) Then _
7: mStr = mStr & "Только чтение" & vbCr
8: If (fAttr And vbHidden) Then _
9: mStr = mStr & "Скрытый" & vbCr
10: If (fAttr And vbSistem) Then _
11: mStr = mStr & "Системный" & vbCr
12: If (fAttr And vbVolume) Then _
13: mStr = mStr & "Volume" & vbCr
14: If (fAttr And vbDirectory) Then _
15: mStr = mStr & "Директорий" & vbCr
16: If (fAttr And vbArchive) Then _
17: mStr = mStr & "Архивный" & vbCr
18: MsgBox mStr
19: End Sub
20: Sub Чтение_атрибута_файла()
21: Dim strPath As String
22: Атрибут fName:="c:\io.sys"
23: Атрибут fName:="c:\msdos.sys"
24: strPath = Application.StartupPath
25: Атрибут fName:=strPath
26: End Sub
В примере 1 представлены 2 различные процедуры. Первая, Атрибут, находится в строках 1-19, а вторая, Чтение_атрибута_файла, - в строках 20-26. Вторая процедура просто несколько раз вызывает первую, каждый раз передавая другое имя файла.
В строке * находится описание процедуры Атрибут, у которой имеется один обязательный аргумент с именем fName и типом данных String.
В строке 1 описана переменная fAttr с типом данных Integer, предназначенная для хранения значения, возвращаемого функцией GetAttr.
В строке 2 описана переменная mStr с типом данных String, в которой будет хранится сообщение, создаваемое этой процедурой.
Когда VBA выполняет инструкцию из строки 3, то он вызывает GetAttr, передавая в качестве аргумента строку, хранящуюся в переменной fName; результат выполнения сохраняется в переменной fAttr. Если файл с указанным именем не найден на диске, то на экран выводится сообщение об ошибке времени выполнения с текстом: File not found.
В строках 4 и 5 находится первая часть создаваемого процедурой сообщения. В первой их них находится функция UCase, предназначенная для преобразования fName в верхний регистр.
В строках 6-17 находится несколько инструкций It…Then, оценивающих хранящееся в fAttr число, которое является суммой числовых кодов атрибутов файла. Обратите внимание, что эти инструкции не являются вложенными. Наоборот, значение fAttr тестируется 6 раз и при том проверяется каждое возможное значение. Если инструкция If…Then находит интересующий ее атрибут, то в строку из mStr добавляется ее имя.
В строке 18 выводится сообщение, созданное предыдущими инструкциями, а в строке 19 процедура Атрибуты завершается.
В строке 20 дано описание процедуры Чтение_атрибута_файла, которая несколько раз вызывает Атрибуты .
В строке 22 Атрибуты выводит на экран атрибуты файла IO.SYS. он является частью операционной системы Windows и всегда расположен в корневом каталоге диска начальной загрузки. Как часть операционной системы файл IO.SYS имеет атрибут Системный; у него есть еще атрибут Только чтение, который предотвращает удаление этого жизненно важного файла. Кроме того, он имеет атрибут Скрытый, так что его обычно не видно в окнах файлов Windows или в списках каталогах программы проводник.
В строке 25 вместо имени файла задается имя папки (папка автозагрузки). После того, как выполнится эта строка, на экране появится сообщение, в котором будет говориться об атрибуте Каталог. Последнее сообщение, в зависимости от того, выполнили ли вы недавно резервное копирование Personal.exe или нет, выведет или не выведет атрибут Архивный.
Пример 8. Использование функций FileDateTime и FileLen для определения даты, времени изменения и размера файлов.
Sub Определение_атрибутов_файла (fName As String)
1: Dim msg1 As String
2: Dim msg2 As String
3: Dim fDate As Date
4: Dim fLen As Long
5: fDate = FileDateTime(fName)
6: fLen = FileLen(fName)
7: msg1 = "Размер: "& Format(fLen, "###,###,###") & _
8: " байт."
9: msg2 = "Дата последнего изменения: " & _
10: Format(fDate, "long date") & _
11: Format(fDate, "long time")
12: MsgBox Title:="File date and size", _
13: prompt:=fName & Chr(13) & _
14: msg1 & Chr(13) & msg2
15: End Sub
16: Sub Определение_даты_времени_изменения_и_размера
_файла ()
17: Dim sName As String
18: Do
19: With Application
20: sName = .GetOpenFilename(Title:="Размер и дата изменения файла")
21: End With
22: If sName <> "False"
Then Определение_атрибутов_файла sName
23: Loop Until sName = "False"
24: End Sub
В строках с 1 по 4 описано насколько переменных. Первые 2 – msg1 и msg2 – используются при составлении текста, выводимого процедурой сообщения. Переменная fDate предназначена для хранения даты и времени, а fLen – для хранения длины файла. Обратите внимание, что у fLen тип Long, так как длина файла может достигать миллионов байтов.
В строке 5 вызывается функция FileDateTime, которая для указания имени файла использует аргумент fName, и в той же строке результат выполнения функции сохранится в переменной fDate.
В строке 6 вызывается функция FileLen, использующая тот же аргумент fName, и в той же строке 6 результат выполнения функции сохранится в переменной fLen.
В строках 7 и 8 содержится инструкция, создающая первую часть выводимого процедурой сообщения и сохраняющая ее в msg1.
В строках 9-11 содержится другая инструкция, создающая вторую часть сообщения и сохраняющая ее в msg2.
В строках 12-14 инструкция MsgBox выводит на экран имя файла, его размер, а так же дату и время его последнего изменения.
В строках 16-23 содержится процедура, которая тестирует ShowFileDateSize. При этом вначале используется метод GetOpenFilename, чтобы обеспечить возможность выбрать файл, а затем вызывается процедура ShowFileDateSize. Она выводит на экран сообщение о дате, времени и размере файла.
Пример 9. Использование функций Open, Input, Print для копирования информации из файла в файл.
Sub Копирование_из_файла()
1: Dim T As String, Text1, Text2 As Integer
2: Text1 = FreeFile()
3: Open "E:\TEXT\MyS.txt" For Input _
As Text1
4: Text2 = FreeFile()
5: Open "E:\TEXT\MyD.txt" For Output _
As Text2
6: Do While Not EOF(Text1)
7: Input #Text1, T
8: If Left(T, 1) = "3" Then
9: Print #Text2, T
10: End If
11: Loop
12: Close #Text1, #Text2
13: End Sub
В строке 1 объявляются переменные T , Text1, Text2.
В строках 2-3 открывается файл MyS.txt, с которого будет проводиться копирование.
В строках 4-5 открывается файл MyD.txt, в который будет производиться копирование.
Примечание: Файлы MyS.txt и MyD.txt должны быть созданы до выполнения программы, иначе будет выдано сообщение о времени выполнения.
В строках 6-7 производится считывание из файла.
В строках 8-9 производится копирование третьей строки в файл.
В строке 12 закрываем оба файла.
Пример 10. Использование функций Open, Output, Print для записи в файл.
Sub Запись_в_файл()
1: Dim Text1 As Integer
2: Text1 = FreeFile()
3: Open "E:\TEXT\MyS.txt" For Output _ As Text1
4: Print #Text1, "VBA for Excel"
5: Print #Text1, "4. Обработка данных, статистика"
6: Print #Text1, "6. Формирование файлов"
7: Close #Text1
8: End Sub
В строке 1 объявляется переменная Text1.
В строке 2-3 открывается файл MyS.txt для записи.
В строках 4-6 производится запись в файл строк: VBA for Excel, 4. Обработка данных, 6. Формирование файлов.
В строке 7 файл закрывается.
2. Задачи для самостоятельной работы
2.1. Урок №1
- Запись макроса с помощью макрорекордера. Например, создать список своей группы.
- В редакторе Visual Basic измените созданный вами в задании№1 макрос. Например, изменить список группы на список экзаменов.
- Создайте простую функцию, которая перемножала бы два числа и возвращала результат.
- Записать с помощью макрорекордера «Титульный лист».
- Используя функцию и процедуру создать макрос для расчета силы тяжести по известной формуле F=m*g, где g=9,81.
- При помощи редактора VBA изменить предыдущий макрос для расчета прогнозной величины ВВП на следующий год на основании данных 2008 и 2009 годов, используя формулу арифметической прогрессии.
- Используя Макрорекордер создать макрос – пустой фирменный бланк предприятия.
- Используя функции и процедуры написать в редакторе VBA макрос по расчету сложной формулы ax+by=? a,x,b,y являются исходными данными.
- Оформляя созданную форму необходимым образом, создать несколько макросов для расчета sin(x), cos(x), tan(x), ctg(x).
- При помощи редактора VBA изменить предыдущие макросы и заменить в них искомые формулы на: arcsinх, arccosх, arctanх, arcctgх.
2.2. Урок №2
- Спроектируйте окна сообщений с помощью MsgBox.
- Откройте Excel, переименуйте Лист1 в “Сообщения”.
- На листе Excel создайте кнопку: .
- Присоедините к кнопке программу, в результате которой появятся окна с различными сообщениями.
- Спроектируйте несколько окон сообщений и оформите их посредством MsgBox.
- Сохраните свою работу.
- Используя теорему Пифагора создать программу для вычисления гипотенузы в прямоугольном треугольнике с помощью окон MsgBox, InputBox.
- Создать простейший калькулятор(+, -, *, /) с помощью окон MsgBox, InputBox.
- Создать пользовательскую форму: изменить окраску, вставить рисунок, поместить кнопки и переименовать их.
- Создать 3 кнопки с присвоением каждой из них макроса. Каждая из кнопок должна считать соответственно НДС (18%), НДФЛ (13%), НП (24%). Для каждой кнопки использовать InputBox, MsgBox.
- Написать макрос по расчету среднего количества учащихся в классах А, Б, В и Г с помощью InputBox, MsgBox.
- Воспользовавшись InputBox, MsgBox, создать программу нахождения определителя матриц размера 3х3.
- На чистой форме создать кнопку и присвоить ей макрос. Макрос должен выводить InputBox 2 раза для ввода числа и размера его процента, а также MsgBox для вывода результата.
- С помощью InputBox, MsgBox написать макрос по решению следующей задачи: водитель проехал расстояние S (км) со средним расходом топлива R (л/100км), также известна цена 1л. топлива P (р/л). В какую стоимость обошлась поездка водителю?
- Используя InputBox, MsgBox создать пригласительную открытку на корпоративный вечер.
- Написать макрос для расчета чистого дисконтированного дохода предприятия на 5 лет. Ставку дисконтирования (Ен) принять равной 10%. Для ввода исходных данных Зi и Pi использовать InputBox. Для вывода результата MsgBox. Искомую формулу принять ЧДД = ∑ ((Pi-Зi)/(1+Ен)i)
2.3. Урок №3
- С помощью конструкций If-then, Select Case составить процедуру,
которая выводит день недели по его номеру 1..7.
- С помощью конструкций Go to, For Each Next составить процедуру, которая переводит каждый элемент массива a[i] *в –a[i].
- С помощью конструкции With-End With составить процедуру, которая изменяет несколько различных свойств объекта Range.
- Составить процедуру, которая выводит оценку по количеству баллов x:
100>=x>80 – 5;
80>=x>60 – 4;
60>=x>40 –3;
x<40 –неудов.
- Для матрицы = найти .
- Для матрицы = найти .
- Составить процедуру, которая выводит порядковый номер месяца 1.. 12 по его названию.
- Составить процедуру, которая каждый четный элемент массива переводит в 0 , а не четный в 1.
- Составить процедуру, которая находит скалярное произведение двух векторов.
- Составить процедуру, которая находит длину вектора.
2.4. Урок №5
- Отсортировать одномерный массив, состоящий из 10 элементов.
- Отсортировать квадратную матрицу 5*5.
- В матрице 3*4 найти элемент с наибольшим и элемент с наименьшим значением с помощью сортировки.
- В матрице 3*4 найти элемент с наибольшим и элемент с наименьшим значением без использования сортировки.
- Для матрицы найти разность между значениями наибольшего и наименьшего элементов.
- Для вектора найти сумму значений наибольшего и наименьшего элементов.
- Составьте процедуру, которая находит количество элементов равных данному числу.
- Вычислите матрицу В, элементами которой являются квадраты элементов матрицы А, и найдите среди них наибольший. Причем в матрице А элементы различного знака.
- Дан вектор В. Составьте вектор А, такой что А[1]=B[1]+B[2], А[2]=B[2]+B[3] и т.д. А[n]=B[n], и найдите элемент с наименьшим значением.
- Дан вектор В. Составьте вектор А, такой что А[1]=B[1]*B[2], А[2]=B[2]*B[3] и т.д. А[n]=B[n], и найдите элемент с наибольшим значением.
2.5. Урок №6
- Напишите программу вычисления процента от суммы чисел, находящихся в диапазоне ячеек А1:А20. Сравните полученное число с исходными данными. При совпадении чисел вывести индексы элемента.
- Написать программу сравнения дробных чисел, находящихся в диапазоне А1:В10. При равенстве чисел, сравнить сумму их координат. Оформить решение как диапазона вида
i1+j1 | < , >, = | i2+j2 |
- Найдите корни многочлена, заданного массивом своих коэффициентов, по схеме Горнера.
- Составьте квадратное уравнение по его корням, используя обратную теорему Виета.
- Напишите программу сравнения второй цифры сначала числа и третьей цифры с конца числа. Найти разность и произведение этих цифр.
- Дан массив А = {1..9}. Записать элементы массива в одну ячейку.
- Дано число С в десятичной с.с. Перевести это число в двоичную с.с.
- Найти НОК и НОД двух чисел; трех чисел.
- Используя встроенные функции, написать программу вычисления значения функции. Построить график этой функции.
- Вычислить математическое ожидание и дисперсию
Х | -3 | -2 | -1 | 0 | Х | 1 | 3 | 5 | 7 | |
Р | 0,5 | 0,3 | 0,1 | 0,1 | Р | 0,2 | 0,3 | 0,1 | 0,4 |
2.6. Урок №7
- Найдите ошибку.
В этих двух фрагментах программы есть источник ошибки выполнения. В чем именно? (При выполнении упражнения исходите из предложения, что fName – переменная типа String)
(А) fName = GetOpenFilename
(Б) With Application
fName = GetSaveAsFileName
End With
- Найдите ошибку.
В инструкции есть источник ошибки времени выполнения. Где именно?
Name “C:\EXAMPLES\SALES.XLS” As “A:\SALES.XLS”
- Эквивалентны ли следующие два оператора:
(А) If A >= B Then A = A * 2
(Б) If A >= B Then
A = A * 2
End If
- Создайте вложенные друг в друга каталоги на диске С, следующим
образом: С:\test1\test2\test3.
- Выполнить следующие действия:
1. Создать новый файл.
2. Скопировать все необходимые из исходного файла в этот новый файл.
3. Закрыть исходный файл и с помощью оператора Kill удалить его.
4. С помощью оператора Name переименовать новый файл, дав ему имя исходного файла.
- Создайте программу, которая возвращает список каталогов на диске C.
- Используя функцию IsDickFile напишите функцию с именем IsDiscFolder, возвращающую значение True, если указанная папка существует, и False в противном случае.
- Создайте 2 файла: Файл1 и КопияФайл1. Заполните Файл1 своими личными данными. Копируйте данные из Файл1 в КопияФайл1. В КопияФайл1 форматируйте текст: задайте цвет, шрифт. Удалите Файл1.
- Создайте программу, записывающую саму себя в файл.
- Создайте программу, которая запишет данные Файл1 в Файл2, данные Файл2 в Файл1, а исходные данные удалит.
3. Контрольные вопросы
3.1. Урок №1
- Что такое макрорекордер, макрос?
- В чем заключается принцип работы макрорекордера? Как записать
макрос в макрорекордере?
- Способы остановки макроса в макрорекордере?
- Каким образом можно запустить макрос, которому не назначена кнопка и
клавиатурная комбинация?
- Какими способами можно вызвать редактор?
- Опишите следующие окна: ToolBox, Code, Properties.
- Назовите три способа вызова окно проводника Project Explorer.
- Что такое стандартный модуль, модуль классов, пользовательская форма?
- Как открыть окно свойств и что оно позволяет?
- Как открыть редактор кода Code Editor, и как он устроен?
- Какие типы процедур вы знаете?
- Чем полезны закладки и когда они применяются?
- В каком случае выполняется процедура типа Sub?
- Для чего нужны процедуры свойства Property?
- Каким образом можно объявить процедуру?
- Понятие параметра? Способы передачи параметров, их различия?
- Когда применяется конструкция End и когда Exit?
3.2. Урок №2
- Дайте определение понятию экранная форма?
- Этапы работы с пользовательской формой?
- Что необходимо сделать для создания пользовательской формой?
- Каким способом возможно вызвать панель элементов управления?
- В чем суть элементов управления: Label, TextBox, ListBox, ComboBox?
- Назовите команду необходимую для отображения окна свойств?
- Наиболее часто используемые свойства UserForm и их значения?
- Каким образом производится размещение элементов на форму?
- Запишите функцию для создания окна сообщения?
- Что такое сообщение, атрибуты, заголовок, умолчание?
- Для чего применяются окна InputBox? Ее синтаксис?
- Для чего применяется MsgBox?
- В чем отличия между функциями InputBox, MsgBox?
3.3. Урок №3
- В каких случаях используется конструкция Go to? Укажите синтаксис этой конструкции.
- В каких случаях используется конструкция If-then? Укажите синтаксис этой конструкции.
- В каких случаях используется конструкция With-End-With? Укажите синтаксис этой конструкции.
- В каких случаях используется конструкция Select Case? Укажите синтаксис этой конструкции.
- В каких случаях используется конструкция For Each Next? Укажите синтаксис этой конструкции.
- Когда происходит выход из конструкции Go to?
- Когда происходит выход из конструкций If-then, With-End With, Select Case, For Each Next?
- Назовите сходства и различия операторов If-Then-Else и Select Case.
- Каким образом объявляются массивы?
- Назовите разновидности массивов.
3.4. Урок №4
- Назовите функции объекта Aplication.
- Перечислите свойства объекта Aplication. Что они означают?
- Являются ли свойства объекта Aplication объектами Excel?
- Что собой представляют коллекции? Перечислите коллекции объектов.
- Назовите методы и свойства Workbook. Что они озночают?
- Что собой представляет объект Range?
- Перечислите свойства объекта Range. Что лни озночают?
- Если вы хотите вывести что-либо в ячейку, какой объект вы выберите?
- Что означает слово Active перед объектом?
- Какие свойства отвечают за формулы в ячейках?
3.5. Урок №5
- Каким образом сортируются многомерные массивы?
- Каким образом находятся элемент с наименьшим и элемент с наибольшим значением в массиве?
- Назовите способы сортировки массивов.
- Вы отсортировали массив. Где в массиве будут располагаться элементы с наибольшим и наименьшим значениями?
- Дан массив Dim A(0 To n,0 To m) As Integer. Определите сколько в нем элементов.
- Что выполняет цикл
For i = 0 To n-1
For j = i + 1 To n
If A(i) > A(j) Then
Temp = A(j)
A(j) = A(i)
A(i) = Temp
End If
Next j
Next i
- Что выполняет процедура
Sub BubbleSort2()
Dim A(0 To n) As Integer
Dim Temp As Integer
For i = 0 To n-1
For j = i + 1 To n
If A(i) < A(j) Then
Temp = A(j)
A(j) = A(i)
A(i) = Temp
End If
Next j
Next i
End Sub
3.6. Урок №6
- Какие величины называют данными?
- Назовите виды данных. Дайте краткую характеристику по каждому виду.
- Перечислите типы данных и диапазон их значений.
- Дайте определение понятию «имена». Перечислите условия, которые необходимо выполнять при задании имени объекту.
- Дайте определение понятию «переменная». Объясните смысл выражения «объявить переменную».
- Дайте определение понятию «массивы». Назовите виды массивов и способы их задания.
- Назовите виды операций, существующих в VBA.
- Что представляет собой оператор?
- Как назначить автофигуре процедуру?
- Расскажите принцип работы процедур Сумма1способ и
Сумма2способ(Пр.Раб. №2). В какой из них используются встроенные
функции?
- Для чего применяют функцию Selection.Columns.AutoFit? (Пример №3)
- Какой объект будет добавлен после применения функции Charts.Add?
(Пример №5)
- Напишите формулы для вычисления математического ожидания и
дисперсии. (Пример №8)
- Найдите ошибки в программе:
Dim i, A, B, Col As String
With Sheets("Лист1")
Col = 0
For i = 2 To 20
A = .Cells(i, 1).Value
B = .Cells(2, 2).Value
If A = B Then
Col = Col + 1
End If
.Cells(2, 3).Value = Col
End Sub
3.7. Урок №7
- Назовите семь атрибутов файлов. Дайте характеристику этим атрибутам.
- Если у файла несколько атрибутов, то как их выразить одним числом?
- Какая функция применяется для чтения атрибутов файла? Что она возвращает?
- В каком случае может быть виден файл, имеющий атрибут Скрытый?
- Можно ли использовать SetAttr для задания атрибутов Каталог или Метка тома?
- Сопоставьте:
1 | vbNormal | а | Только чтение |
2 | vbReadOnly | b | Архивный |
3 | vbHidden | c | Каталог |
4 | vbSystem | d | Метка тома |
5 | vbVolume | e | Обычный |
6 | vbDirectiry | f | Скрытый |
7 | vbArchive | g | Системный |
- В каких единицах функция FileLen() определяет длину файла?
- Что делают методы GetOpenFilename и GetSaveFilename?
- Чем отличаются функции LOF() и EOF()? CurDir() и Dir()?
- Как пользоваться функцией Dir для поиска в папке нескольких файлов?
- Как узнать текущие дисковод и папку?
- Какую инструкцию VBA необходимо использовать для копирования файла?
- Можно ли удалить открытый файл или папку, содержащую файлы? Почему?
- Какое сообщение будет выведено инструкцию VBA необходимо использовать для переноса файла папки в другую в пределах одного дисковода? Можно эту же инструкцию использовать для переноса на другой дисковод?
- Какой цикл был использован в большинстве примерах?
4. Приложение
Рис.1.1. Диалоговое окно Запись макроса
Рис.1.2. Панель для работы с
макросами
Рис.2.1. Окно редактора
Рис. 2.2. Панель элементов управления
Рис.2.3. Панель инструментов
Рис.2.4. Экранная форма
Рис.2.5. Наиболее часто используемые свойства объекта UserForm
Рис.2.6. Значения параметров
Рис.2.7. Окно сообщений
Рис.2.8. Список значений, возвращаемых функцией MsgBoх
Рис.2.9. Пример применения функций InputBox и MsgBox.
Рис.2.10. Создание окон сообщений
Рис.3.1. Интерфейс программы из Пример 4.1.
Рис.5.1. Сортировка массива
Рис. 6.1. Диалоговое окно условного форматирования
Рис.6.2. Назначение макроса кнопке
Рис.6.3. Порядок выполнения программы из Пример1
Рис.6.4. Интерфейс программы из Пример 1
Рис.6.5. Интерфейс программы из Пример 2
Рис.6.6. Интерфейс программы из Пример 3
Рис.6.7. Интерфейс программы из Пример 4
Рис.6.8. Интерфейс программы из Пример 5
Рис.6.9. Интерфейс программы из Пример 6
Рис.6.10. Интерфейс программы из Пример 7
Рис.6.11. Интерфейс программы из Пример 8
Заключение
С ростом производительности персональных компьютеров и сложности программных средств пользователям становится все труднее «держать в уме» все функции применяемого языка программирования. По этой причине в повседневной работе, как правило, используется далеко не весь спектр существующих возможностей конкретною инструментария или операционной среды, а только небольшая их часть. Практика показывает, что и вводные обучающие курсы дают представление только о самых важных командах и навязывают пользователю применение ряда типовых процедур, многие из которых далеко не оптимальны. Большинство пользователей, преодолев первый страх перед новым инструментарием и накопив достаточный опыт, начинают испытывать естественное желание познакомиться с возможностями среды разработки поближе. Им хочется использовать если не все, то многие из доступных средств.
Как следует из названия VBA, он относится к диалектам BASIC, являясь при этом объектно-ориентированным языком, обладающим значительными возможностями в отношении объектной модели и многократно используемого кода, что позволяет реализовать с его помощью достаточно сложные проекты.
Visual Basic for Applications — открытая система, допускающая расширение посредством элементов управления ActiveX. Благодаря этому качеству VBA существенно происходит по своим возможностям старые редакторы макросов, которыми компоненты Office оснащались раньше,
В то же время макрос можно записать «старым, добрым» способом, при этом он будет записан и станет доступным для редактирования в форме процедуры на языке Visual Basic; с одной стороны, это может оказаться полезным при создании сложной VBA-программы, с другой — представляет собой наиболее простой и легкий способ сделать первые шаги в программировании на VBA.
При более близком знакомстве с VBA вы обнаружите новые возможности, выражающиеся в облегчении доступа к данным разных видов и упрощении манипуляций с ними. Конечно, при всех усовершенствованиях даже визуальное программирование не сводит работу программиста к кулю — для создания правильно работающего приложения все равно придется потрудиться.
Список использованной литературы
- Г. З. Гарбер “Основы программирования на VB и VBA в
Excel 2007”.
- И. Н. Порублев, А. Б. Ставровский “Алгоритмы и программы”.
- Г. Штайнер “VBA. 6.3.справочник”.
- http://all-ebooks.com “Основы программирования в Microsoft Office”
По теме: методические разработки, презентации и конспекты
Методическая разработка: Учебно-методическое пособие.
Технология росписи по ткани.Стилизация.Народные художественные промыслы....
Разработка учебно-методического пособия - модифицированной учебной программы дополнительного образования детей по лёгкой атлетике,прошедшей экспертизу и "Рекомендованной к реализации" .
ЯВЛЯЯСЬ тренером-преподавателем КДЮСШ по совместительству, и добиваясь положительных результатов в Спартакиаде школьников, реализую программу по лёгкой атлетике.,...
Разработка учебно-методического пособия по информатике «Виртуальная экскурсия»
Проведение виртуальной экскурсии по информатике будет очень похоже на проведение обыкновенной экскурсии: понадобится разъяснение учащимся цели экскурсии, сообщение им знаний, необходимых для успеха эк...
Авторская разработка учебно-методического пособия по английскому языку для 8–10-х классов "Golden Ring" ("Золотое кольцо")
Данное учебно-методическое пособие может использоваться на уроках английского языка в 8-10-х классах общеобразовательных школ (в зависимости от подготовленности учеников), а также на факультативных за...
Методическая разработка (учебно-методическое пособие) на тему: «История развития прав человека» (интеллектуальная игра «Брейн-ринг» в 10 классах)
ПОЛОЖЕНИЕ ОБ ИНТЕЛЛЕКТУАЛЬНОЙ ИГРЕ «БРЕЙН-РИНГ» В игре могут принимать участие несколько команд учеников 10 классов. Если встречаются не более 4 команд, то игры проводят по так называ...
Авторская разработка учебно-методического пособия по второму иностранному (немецкому) языку для общеобразовательных организаций 5 класс "Моя семья и я»
Учебно-методическое пособие предназначено для преподавания уроков немецкого языка как второго иностранного на базе английского в 5 классах. Содержание учебного материала данного раздела соответствует...
МЕТОДИЧЕСКАЯ РАЗРАБОТКА УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ ДЛЯ ПРОВЕДЕНИЯ ПРАКТИЧЕСКИХ ЗАНЯТИЙ ПО УЧЕБНОЙ ДИСЦИПЛИНЕ ОУДб.03 ИНОСТРАННЫЙ ЯЗЫК
МЕТОДИЧЕСКАЯ РАЗРАБОТКА УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ ДЛЯ ПРОВЕДЕНИЯ ПРАКТИЧЕСКИХ ЗАНЯТИЙПО УЧЕБНОЙ ДИСЦИПЛИНЕОУДб.03 ИНОСТРАННЫЙ ЯЗЫК...