Оглавление

Содержание

    • ВВЕДЕНИЕ
  • ЧАСТЬ I. ОСНОВНЫЕ СРЕДСТВА И ВОЗМОЖНОСТИ VBA
    • ГЛАВА 1. ОСНОВНЫЕ ЭЛЕМЕНТЫ VBA
    • ГЛАВА 2. ОСНОВНЫЕ ОБЪЕКТЫ VBA
    • ГЛАВА 3. МЕТОДЫ ОБЪЕКТА RANGE, ИСПОЛЬЗУЮЩИЕ КОМАНДЫ EXCEL
    • ГЛАВА 4. СЦЕНАРИИ И ОПРЕДЕЛЕНИЕ СТРУКТУРЫ ДАННЫХ
    • ГЛАВА 5. ДИАГРАММЫ
    • ГЛАВА 6. СВОДНЫЕ ТАБЛИЦЫ
    • ГЛАВА 7. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ И ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА
    • ГЛАВА 8. ПРОГРАММИРОВАНИЕ ПАНЕЛИ ИНСТРУМЕНТОВ
    • ГЛАВА 9. ПРОГРАММИРОВАНИЕ СРЕДСТВ ДЛЯ РАБОТЫ СО СПРАВОЧНОЙ ИНФОРМАЦИЕЙ
    • ГЛАВА 10. РАБОТА С ГРАФИЧЕСКИМИ ОБЪЕКТАМИ
    • ГЛАВА 11. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА VBA
    • ГЛАВА 12. ПРОЦЕДУРЫ ОБРАБОТКИ ОШИБОК И ОТЛАДКА ПРОГРАММ
    • ГЛАВА 13. РАБОТА С ФАЙЛАМИ
    • ГЛАВА 14. ПОЛЬЗОВАТЕЛЬСКИЕ ОБЪЕКТЫ
    • ГЛАВА 15. РАБОТА С ВНЕШНИМИ БАЗАМИ ДАННЫХ
  • ЧАСТЬ П. ПРАКТИЧЕСКИЕ ПРИЕМЫ ПРОГРАММИРОВАНИЯ НА VBA
    • УРОК 1. ТЕМА: ИГРА "ОРЕЛ И РЕШКА"
    • УРОК 2. ТЕМА: РАСЧЕТ МАРГИНАЛЬНОЙ ПРОЦЕНТНОЙ СТАВКИ
    • УРОК 3. ТЕМА: РАБОТА СО СПИСКОМ
    • УРОК 4. ТЕМА: РАСЧЕТ АМОРТИЗАЦИИ
    • УРОК 5. ТЕМА: РЕШЕНИЕ УРАВНЕНИЯ, ЗАВИСЯЩЕГО ОТ ПАРАМЕТРА. ПОСТРОЕНИЕ ДИАГРАММЫ
    • УРОК 6. ТЕМА: УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
    • УРОК 7. ТЕМА: ЗАПОЛНЕНИЕ БАЗЫ ДАННЫХ
    • УРОК 8. ТЕМА: ПОСТРОЕНИЕ ПОВЕРХНОСТИ
    • УРОК 9. ТЕМА: ПЕРИОДИЧЕСКИЕ ВЫПЛАТЫ
    • УРОК 10. ТЕМА: ЕЩЕ РАЗ О СОСТАВЛЕНИИ БАЗЫ ДАННЫХ
    • УРОК 11. ТЕМА: ИГРА В КРЕСТИКИ И НОЛИКИ
    • УРОК 12. ТЕМА: ЛИНИЯ ТРЕНДА
    • УРОК 13. ТЕМА: СОСТАВЛЕНИЕ РАСПИСАНИЯ
    • УРОК 14. ТЕМА: РАБОТА С ФАЙЛАМИ


  • ЧАСТЬ I. ОСНОВНЫЕ СРЕДСТВА И ВОЗМОЖНОСТИ VBA
    • ГЛАВА 1. ОСНОВНЫЕ ЭЛЕМЕНТЫ VBA
      • ЧТО ТАКОЕ VBA
      • ОБЪЕКТЫ И СЕМЕЙСТВА
        • Объекты OLE и ActiveX
        • Классы
        • Иерархия объектов
        • Методы
        • Свойства
        • События
      • СТРУКТУРА РЕДАКТОРА VBA
        • Окно проекта
        • Окно для редактирования кода
        • Окно редактирования форм (UserForm)
        • Окно свойств
        • Окно Просмотр объектов (Object Browser)

Часть I.

Основные средства и возможности VBA

Глава 1.

Основные элементы VBA

Что такое VBA

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

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

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

Объекты и их семейства

VBA относится к языкам объектно-ориентированного программирования (ООП). ООП можно описать как методику анализа, проектирования и написания приложений с помощью объектов. Что такое объект? Объект nq-зволяет инкапсулировать данные вместе с кодом, предназначенным для их обработки, т. е. объединить их в нечто целое, именуемое объектом. VBA не является объектно-ориентированном языком в строгом понимании этого слова, однако объектный подход играет в нем большую роль. Все визуальные объекты, такие как рабочий лист (worksheet), диапазон (Range), диаграмма (Chart), форма (userForm), являются объектами. В VBA имеется более 100 встроенных объектов.

Семейство (объект collection) представляет собой объект, содержащий несколько других объектов, как правило, одного и того же типа. Например, объект workbooks (рабочие книги) содержит все открытые объекты Workbook (рабочая книга). Каждый элемент семейства нумеруется и может быть идентифицирован либо по номеру, либо по имени. Например, worksheets (1) обозначает первый рабочий лист активной книги, a worksheets ("Лист1") — рабочий лист с именем лист1.

Объекты OLE и ActiveX

В VBA используется механизм OLE (Object Linking and Embedding — связывание и внедрение объектов), который позволяет взаимодействовать с любыми программами, поддерживающими OLE. Примером элементов, которые можно интегрировать при помощи механизма OLE, являются вставляемые объекты OLEObject, создаваемые, например, при помощи программ WordArt, ClipArt и т. д. Все OLE-объекты рабочего листа образуют семейство oLEObjects. Вручную в рабочий лист OLE-объекты вставляются командой Вставка, Объект (Insert, Object) с выбором в появившемся диалоговом окне Вставка объекта (Object) из списка на вкладке Создание (Create New) внедряемого объекта. OLE-объект отличается от обычного тем, что при выборе внедренного объекта (перемещении на него указателя и щелчке кнопкой мыши) активизируется программа, связанная с этим объектом, и меню приложения заменяется меню программы, его создавшей. Теперь можно, не выходя из основного приложения, работать с данным объектом, редактируя и видоизменяя его средствами создавшей его программы. Кроме того, OLE-технологля обладает так называемым свойством Automation, с помощью которого можно устанавливать свойства, применять методы и обрабатывать события внедренных объектов, как обычных объектов приложения.

С 1996 года фирма Microsoft ввела новую терминологию и теперь то, что раньше именовалось OLE-объект, называется объектом ActiveX, a OLE Automation называется ActiveX Automation.

Классы

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

Иерархия объектов

Объектная библиотека VBA располагает более 100 различных объектов, находящихся на различных уровнях иерархии. Иерархия определяет связь между объектами и показывает пути доступа к ним. На рис. 1.1 приведена модель встроенных объектов VBA.

Рис. 1.1. Иерархия встроенных объектов VBA

Полная ссылка на объект состоит из ряда имен вложенных последовательно друг в друга объектов. Разделителями имен объектов в этом ряду являются точки, ряд начинается с объекта Application и заканчивается именем самого объекта. Например, полная ссылка на ячейку AI рабочего листа лист1 рабочей книги с именем Архив имеет вид:

Application.Workbooks("Архив")

.Worksheets("Лист1").Range("Al")

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

В неявной ссылке, в отличие от полной, объекты, которые активны в данный момент, как правило, можно опускать. В рассмотренном случае, если ссылка на ячейку AI дана в программе, выполняемой в среде Excel, то ссылка на объект Application может быть опущена, т. е. достаточно привести относительную ссылку:

Workbooks("Архив").Worksheets("Лист1").Range("A1")

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

Worksheets("Лист1").Range("A1")

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

Range("A1")

Методы

Объект сам по себе не представляет большого значения. Намного значительнее то, какие действия можно совершать над объектом, и какими свойствами он обладает. Метод как раз и представляет собой действие, выполняемое над объектом.

Синтаксис применения метода:

Объект.Метод

В данном примере при помощи метода Quit (закрыть) закрывается приложение (объект Application).

Application.Quit

Метод можно применять ко всем объектам семейства. В данном примере к семейству chartobjects (диаграммы) рабочего листа Лист! применен метод Delete (удалить), который приводит к удалению всех диаграмм с рабочего листв Лист1:

Worksheets("Лист!").Chartobjects.Delete

Свойства

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

Синтаксис установки значения свойства:

Объект.Свойство = ЗначениеСвойства

В следующем примере изменяется заголовок окна Excel посредством задания свойства Caption объекту Application:

Application.Caption = "Пример"

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

Worksheets.Visible = False

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

ActiveWindow | Возвращает активное окно Excel
ActiveWorkbook | Возвращает активную рабочую книгу активного окна Excel
ActiveSheet | Возвращает активный лист активной рабочей книги
ActiveDialog | Возвращает активное диалоговое окно активного рабочего листа
ActiveChart | Возвращает активную диаграмму активного рабочего листа
ActiveCell | Возвращает активную ячейку активного рабочего листа

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

ActiveCell

ActiveWindow.ActiveCell

Application.ActiveWindow.ActiveCell

События

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

Суть программирования на VBA как раз и заключается в этих двух понятиях: событие и отклик на него. Если пользователь производит какое-то воздействие на систему, скажем нажимает кнопку, тогда в качестве отклика выполняется код созданной пользователем процедуры. Если такой отклик не создан, т. е. не написана соответствующая процедура, то система никак не реагирует на данное событие, и оно остается безответным. Как говорится, на нет и суда нет. Таким образом, действия, происходящие в системе, являются событиями, а отклики на них — процедурами. Этот специальный вид процедур, генерирующих отклик на события, называется процедурами обработки событий. В целом программирование на VBA состоит в создании кода программ, которые генерируют прямо или косвенно отклики на события.

Структура редактора VBA

Редактор VBA активизируется командой Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Visual Basic Editor) или нажатием кнопки Редактор Visual Basic (Visual Basic Editor) панели инструментов Visual Basic. Возвратиться из редактора VBA в рабочую книгу можно нажатием кнопки Вид Microsoft Excel (View Microsoft Excel) Интерфейс VBA состоит из следующих основных компонентов: окно проекта, окно свойств, окно редактирования кода, окна форм, меню и панели инструментов.

Окно проекта

Окно проекта в редакторе VBA активизируется выбором команды Вид, Окно проекта (View, Project window) или нажатием кнопки Окно проекта (Project window) В окне проекта (VBAProject) представлена иерархическая структура файлов форм и модулей текущего проекта (рис. 1.2).

В проекте автоматически создается модуль для каждого рабочего листа и для всей книги. Кроме того, модули создаются для каждой пользовательской формы, макросов и классов. По своему предназначению модули делятся на два типа: модули объектов и стандартные. К стандартным модулям относятся те, которые содержат макросы. Такие модули добавляются в проект командой Вставка, Модуль (Insert, Module). К модулям объектов относятся модули, связанные с рабочей книгой, рабочими листами, формами, и модули класса.

Формы создаются командой Вставка, UserForm (Insert, UserForm), а модули класса — командой Вставка, Модуль класса (Insert, Module). По мере создания, добавления и удаления файлов из проекта эти изменения отображаются в окне проекта. Отметим, что удаление файла из окна проекта производится выбором значка файла с последующим выполнением команды Файл, Удалить (File, Delete).

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

Рис. 1.2. Окно проекта

Окно для редактирования кода

Перемещение указателя на значок файла в окне проекта и выполнение двойного щелчка кнопкой мыши открывает окно редактора кода (рис. 1.3) для соответствующего модуля.

Рис. 1.3. Окно редактирования кода

Окно редактирования кода служит в качестве редактора для ввода и изменения кода процедур приложения. Код внутри модуля организован в виде отдельных разделов для каждого объекта, программируемого в модуле. В окне редактирования доступны два режима представления кода: просмотр отдельной процедуры и всего модуля. Переключение режимов работы окна редактирования кода осуществляется выбором одной из двух кнопок в нижнем левом углу окна редактирования кода (табл. 1.1), либо установкой или снятием флажка Просмотр всего модуля (Default to Full Module View) вкладки Редактор (Editor) диалогового окна Параметры (Options), отображаемого на экране командой Сервис, Параметры (Tools, Options) (рис. 1.4).

Таблица 1.1. Режимы работы редактора кода

Кнопка | Режим работы
 | Отдельная процедура
 | Все процедуры модуля

Рис. 1.4. Диалоговое окно Параметры

Два раскрывающихся списка в верхней части окна редактора кода облегчают ориентацию в процедурах. Левый раскрывающийся список позволяет выбрать управляющий элемент или форму, а правый — содержит список событий, допустимых для выбранного в левом списке объекта. Отметим, что при выборе элемента управления в форме посредством двойного щелчка или перемещении указателя на элемент управления и нажатии кнопки Программа (Veiw Code) открывается окно редактирования кода как раз в том месте, где располагается процедура, связанная с этим элементом управления. Обратный переход от процедуры к объекту управления быстрее всего осуществить нажатием кнопки Объект (Veiw Object).

Интеллектуальные возможности редактора кода

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

Range("A1").

после ввода точки на экране отобразится список компонентов (рис. 1.5), которые логически завершают данную инструкцию. Двойной щелчок на выбранном элементе из этого списка или нажатие клавиши <Таb> вставляет выбранное имя в код программы. При этом использование клавиши <Таb> вместо мышки иногда предпочтительней, т. к. эта клавиша находится прямо под рукой и нажатие на нее производится только одним движением пальца левой руки, что не требует особого времени и усилий.

Рис. 1.5. Список компонентов

Автоматическое отображение списка компонентов происходит только при установленном флажке Список компонентов (Auto List Members) вкладки Редактор (Editor) диалогового окна Параметры (Options), отображаемого на экране после выбора команды Сервис, Параметры (Tools, Options).

Список компонентов можно выводить на экран нажатием комбинации клавиш <Ctrl>+<J>, при этом список отображается как при установленном, так и при снятом флажке Список компонентов (Auto List Members) вкладки Редактор (Editor) диалогового окна Параметры (Options).

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

Рис. 1.6. Отображаемые сведения о вводимой процедуре

Автоматическое отображение на экране сведений о процедурах, функциях, свойствах и методах после ввода их имени происходит только при установленном флажке Краткие сведения (Auto Quick Info) вкладки Редактор (Editor) диалогового окна Параметры (Options), отображаемого на экране после выбора команды Сервис, Параметры (Tools, Options) (см. рис. 1.4).

Описанную выше всплывающую подсказку можно также выводить на экран нажатием комбинации клавиш <Ctrl>+<!>. При этом всплывающая подсказка отображается как при установленном, так и при снятом флажке Краткие сведения вкладки Редактор диалогового окна Параметры (Options).

Редактор кода также производит автоматическую проверку синтаксиса набранной строки кода сразу после нажатия клавиши <Enter>. Если после набора строки и нажатия клавиши <Enter> строка выделяется красным цветом, то это как раз и указывает на наличие синтаксической ошибки в набранной строке. Эту ошибку необходимо найти и исправить. Кроме того, если установлен флажок Проверка_синтаксиса (Auto Syntax Check) вкладки Редактор (Editor) диалогового окна Параметры (Options), отображаемого на экране посредством выбора команды Сервис, Параметры (Tools, Options) (см. рис. 1.4), помимо выделения красным цветом фрагмента кода с синтаксической ошибкой, на экране отображается диалоговое окно, поясняющее, какая возможная ошибка произошла.

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

Работа от примера является одним из краеугольных принципов миропозна-ния и творчества. Стиль работы от примера очень ярко отображен в принципе чайника. Несмотря на всю его шутливость и кажущуюся абсурдность, в нем сформулирован многовековой опыт работы, который очень часто приводит к быстрым и эффективным результатам. Попытаемся описать принцип чайника следующим образом. У программиста спросили, как надо вскипятить воду, если на кухне есть спички, газовая плита, водопроводный кран и пустой чайник, стоящий на кухонном столе. "Тривиально! — ответил программист. - Налейте в чайник воду, зажгите горелку газовой плиты и поставьте на нее чайник." Тогда программисту задают следующий вопрос: "На кухонном столе стрит чайник с водой, горелка газовой плиты зажжена. Как вскипятить чайник?" "Элементарно! - отвечает программист. — Надо просто вылить воду из чайника, погасить горелку и мы оказываемся в условиях задачи, которая только что была успешно решена!"

Окно редактирования форм (UserForm)

Для создания диалоговых окон, разрабатываемых приложений в VBA, используются формы. Редактор форм является одним из основных инструментов визуального программирования. Форма в проект добавляется с помощью команды Вставка, Форма (Insert, Form) или нажатием кнопки Вставить UserForm (Insert UserForm). В результате на экран выводится незаполненная форма с панелью инструментов Панель элементов (Toolbox) (рис. 1.7).

Рис. 1.7. Окно редактирования форм и панель инструментов Панель элементов

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

  1. Щелкните значок того элемента, который вы собираетесь разместить в форме.
  2. Поместите указатель мыши на то место, где будет располагаться управляющий элемент.
  3. Нажмите левую кнопку мыши и, не отпуская ее, растяните появившийся прямоугольник до требуемых размеров.
  4. Отпустите кнопку мыши. Элемент управления на нужном место создан.

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

Рис. 1.8. Команды меню Формат

Таким образом, можно копировать, вырезать и вставлять элементы управления, расположенные на поверхности формы. Для облегчения размещения и выравнивания элементов управления используется сетка. Активизировать ее можно с помощью вкладки Общие (General) диалогового окна Параметры (Options), вызываемого командой Сервис, Параметры (Tools, Options), там же устанавливается шаг сетки. Кроме того, команды меню Формат (Format) автоматизируют и облегчают процесс выравнивания элементов управления как по их взаимному местоположению, так и по размерам (рис. 1.8).

Окно свойств

В окне свойств перечисляются основные установки свойств выбранной формы или элемента управления. Используя это окно, можно просматривать свойства и изменять их установки. Для просмотра свойств выбранного объекта надо либо щелкнуть кнопку Окно свойств (Properties Window) либо выбрать команду Вид, Окно свойств (View, Properties Window) (рис. 1.9).

Рис. 1.9. Окно свойств

Окно свойств состоит из двух составных частей: верхней и рабочей. В верхней части окна свойств располагается раскрывающийся список, из которого можно выбрать любой элемент управления текущей формы или саму форму. Рабочая часть состоит из двух вкладок: По алфавиту (Alphabetic) и По категориям (Categorized), отображающие набор свойств в алфавитном порядке или по категориям. В обоих вкладках свойство Name (имя элемента управления) будет первым. Изменяются значения свойств одним из следующих способов:

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

Окно Просмотр объектов (Object Browser)

Окно Просмотр объектов (Object Browser) вызывается командой Вид, Просмотр объектов (View, Object Browser) или нажатием кнопки Просмотр объектов (Object Browser) (рис. 1.10). В этом окне приведен список всех объектов, которые имеются в системе и которые можно использовать при создании проекта.

Рис. 1.10. Окно Просмотр объектов

Окно Просмотр объектов (Object Browser) состоит из трех основных частей:

  1. Раскрывающегося списка Проект/Библиотека (Project/Library) в левом верхнем углу окна. В этом раскрывающемся списке можно выбрать различные проекты и библиотеки объектов. В частности, библиотеки объектов Excel, VBA, Office и VBAProject (объекты пользовательского проекта). Выбор в списке строки <Все библиотеки> (<Аll Libraries>) отображает список объектов всех библиотек.
  2. Списка Классы (Classes). После выбора из раскрывающегося списка Проект/Библиотека (Project/Library) просматриваемой библиотеки, например VBA, все классы объектов выбранной библиотеки выводятся в списке Классы (Classes).
  3. Списка Компоненты (Members). После выбора класса из списка Классы (Classes) просматриваемой библиотеки, например FileSystem, все компоненты выбранного класса выводятся в списке Компоненты (Members). При выделении строки в этом списке в нижней части окна Просмотр объектов (Object Browser) приводится дополнительная информация о выбранном компоненте. Кроме того, если нажать на кнопку Справка (Help), расположенную на панели инструментов в правой верхней части окна Просмотр объектов (Object Browser), то на экране отобразится окно Справочник Visual_Basic (Microsoft Visual Basic Help) с подробной информацией о выделенном компоненте.


  • ГЛАВА 10. РАБОТА С ГРАФИЧЕСКИМИ ОБЪЕКТАМИ
    • СЕМЕЙСТВА SHAPES и SHAPERANGE
    • МЕТОДЫ, СОЗДАЮЩИЕ ОБЪЕКТЫ SHAPE

Глава 10.

Работа с графическими объектами

Семейства Shapes и ShapeRange

Объект shape — это любой графический объект, размешенный на рабочем листе или диаграмме. Семейство shapes представляет собой семейство всех графических объектов рабочего листа. Семейство ShapeRange содержится в семействе shapes и является конкретным набором графических объектов рабочего листа. В крайних случаях семейство ShapeRange может состоять только из одного объекта или совпадать с семейством shapes, которое его содержит.

Семейство shapes обычно применяется для создания нового объекта shape. Когда надо работать (т. е. задавать или изменять свойства) с отдельным элементом семейства shapes обычно используют объект shape, а когда следует оперировать с набором элементов этого семейства — семейство ShapeRange.

Большинство свойств объекта shape или семейства ShapeRange определяются в два этапа. Сначала задается свойство, которое возвращает объект, содержащий устанавливаемые свойства, а уж потом для этого объекта определяется требуемое свойство. Например, если надо изменить тип линии, то у выбранного объекта семейства ShapeRange используется свойство Line, которое возвращает объект LineFormat, содержащий свойства для установки цвета, толщины и типа граничных линий объекта shape. Получив таким образом объект LineFormat, при помощи его свойств устанавливается конкретный тип линии.

ActiveSheet.Shapes.AddLine(104.25, 135.75, 230.25, 146.25).Select

Selection.ShapeRange.Line.Weight = 3#

Selection.ShapeRange.Line.Visible = msoTrue

Selection.ShapeRange.Line.Style = msoLineSingle

Перечислим основные свойства объекта shape, возвращающие объект shape конкретного типа.

Fill | Возвращает объект FillFormat, который содержит свойства для задания цвета, типа штриховки и текстуры объекта Shape
Line | Возвращает объект LineFormat, содержащий свойства для установки цвета, толщины и типа граничных линий Объекта Shape
Shadow | Возвращает объект shadowFormat, содержащий свойства для настройки тени объекта shape
TextFrame | Возвращает объект TextFrame — текстовое поле

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

Visible | Устанавливает видимость объекта
Left, Top, Width, Height | Задают координаты левого верхнего угла объекта, его ширину и высоту
OnAction | Устанавливает имя процедуры, которая будет запущена при выборе объекта

Приведем несколько наиболее часто употребляемых общих методов объектов

Shape.

Сору | Копирует объект Shape в буфер обмена
Cut | Копирует объект shape в буфер обмена с удалением
Delete | Удаляет объект shape
Paste | Вставляет объект shape из буфера ббмена
IncrementLeft, IncrementTop | Сдвигает объект shape по горизонтали и вертикали соответственно на заданное в аргументе количество пунктов. Синтаксис: IncrementLeft (Increment) IncrementTop (Increment )
IncrementRotation | Поворачивает объект shape на заданный в аргументе угол. Синтаксис: IncrementRotation (Increment)

Методы, создающие объекты Shape

Рассмотрим методы, создающие новые элементы семейства shapes. Вручную объекты Shape создаются при помощи панели инструментов Рисование (Drawing).

AddShape

Возвращает объект Shape.

Синтаксис:

AddShape (Type, Left, Top, Width, Height)

Аргументы:

  • Tуре — специфицирует тип объекта. Допустимо 139 значений. Приведем несколько из них:

    msoShapeCube (куб), msoShapeRectangle (ПРЯМОУГОЛЬНИК), msoShapeOval (овал), msoShapeSmileyFace (улыбающееся лицо) ;

  • Left, Top — координаты левого верхнего угла объекта ;
  • Width, Height — ширина и высота объекта

Следующая последовательность инструкций создает три графических объекта: прямоугольник, овал и улыбающееся лицо (рис. 10.1). Вручную эти объекты можно было создать на рабочем листе, используя кнопки Прямоугольник (Rectangle) Овал (Oval) панели инструментов Рисование (Drawing) и кнопку Улыбающееся лицо (Smaley Face) из раскрывающегося списка Автофигуры (AutoShapes) панели инструментов Рисование (Drawing).

Рис. 10.1. Графические объекты: прямоугольник, овал и улыбающееся лицо

ActiveSheet.Shapes.

AddShape(msoShapeRectangle, 117#, 27.75, 76.5, 40.5).Select

With Selection.ShapeRange

.Line.Weight = 3#

.Line.Visible = msoTrue

.Line.Style = msoLineDash

.Fill.ForeColor.SchemeColor = 13

.Fill.Visible = msoTrue

.Fill.Solid End With ActiveSheet.Shapes.

AddShape(msoShapeOval, 114.75, 109.5, 91.5, 49.5).Select

With Selection.ShapeRange

.Fill.ForeColor.SchemeColor = 45

.Fill.Visible = msoTrue

.Fill.Solid

.Line.Weight =2.25

.Line.Visible = msoTrue

.Line.Style = msoLineSingle

.Line.ForeColor.SchemeColor = 12

.Line.Visible = msoTrue End With ActiveSheet.Shapes. _

AddShape(msoShapeSmileyFace, 254.25, 99#, 70?5, 66#).Select

With Selection.ShapeRange

.Line.ForeColor.SchemeColor = 0

.Line.Visible = msoTrue

.Fill.Solid End With

AddLine

Возвращает объект shape, являющийся линией (отрезком).

Синтаксис:

AddLine (BeginX, BeginY, EndX, EndY)

Аргументы:

  • BeginX, BeginY, EndX, EndY — координаты концов отрезка

AddTextbox

Возвращает объект shape, являющийся надписью.

Синтаксис:

AddTextbox (Orientation, Left, Top, Width, Height)

Аргументы:

  • Orientation — устанавливает ориентацию текста в надписи. Допустимые значения:
    • msoTextOrientationDownward
    • msoTextOrientationHorizontal
    • msoTextOrientationMixed
    • msoTextOrientationUpward
    • msoTextOrientationVertical
  • Left, т.ор — координаты левого верхнего угла объекта
  • width, Height — ширина и высота объекта

Следующая последовательность инструкций создает три графических объекта: две линии, первая из которых со стрелкой, вторая без стрелки и текстовое поле (рис. 10.2). Вручную эти объекты можно было создать на рабочем листе, используя кнопки Стрелка (Arrow) Линия (Line) и Надпись (Text Box) панели инструментов Рисование (Drawing).

Рис. 10.2. Графические объекты: линии и текстовое поле

'

' Линия со стрелкой

'

ActiveSheet.Shapes.AddLine(571, 30#, 174#, 59.25).Select

With Selection.ShapeRange.Line

.Weight = 6#

.Visible = msoTrue

.Style = msoLineSingle

.BeginArrowheadStyle = msoArrowheadNone

.EndArrowheadStyle = msoArrowheadTriangle

.EndArrowheadWidth = msoArrowheadWidthMedium

.EndArrowheadLength = msoArrowheadLengthMedium

.Visible = msoTrue End With

'

' Простая линия

'

ActiveSheet.Shapes.AddLine(219.75, 23.25, 334.5, 67.5).Select

With Selection.ShapeRange.Line

.Visible = msoTrue

.Style = msoLineThinThick

.Weight =4.5

End With

'

' Текстовое поле

'

ActiveSheet.Shapes.

AddTextbox(msoTextOrientationHorizontal,

69.75, 87.75, 116.25, 76.5).Select

Selection.Characters.Text = "Пример двух линий"

With Selection.Characters(Start:=1, Length:=17).Font

.Name = "Arial Cyr"

.FontStyle = "полужирный"

.Size = 12

.Strikethrough = False

.Superscript = False

.Subscript = False

.OutlineFont = False

.Shadow = False

.Underline = xlUnderlineStyleNone

. Colorlndex = 5

End With

With Selection.ShapeRange.Fill

.ForeColor.SchemeColor = 42

.Visible = msoTrue

.Solid End With

AddTextEffect

Возвращает. объект shape, являющийся WordArt-объектом.

Синтаксис:

AddTextEffect (PresetTextEffeet, Text, FontName, FontSize, FontBold, Fontltalic, Left, Top)

Аргументы:

  • PresetTextEf feet — устанавливает текстовой эффект. Допустимые значения от msoTextEffect1 до msoTextEf fect30
  • Text — текст, отображаемый в объекте WordArt
  • FontName — название шрифта
  • Fontsize — размер шрифта
  • FontBold — допустимые значения: True (полужирный шрифт), False (в противном случае)
  • Fontltalic — допустимые значения: True (курсивный шрифт), False (в противном случае)
  • Left, тор — координаты левого верхнего угла объекта

AddPicture
  • Возвращает объект shape, являющийся рисунком, созданным на основе существующего файла. Синтаксис:
  • AddPicture (FileName, LinkToFile, SaveWithDocument , Left, Top, Width, Height)
  • FileName — строка, задающая имя файла, на основе которого создается рисунок
  • LinkToFile — допустимые значения: True
    (рисунок связан с файлом, на основе которого создан) и False (в противном случае)
  • SaveWithDocument — допустимые значения: True(сохраняется рисунок с рабочей книгой) и False (в рабочей книге сохраняется связь с рисунком, а не сам рисунок)
  • Left, тор — координаты левого верхнего угла объекта
  • Width, Height — ширина и высота объекта

Следующая последовательность инструкций создает WordArt-объект (рис. 10.3) и скрывает от пользователя панель инструментов WordArt. Вручную этот объект можно было создать на рабочем листе, используя кнопку Добавить объект WordArt (Insert WordArt) панели инструментов Рисование (Drawing).

Рис. 10.3. WordArt-объект

ActiveSheet.Shapes.AddTextEffeet(msoTextEffect27,_

"VBA " & Chr(13) & "" & Chr(10) & "Лучшее решение",

"Impact", 36#, msoFalse, msoFalse, 87tt, 45#).Select

Application.CommandBars("WordArt").Visible = False


  • ГЛАВА 11. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА VBA
    • ТИПЫ ДАННЫХ
    • ОПИСАНИЕ ПЕРЕМЕННЫХ
    • ДОПУСТИМЫЕ ИМЕНА
    • ИНСТРУКЦИЯ DЕFТИП
    • МАССИВЫ
      • Динамические массивы
      • Функции и процедуры для работы с массивами
    • КОНСТАНТЫ
    • ТИП ДАННЫХ, ОПРЕДЕЛЕННЫЙ ПОЛЬЗОВАТЕЛЕМ
    • ОПЕРАЦИИ VBA
      • Приоритеты операций
    • ВСТРОЕННЫЕ ФУНКЦИИ VBA
      • Математические функции
      • Функции проверки типов
      • Функции преобразования форматов
      • Функции обработки строк
      • Функции времени и даты
    • ФУНКЦИИ ВЫБОРА
    • ФУНКЦИИ, ВОЗВРАЩАЮЩИЕ СТРОКИ
    • ВСТРОЕННЫЕ ДИАЛОГОВЫЕ ОКНА
    • ИНСТРУКЦИИ VBA
    • ОПЕРАТОР ПРИСВОЕНИЯ
    • ПЕРЕНОС СТРОКИ
    • КОММЕНТАРИИ
    • РАСПОЛОЖЕНИЕ НЕСКОЛЬКИХ ОПЕРАТОРОВ НА ОДНОЙ СТРОКЕ
    • ОПЕРАТОРЫ ПЕРЕХОДА И ВЫБОРА
    • ОПЕРАТОРЫ ПОВТОРА
    • УСЛОВНАЯ КОМПИЛЯЦИЯ
    • ПРОЦЕДУРА
      • Переход в подпрограмму и возвращение из подпрограммы
      • Вызов процедуры
      • Назначение значений по умолчанию необязательным параметрам
      • Использование неопределенного количества параметров
      • Рекурсивные процедуры
    • ОБЛАСТЬ ОПРЕДЕЛЕНИЯ ПЕРЕМЕННОЙ
    • ВРЕМЯ ЖИЗНИ ПЕРЕМЕННОЙ

Глава 11.

Основы программирования на VBA

Типы данных

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

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

Тип данных | Размер (байт) | Диапазон значений
Byte (байт) | 1 | От 0 до 255
Boolean (логический) | 2 | True или False
Integer (целое число) | 2 | От -32 768 до 32 767
Long (длинное целое число) | 4 | От -2 1 47 483 648 до 2 1 47 483 647
single (число с плавающей запятой обычной точности) | 4 | От -3.402823Е38 до -1 ,401 298Е-45 для отрицательных значений; от 1 .401298Е-45 до 3,402823Е38 для положительных значений
Double (число с плавающей запятой двойной точности) | 8 | От -1 ,7976931 3486232Е308 до -4,94065645841 247Е-324 для отрицательных значений; от 4,94065645841 247Е-324 до 1, 7976931 3486232Е308 для положительных значений
Currency (денежный) | 8 | От -922 337 203 685 477,5808 до 922 337 203 685 477,5807
Тип данных | Размер (байт) | Диапазон значений
Decimal (масштабируемое целое число) | 14 | +/-792281 6251 4264337593543950335 с 28 знаками справа от запятой; минимальное ненулевое значение имеет вид +/-0,0000000000000000000000000001
Date (даты и время) | 8 | От 1 января 100 г. до 31 декабря 9999 г.
Ob j ect (объект) | 4 | Любой указатель объекта
string (строка переменной длины) | 10 + длина строки | От 0 до приблизительно 2 миллиардов
string (строка постоянной длины) | Длина строки | От 1 до приблизительно 65 400
Variant (числовые подтипы) | 16 | Любое числовое значение вплоть до границ диапазона для типа Double
Variant (строковые подтипы) | 22 + длина строки | Как для строки (string) переменной длины
Тип данных, определяемый пользователем (с помощью ключевого слова Туре) | Объем определяется элементами | Диапазон каждого элемента определяется его типом данных

Описание переменных

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

Синтаксис:

Dim [WithEvents] ИмяПеременной[([Индексы])] [As [New] Тип]

[,[WithEvents] ИмяПеременной[([Индексы])] [As [New] Тип]] . . .

Аргументы:

WithEvents | Ключевое слово, указывающее, что аргумент имяперемен-ной является именем объектной переменной, которая используется при отклике на события, генерируемые объектом ActiveX (т. е. объектом, который может быть открыт для других приложений и средств программирования)
ИмяПеременной | Имя переменной, удовлетворяющее стандартным правилам именования переменных
Индексы | Размерности переменной массива; допускается описание до 60 размерностей. Для задания аргумента индексы используется следующий синтаксис: [Нижний То] Верхний [, [Нижний То] Верхний] ... Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией option Base. Если отсутствует инструкция option Base, нижняя граница массива равняется нулю
New | Ключевое слово, включающее возможность неявного создания объекта. Если указано ключевое слово New при описании объектной переменной, новый экземпляр объекта создается при первой ссылке на него, поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set
Тип | Тип данных переменной. Для каждой описываемой переменной следует использовать отдельное предложение As Тип

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

Инструкция Dim предназначена для описания типа данных переменной на уровне модуля или процедуры. Например, следующая инструкция описывает переменную с типом integer.

Dim N As Integer

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

Dim X As New Worksheet

Если при описании объектной переменной не используется ключевое слово New, то для использования объекта, на который ссылается переменная, существующий объект должен быть присвоен переменной с помощью инструкции Set.

Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefTnn, по умолчанию переменная получает тип variant. Для обязательного описания всех переменных надо поместить в начале модуля инструкцию option Explicit. Использование этой инструкции полезно при отладке программ, т. к. она позволяет легче отслеживать возможную путаницу в именах при наборе программы.

Допустимые имена

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

  1. Длина имени не должна превышать 255 символов.
  2. Имя не может содержать точек, пробелов и следующих символов: %, .&,
    !, #, @, $.
  3. Имя может содержать любую комбинацию букв, цифр и символов, начинающуюся с буквы.
  4. Имена должны быть уникальны внутри области, в которой они определены.
  5. Не следует использовать имена, совпадающие с ключевыми словами VBA и именами встроенных функций и процедур.

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

процентная

ставка х_начзнач

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

ПроцентнаяСтавка

х_НачЗнач

Инструкция DefТип

Инструкция DefTиn (вместо тип в имени инструкции фигурируют буквы, обозначающие конкретный тип данных) используется на уровне модуля для задания типа данных по умолчанию для переменных, аргументов, передаваемых в процедуры, и значений, возвращаемых процедурами Function и Property Get, имена которых начинаются с соответствующих символов.

Синтаксис:

DefBool ДиапазонБукв [ , ДиапазонБукв] ... | Тип данных Boolean
DefByte ДиапазонБукв!, ДиапазонБукв] ... | Тип данных Byte
Deflnt ДиапазонБукв [ , ДиапазонБукв] ... | Тип данных Integer
DefLng ДиапазонБукв!, ДиапазонБукв] ... | Тип данных Long
DefCur ДиапазонБукв [, ДиапазонБукв] ... | Тип данных Currency
DefSng ДиапазонБукв [, ДиапазонБукв] ... | Тип данных Single
DefDbl ДиапазонБукв [, ДиапазонБукв] ... | Тип данных Double
DefDate ДиапазонБукв [, ДиапазонБукв] ... | Тип данных Date
DefStr ДиапазонБукв [, ДиапазонБукв] ... | Тип данных String
DefObj ДиапазонБукв [, ДиапазонБукв] ... | Тип данных Оbject
DefVar ДиапазонБукв [, ДиапазонБукв] ... | Тип данных Variant

Аргумент ДиапазонБукв имеет следующий синтаксис:

Буква1[-Буква2]

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

В следующем примере инструкция устанавливает, что все переменные с именами, начинающимися с букв из диапазона от А до Q, имеют строковый тип:

DefStr A-Q

Инструкция Def Тип действует только на модуль, в котором она используется.

При указании диапазона букв обычно определяется тип данных по умолчанию для переменных, которые начинаются с первых 128 символов набора. Однако при указании диапазона A—Z задается тип данных по умолчанию для всех переменных, включая те, что начинаются с международных символов из расширенной части набора (128-255).

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

* | Integer
& | Long
| | Single
# | Double
@ | Currency
$ | String

Массивы

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

Dim B(3, 3) As Single

Dim A(12) As Integer

Первая строка объявляет двумерный массив 3x3 (матрицу), состоящий из действительных чисел. Вторая строка объявляет одномерный массив (вектор) из 12 целых чисел, причем по умолчанию первый элемент массива будет А(0), а последний А(11). В этом случае говорят, что о — базовый индеке. Можно изменить базовый индекс, написав в начале листа модуля инструкцию Option Base1. После этого индексы массивов А и В будут начинаться с единицы. Другим способом изменения базового индекса является использование ключевого слова то при объявлении массива:

Dim B(l То 3, 1 То 3) As Single

Dim A(l To 12) As Integer

Массив в программе определяется поэлементно. Например,

Dim B(l To 2, 1 То 2) As Single

B(l,l)=2

В(1,2)=4

В(2,1)=1

В(1,2)=6

Удобным способом определения одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в вектор из этих значений, и присваивающая их переменной типа variant. Например,

Dim A As Variant

А = Аггау(10,20,30)

В = А(2)

Динамические массивы

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

Dim R() As Single

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

Синтаксис:

ReDim [Preserve] ИмяПеременной(Индексы) [As Тип] [, ИмяПеременной(Индексы) [As Тип]] ...

Аргументы:

| Preserve | Ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности
ИмяПеременной | Имя переменной, удовлетворяющее стандартным правилам именования переменных
Индексы | Размерности переменной массива; допускается описание до 60 размерностей. Аргумент индексы использует следующий синтаксис: [Нижний То] Верхний [, [Нижний То] Верхний] . . . Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция option Base, нижняя граница массива равняется нулю
Тип | Тип данных массива

Например, установим границы массивы R:

ReDim R(l To 10)

Допустимо повторное использование инструкции ReDim для изменения числа элементов и размерностей массива.

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

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

Array (СписокАргументов)

Создает массив типа variant. Аргумент спи-сокАргументов представляет разделенный запятыми список значений, присваиваемых элементам массива. Пример:

Dim День As Variant День = Array ("Пн", "Вт", "Ср", "Чт", "Пт")

IsArray (ИмяПеременной)

Возвращает True, если переменная содержит массив; в противном случае возвращается False. Функцию IsArray используют дляпроверки значений переменных типа variant, содержащих массивы

LBound (ИмяМассива [, Размерность])

и

Ubound (ИмяМассива

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

  • ИмяМассива — имя переменной массива

[, Размерность])
  • Размерность — целое число, указывающее размерность, нижнюю или верхнюю границу которой возвращает функция. Для первой размерности следует указать 1, для второй 2 и т. д. Если аргумент Размерность опущен, подразумевается значение 1

Erase СписокМассивов

Повторно инициализирует элементы массивов фиксированной длины и освобождает память, отведенную для динамического массива, списокМассивов представляет имена одной или нескольких очищаемых переменных массивов, разделенных запятой. Инструкция Erase устанавливает элементы массивов фиксированной длины следующим образом: массив чисел или строк фиксированной длины (присваивает каждому элементу значение 0), массив строк переменной длины (присваивает каждому элементу значение пустой строки), массив типа variant (присваивает каждому элементу значение Empty). Erase освобождает память, используемую динамическими массивами. Перед тем как из программы вновь появится возможность сослаться на динамический массив, необходимо переопределить размерности переменной массива с помощью инструкции ReDim.

Константы

Константы, в о.тличие от переменных, не могут изменять свои значения. Использование констант делает программы легче читаемыми и позволяет проще вносить исправления — отпадает необходимость многократно исправлять значения по тексту программы, т. к. достаточно ввести новое значение при определении константы.

Синтаксис:

[Public | Private] Const ИмяКонстанты [As Тип] = Выражение

Аргументы:

Public | Ключевое слово, используемое на уровне модуля для описания констант, доступных всем процедурам во всех модулях. Не допускается в процедурах.
Private | Ключевое слово, используемое на уровне модуля для описания констант, доступных только внутри модуля, в котором выполняется описание. Не допускается в процедурах.
ИмяКонстанты | Имя константы, удовлетворяющее стандартным правилам именования переменных
Тип | Один из поддерживаемых типов данных: Byte, Boolean, Integer, Long, Currency, Single, Double. Decimal (в настоящее время не поддерживается), Date, string или variant. Для каждой описываемой константы следует использовать отдельное предложение AS тип
Выражение | Литерал, другая константа или любое сочетание, которое включает все арифметические или логические операторы, за исключением is

Пример:

Const ПроцентнаяСтавка As Single = 0.2

Const Фирма = "OOO Бескрайние просторы"

Тип данных, определенный пользователем

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

Синтаксис:

[Private | Public] Type ИмяПеременной ИмяЭлемента [([Индексы])] Аs тип [ИмяЭлемента [([Индексы])] As тип]

End Type

Аргументы:

Public | Используется телем типов, всех модулях для описания определяемых пользова-которые доступны для всех процедур во всех проектов
Private | Используется для описания определяемых пользователем типов, которые доступны только в модуле, в котором выполняется описание
ИмяПеременной | Имя типа, определяемого пользователем
ИмяЭлемента | Имя элемента, определяемого пользователем типа
Индексы | Размерности элемента, являющегося массивом. Для, задания массива, размеры которого могут изменяться, указываются только скобки. Аргумент Индексы использует следующий синтаксис: [Нижний То] Верхний [, [Нижний То] Верхний] . .
Тип | Тип данных элемента; поддерживаются типы: Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (для строк переменной длины), String* длина (для строк фиксированной длинны), Object, variant и другой, определяемый пользователем тип или объектный тип

В данном примере инструкция туре используется для определения типа данных (только на уровне модуля). При появлении в модуле класса инструкции туре должно предшествовать ключевое слово Private. '

' Тип, определенный пользователем

Туре Студент '

' Элементы типа данных

'

Фамилия As String * 20 Имя As String * 20

Отчество As String * 20 НомерЗачетки As Integer

Группа As String * 10 Курс As Long

ДатаРождения As Date

End Type

Sub ВводДанных()

' Описание переменной Экономист

'

Dim Экономист As Студент

' Присвоение значений элементам переменной Экономист

With Экономист

.НомерЗачетки = 12003

.Группа = "Менеджмент"

End With

End Sub

Можно создавать массив, содержащий элементы собственного типа. Например, следующий массив состоит из сведений о 20 студентах.

Dim СтудентЭкономист(1 to 20) As Студент

' Присваивает значения элементам первой компоненты массива

CтудентЭкономист(1). Фамилия = "Промокашкин"

CтудентЭкономист(1).

Имя = "Евстегней" СтудентЭкономист(1).

Отчество = "Поликарпович"

Операции VBA

В программах на VBA можно использовать стандартный набор операций над данными. Имеются три основных типа операций:

  • Математические, выполняются над числами, и их результатом являются числа
  • Отношения, применяются не только к числам, и их результатом являются логические значения, например х>у
  • Логические, используются в логических выражениях и их результатом являются логические значения, например Not x And у

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

Операнд!] + [Операнд2] | Сложение
[ Операнд!] -- [Операнд2] | Вычитание
- [Операнд] | Перемена знака
Операнд!] * [Операнд2] | Умножение
[Операнд!] / [Операнд2] | Деление
[Операнд1] \ [Операнд2] | Целочисленное деление
[Операнд1] Mod [Операнд2] | Остаток от деления по модулю
[Операнд1] ^ [Операнд2] | Возведение в степень

Операции отношения.

[Операнд1] < [Операнд2] | Меньше
[Операнд1] > [Операнд2] | Больше
[Операнд1] <= [Операнд2] | Меньше или равно
[Операнд1] >= [Операнд2] | Больше или равно
[Операнд1] <> [Операнд2] | Не равно
[Операнд1] = [Операнд2] | Равно
[Операнд1] Is [Операнд2] | Сравнение двух операндов, содержащих ссылки на объекты
[Операнд1] Like [Операнд2] | Сравнение двух строковых выражений

Логические операции.

[Операнд1] And [Операнд2] | Логическое умножение
[Операнд1] Or [Операнд2] | Логическое сложение
[Операнд1] Хог [Операнд2] | Исключающее or (или)
[Операнд1] Not [Операнд2] | Логическое отрицание
[Операнд1] Imp [Операнд2] | Логическая импликация (в настоящее время почти не используется)
[Операнд1] Equ [Операнд2] | Логическая эквивалентность (в настоящее время почти не используется)

Другие операции.

[Строка1] & [Строка2] | Сложение строк. Для сложения строк допустимо использование операции [Строка1] + [Строка2] , но предпочтительнее, во избежания путаницы, применять операцию со знаком &

Приоритеты операций

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

Приоритет | Операция
1 | Вызов функции и скобки
2 | ^
3 | - (смена знака)
4 | *, /
5 | \
6 | Mod
7 | +, -
8 | >, <, >=, <=, о, =
9 | Not
10 | And
11 | Or
12 | Xor
13 | Equ
14 | Imp

Встроенные функции VBA

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

  • Математические функции
  • Функции проверки типов
  • Функции преобразования форматов
  • Функции обработки строк
  • Функции времени и даты

Ниже рассмотрены основные функции из этих категорий.

Математические функции

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

Функция | Возвращаемое значение
Abs (число) Atn (число) Cos (число) | Модуль (абсолютная величина)числа Арктангенс Косинус
Ехр (число) | Экспонента, т. е. результат возведения основания натурального логарифма в указанную степень
Log (число) | Натуральный логарифм
Rnd (число) | Случайное число из интервала [0,1). Если число меньше нуля, то Rnd возвращает каждый раз одно и то же число, используя аргумент в качестве опорного числа; если число больше нуля или аргумент опущен, то — следующее случайное число в последовательности; если число равняется нулю, то — случайное число, возвращенное при предыдущем вызове этой функции. Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента
Sgn (число) | Знак числа
Sin (число) | Синус
Sqr (число) | Квадратный корень из числа
Tan (число) | Тангенс
Fix (число) И Int (число) | Обе функции, int и Fix, отбрасывают дробную часть числа и возвращают целое значение. Различие между функциями int и Fix состоит в том, что для отрицательного значения аргумента число функция int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, a Fix — ближайшее отрицательное целое число, большее либо равное указанному

Функции проверки типов

Функции проверки типов проверяют, является ли переменная выражением специфицированного типа.

Функция | Проверка
IsArray (переменная) IsDate (переменная) IsEmpty (переменная) IsError (переменная) IsNull (переменная) IsNumeric (переменная) IsObject (переменная) | Является ли переменная массивом Является ли переменная датой Была ли переменная описана инструкцией Dim Является ли переменная кодом ошибки Является ли переменная пустым значением (Null) Является ли переменная числовым значением Является ли переменная объектом

Функции преобразования форматов

Преобразование строки в число и обратно осуществляют следующими функциями.

Val (строка) | Возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа
Str (число) | Возвращает значение типа variant (String), являющееся строковым представлением числа

В качестве допустимого десятичного разделителя функция str воспринимает только точку. При наличии другого десятичного разделителя (например, запятой) для преобразования чисел в строки следует использовать функцию cstr, описанную ниже.

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

Format

Возвращает значение типа variant (string), содержащее выражение, отформатированное согласно инструкциям, заданным в описании формата.

Синтаксис:

Format (Выражение [, Формат [, ПервыйДеньНедели [ , ПерваяНеделяГода] ] ])

  • Выражение — любое допустимое выражение
  • Формат — любое допустимое именованное или определяемое пользователем выражение формата. Примером именованного формата является Fixed — формат действительного числа с двумя значащими цифрами после десятичной точки
  • ПервыйДеньНедели — постоянная, определяющая первый день недели
  • ПерваяНеделяГода — постоянная, определяющая первую неделю года

При построении пользовательского числового формата возможно использование следующих символов.

0 | Резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у числа, представленного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится о, функция отображает эту цифру аргумента, если нет — в этой позиции отображается нуль
# | Резервирует позицию цифрового разряда. Отображает цифру или ничего не отображает. Если у числа, представленного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится #, функция отображает эту цифру аргумента, если нет — в исходной позиции не отображается ничего. Действие данного символа аналогично действию о, за исключением того, что лидирующие нули не отображаются
. | Резервирует позицию десятичного разделителя. Указание точки в строке формата определяет, сколько разрядов необходимо отображать слева и справа от десятичной точки
% | Резервирует процентное отображение числа
, | Разделитель разряда сотен от тысяч
 | Разделитель часов, минут и секунд в категории форматов Время (Time)
/ | Разделитель дня, месяца и года в категории форматов Дата (Date)
E+, E-, e+, e- | Разделитель мантиссы и порядка в экспоненциальном формате

Кроме функций vai и str в VBA имеются следующие функции преобразования типов выражений из данного в указанный.

Функция | Тип, в который преобразуется выражение
CBool (Выражение) | Boolean
CByte (Выражение) | Byte
CCur (Выражение) | Currency
CDate (Выражение) | Date
СDbl (Выражение) | Double
CDec (Выражение) | Decimel
CInt (Выражение) | Integer
CLng (Выражение) | Long
CSng (Выражение) | Single
CVar (Выражение) | Variant
CStr (Выражение) | String

Функции обработки строк

В VBA имеются следующие функции обработки строковых выражений.

Функция

Возвращаемое выражение

ASC

Возвращает ASCII-код начальной буквы строки.

Синтаксис:

Asc (Строка)

Chr

Преобразует ASCII-код в строку.

Синтаксис:

Chr (Код)

Например

Chr ( 13 ) — переход на новую строку,

Chr ( 97 ) = "а"

Lease

Преобразует строку к нижнему регистру.

Синтаксис:

Lease (Строка)

Ucase

Преобразует строку к верхнему регистру.

Синтаксис:

Ucase (Строка)

Left

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

Синтаксис:

Left (string, length)

Аргументы:

  • length — число символов
  • string — исходная строка

Right

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

Синтаксис:

Right (string, length)

Аргументы:

  • length — число символов
  • string — исходная строка

Mid

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

Синтаксис:

Midlstring, start [, length])

Аргументы:

  • string — строковое выражение, из которого извлекается подстрока
  • start — позиция символа в строке string, с которого начинается нужная подстрока
  • length — число возвращаемых символов подстроки.

Len

Возвращает число символов строки.

Синтаксис:

Len (Строка)

Функция

Возвращаемое выражение

LTrim

Возвращает копию строки без пробелов в начале.

Синтаксис:

LTrim (Строка)

Rtrim

Возвращает копию строки без пробелов в конце.

Синтаксис:

RTrim (Строка)

Trim

Возвращает копию строки без пробелов в начале и в конце

Синтаксис:

Trim (Строка)

Space

Возвращает строку, состоящую из указанного числа пробелов.

Синтаксис:

Space (Число)

String

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

Синтаксис:

String (number, character)

Аргументы:

  • number — число повторений символа О character — повторяемый символ

StrComp

Возвращает результат сравнения двух строк.

Синтаксис:

StrComp(stringl, string2 [, compare])

Аргументы:

  • string1 и string2 — два любых строковых выражения
  • compare — указывает способ сравнения строк. Допустимые значения: 0 (двоичное сравнение), 1 (посимвольное сравнение без учета регистра)

Возвращаемые значения:

  • stringl меньше, чем string2, то -1
  • stringl равняется string2, то 0
  • stringl больше, чем string2, то 1

InStr

Возвращает позицию первого вхождения одной строки внутри другой строки.

Синтаксис:

InStr ( [start, ] stringl, st'ring2 [ , compare])

Аргументы:

  • start — числовое выражение, задающее позицию, с которой начинается каждый поиск. Если этот аргумент опущен, поиск начинается с первого символа строки
  • stringl — строковое выражение, в котором выполняется поиск
  • string2 — искомое строковое выражение
  • compare — указывает способ сравнения строк. Допустимые значения: 0 (для двоичного сравнения), 1 (посимвольное сравнение без учета регистра)

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

В VBA имеются следующие, функции времени и даты.

Функция

Возвращаемое значение

Date

Возвращает значение типа Variant (Date) , содержащее текущую системную дату

Time

Возвращает значение типа Variant (Date) , содержащее текущее время по системным часам компьютера

Now

Возвращает значение типа Variant (Date) , содержащее текущую дату и время по системному календарю и часам компьютера

Hour, Minute, Second

Возвращают значения типа variant (integer), содержащее целое число, которое представляет часы, минуты и секунды в значении времени.

Синтаксис:

Hour (время) Minute (время) Second (время)

  • время — значение времени или выражение, его определяющее В следующем примере переменной Час присваивается 16, Минута — 35 иСекунда — 17: РасчетноеВремя = #4:35:17 РМ# Час = Hour (РасчетноеВремя) Минута = Minute (РасчетноеВремя) Секунда = Second (РасчетноеВремя)

Day, Month, Year

Возвращает значение типа Variant (Integer), содержащее целое число, которое представляет день, месяц, год в значении даты. Синтаксис: Month (дата) Year (дата) Q дата —значение даты или выражение, ее определяющее

Функция

Возвращаемое значение

Weekday

Timer DateDif f

В следующем примере переменной день присваивается 17, Месяц — May, Год— I960: День Рождения = #Мау 17, 1960# День = Day (День Рождения) Месяц = Month (День Рождения) Год = Year (День Рождения) Возвращает значение типа Variant (integer) , содержащее целое число, представляющее день недели. Синтаксис: Weekday (date, [ f irstdayofweek] )

  • date — выражение, представляющее дату
  • f irstdayofweek — указывает первый день недели. Если этот аргумент опущен, подразумевается vbSunday (воскресенье). Допустимы также значения: vbMonday (понедельник), vbTuesday (вторник), vbWednesday (среда), vbThursday (четверг), vbFriday (пятница) и vbSaturday (суббота) В следующем примере переменной День Не дели присваивается 3, т. е. вторник: ДеньРождения = #Мау 17, 1960# ДеньНедели = Weekday (ДеньРождения) Возвращает значение типа Single, представляющее число секунд, прошедших после полуночи Возвращает значение типа Variant (Long) , указывающее число временных интервалов между двумя датами.

Синтаксис:

DateDif f (interval, datel, date2[, firstdayofweek [, f irstweekof year] ] )

Аргументы:

  • Interval — строковое выражение, указывающее тип временного интервала, который следует использовать при вычислении разности между датами datel и date2. Допустимые значения: уууу (год), q (квартал), m (месяц), у (день года), d (день месяца), w (день недели), ww (неделя), h (часы), m (минуты), s (секунды)
  • datel, date2 — значения типа Variant (Date). Две даты, разность между которыми следует вычислить
  • firstdayofweek — постоянная, указывающая первый день недели Q firstweekofyear— постоянная, указывающая первую неделю года В следующем примере переменной ПрожилМесяцевСРождения присваивается 465: ПрожилМесяцевСРождения = DateDiff ("m", #5/17/601, Now)

Функция

Возвращаемое значение

DatePart DateAdd

TimeSerial DateSerial TimeValue

Возвращает значение типа variant (Integer) , содержащее указанный компонент даты.

Синтаксис:

DatePart (interval, date [, firstdayofweek[, firstweekofyear] ] )

Возвращает значение типа Variant ( Date ) , содержащее дату, к которой добавлен указанный временной интервал.

Синтаксис:

DateAdd'(interval, number, date)

Аргументы:

  • Iinterval — строковое выражение, указывающее тип добавляемого временного интервала
  • number — числовое выражение, указывающее число временных интервалов, которое следует добавить. Оно может быть положительным (для получения более поздних дат) или от-. рицательным (для получения более ранних дат).
  • date — значение типа Variant (Date) или литерал даты, представляющий дату, к которой добавляется указанный временной интервал

В следующем примере переменной день присваивается 03/17/63-: День = DateAdd ("m", 34, |05/17/60#) Возвращает значение типа Variant (Date) , содержащее значение времени, соответствующее указанным часу, минуте и секунде.

Синтаксис:

TimeSerial (hour, minute, second)

Аргументы:

  • hour, minute и second — значения типа Variant ( Integer) В данном примере переменной Время присваивается 16:35:17: Время = TimeSerial (16, 35, 17)

Возвращает значение типа Variant (Date) , соответствующее указанному году, месяцу и дню. Синтаксис: DateSerial (year, month, day)

Аргументы:

  • year, month и day — значения типа Integer

В следующем примере переменной Дата присваивается

05/17/60: Дата = DateSerial (1960, 5, 17) Преобразует строку в формат времени

Функции выбора

Кроме перечисленных выше основных категорий функций в VBA имеются также функции выбора, которые дублируют некоторые аспекты операторов условного перехода. Ниже приведены эти функции.

Функция

Возвращаемое значение

lit

Choose

Switch

Возвращает одну из двух альтернатив.

Синтаксис:

  • If(expr, truepart, falsepart)
  • expr — проверяемое выражение
  • truepart — значение или выражение, возвращаемое, если ехрг имеет значение True
  • falsepart — значение или выражение, возвращаемое, если ехрг имеет значение False В следующем примере, если значение переменной ОценкаЦифрой равно 5, то переменной ОценкаПрописыо присваивается строковая константа Отлично. В противном случае ей присваивается значение Не отлично: ОценкаПрописью = Ilf (ОценкаЦифрой = 5, "Отлично", "Не отлично")

Возвращает значение, выбранное из списка аргументов.

Синтаксис:

Choose (индекс, вариант-1[, вариант-2, ... [, вариант-п] ] )

  • индекс — числовое выражение или поле, значением которого является число, лежащее между 1 и числом элементов в списке
  • вариант — выражение типа Variant, содержащее один из элементов списка

Действие функции Choose: если индекс равняется 1 , возвращается первый элемент списка, если индекс равняется 2, возвращается второй элемент списка и т. д. Функцию choose можно использовать для выбора одного из возможных значений, представленных в виде списка. В следующем примере, если аргумент Выбор принимает значение 3, то переменной РезультатВыборы присваивается значение "три": РезультатВыборы = Choose (Выбор, "один", "два", "три") Возвращается значение, соответствующее первому истинному выражению в списке.

Синтаксис:

Switch ( выражение- 1, значение-1, выражение-2, значение-2 ... [, выражение-n, значение-п] ] )

Функции, возвращающие строки

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

  • Для экономии памяти, если в программе имеется очень много переменных
  • При выполнении прямой записи данных в файлы с произвольным доступом

Перечисленные ниже функции возвращают значения типа String, если к их имени добавляется символ доллара ($). Эти функции имеют такое же применение и синтаксис, как и их эквиваленты без символа доллара, возвращающие тип Variant.

Chr$ | CurDir$ | Date$ | Dir$
Error$ | Format$ | Input$ | InputB$
LCase$ | Left$ | LTrim$ | MidS
Right$ | Rtrim$ | Space$ | Str$
String$ | Тime $ | Trim$ | Ucase$

Встроенные диалоговые окна

В проектах VBA часто встречаются две разновидности диалоговых окон: окна сообщений и окна ввода. Они встроены в VBA, и если их возможностей достаточно, то можно обойтись без проектирования диалоговых окон. Окно сообщений (MsgBox) выводит простейшие сообщения для пользователя, а окно ввода (InpuBox) обеспечивает ввод информации.

Функция

Выводит на экран диалоговое окно, содержащее сообщение

InputBox

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

Синтаксис:

InputBox (prompt [, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Аргументы:

  • prompt — строковое выражение, отображаемое как сообщение в диалоговом окне. Строковое значение prompt может содержать несколько строк. Для разделения строк допускается использование символа возврата каретки (Сhr(13)), символа перевода строки (chr (10)) или комбинацию этих символов (Chr( 13) & Chr (10)) П title — строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения
  • default — строковое выражение, Отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода изображается пустым
  • xpos — числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана. Если этот аргумент опущен, диалоговое окно выравнивается по центру экрана по горизонтали
  • ypos — числовое выражение, задающее расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана. Если этот аргумент опущен, диалоговое окно помещается по вертикали примерно на одну треть высоты экрана
  • helpfile — строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо наличие также аргумента context
  • context - числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо наличие также аргумента helpfile

Процедура

Выводит на экран диалоговое окно, содержащее сообщение,

MsgBox

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

Синтаксис:

MsgBox (prompt [, buttons] [, title] [, helpfile, context])

Аргументы:

  • prompt — строковое выражение, отображаемое как сообщение в диалоговом окне
  • buttons — числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и модальность окна сообщения. Значение по умолчанию этого аргумента равняется 0. Значения констант, определяющих число и тип кнопок используемого значка, приведены в табл. 11.1 — 11.3
  • title — строковое выражение, отображаемое в строке , заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения
  • helpfile — строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо указать также аргумент context
  • context — числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо указать также аргумент helpfile

Таблица 11.1. Значения аргумента buttons процедуры MsgBox, определяющие отображаемые кнопки в диалоговом окне

Константа | Значение | Отображаются кнопки
vbOKOnly | 0 |
VbOKCancel | 1 |
VbAbortRetrylgnore | 2 |
VbYesNoCancel | 3 |
VbYesNo | 4 |
VbRetryCancel | 5 |

Таблица 11.2. Значения аргумента buttons процедуры м$двох, определяющие отображаемые информационные значки в диалоговом окне

Константа | Значение | Значок сообщения
VbCritical | 16 |
VbQuestion | 32 |
VbExclamation | 48 |
VbInformation | 64 |

Таблица 11.3. Значения аргумента buttons процедуры MsgBox, определяющие

основную кнопку в диалоговом окне

Константа | Значение | Номер основной кнопки
VbDefaultButton1 | 0 | 1
VbDefaultButton2 | 256 | 2
VbDefaultButton3 | 512 | 3
VbDefaultButton4 | 768 | 4

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

Константа. | Значение | Нажатая кнопка
vbOK | 1 | OK
vbCancel | 2 | Отмена (Cancel)
vbAbort | 3 | Прервать (Abort)
vbRetry | 4 | Повторить (Retry)
vbIgnore | 5 | Пропустить (Ignore)
vbYes | 6 | Да (Yes)
vbNo | 7 | Нет (No)

Приведем пример использования окон сообщений. В результате действия приведенной ниже процедуры Тестокон появится диалоговое окно пример окна ввода с полем ввода (рис. 11.1). Следуя приглашению в этом диалоговом окне, введем в поле ввода имя, например Андрей. Нажмем кнопку ок.

На экране отобразится диалоговое окно пример окна сообщения с текстом приветствия (рис. 11.2). Если пользователь не введет имя в поле ввода диалогового окна пример окна ввода или нажмет кнопку Отмена, то компьютер выразит свое неудовлетворение действиями пользователя отображением диалогового окна Еще один пример окна сообщения (рис. 11.3).

Рис. 11.1. Диалоговое окно Пример окна ввода

Рис. 11.2. Диалоговое окно

Пример окна сообщения

Рис. 11.3. Диалоговое окно Еще один пример окна сообщения

Private Sub ТестОкон()

'

' Описание переменной

Dim ИмяКлиента As String

'

' Ввод имени пользователя

'

ИмяКлиента = InputBox("Введите ваше имя", "Пример окна ввода")

' Реакция программы на ввод имени пользователя

If, ИмяКлиента <> "" Then

MsgBox "Привет, " & ИмяКлиента, vbInformation,

"Пример окна сообщения"

Else

MsgBox "Невежа, ты забыл ввести свое имя " & ИмяКлиента,

vbExclamation, "Еще один пример окна сообщения"

End If

End Sub

Приведем еще один пример использования диалоговых окон. Этот пример позволяет отобразить на экране диалоговое окно с тремя кнопками да, нет и отмена и информационным знаком. Клавише <Enter> назначена функция кнопки да. По нажатию одной из этих кнопок на экране отображается сообщение, подтверждающее нажатие.

Sub ТриКнопки()

Dim Сообщение As String

Dim Кнопка As Integer

'

' В переменной Сообщение задается структура диалогового окна

'

Сообщение = vbYesNoCancel + vbQuestion + vbDefaultButtonl

'

' В переменную Кнопка вводится целое число, возвращаемое MsgBox

' при нажатии кнопки

'

Кнопка= MsgBox("Выбираете Да, Нет или Отмена?", Сообщение, "Еще пример")

'

' В зависимости от значения переменной Кнопка,

' на экране отображается соответствующее сообщение '

Select Case Кнопка Case vbYes

MsgBox "Выбрали Да", vblnformation, "Еще пример" Case vbNo

MsgBox "Выбрали Нет", vblnformation, "Еще пример" Case vbCancel

MsgBox "Выбрали Отмена", vblnformation, "Еще пример"

End Select

End Sub

Инструкции VBA

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

  • Инструкции описания
  • Инструкции присвоения
  • Исполняемые инструкции

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

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

Синтаксис:

[Let] Переменная (или Постоянная или Свойство Объекта) = Выражение

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

х = 2

х = х + 2

переменной х будет присвоено 4.

Для присвоения переменной ссылки на объект применяется инструкция Set. В следующем примере инструкция Set присваивает переменной Область диапазон А1:B3:

Set Область = Range("Al:B3")

В общем случае инструкция set имеет следующий синтаксис:

Set объектнаяПеременная = {[New] объектноеВыражение | Nothing}

  • ключевое слово New используется при создании нового экземпляра класса;
  • ключевое слово Nothing позволяет освободить все системные ресурсы и ресурсы памяти, выделенные для объекта, на который имелась ссылка (вольно говоря, она удаляет объект из памяти).

Перенос строки

Расположение символов (пробел) + (Знак подчеркивания) в конце строки обеспечивает то, что последующая строка является продолжением предыдущей. При этом надо помнить, что:

  • Нельзя разбивать переносом строковые константы
  • Допустимо не более семи продолжений одной и той же строки
  • Сама строка не может состоять более, чем из 1024 символов

В следующем примере первая из конструкций является разбиением второй на две строки:

у = sin(Application.Pi()*х) + (1 + х)^(1/2)/(1 + х^2)

у = Sin (Application. Pi ()*x) + (1 + х)^(1/2)/(1 + х^2)

Комментарии

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

  1. Делают программу легко читаемой, поясняя смысл программных кодов и алгоритма.
  2. Временно отключают фрагменты программы при ее отладке. В языке VBA существуют два способа ввода комментариев:
  • Применение апострофа (')• Его можно ставить в любом месте строки. При этом все символы, начиная от апострофа до конца строки, будут восприниматься компилятором как комментарий.
  • Применение зарезервированного слова Rem вместо апострофа.

Ниже приведен пример использования комментариев в тексте программы:

Dim a As Integer

'

' а — целая переменная

'

Dim b As String

'

b — строковая переменная

Расположение нескольких операторов на одной строке

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

1. х = х + 1

и

2. х = х + 1:у = х + 2

у = х + 2

Операторы перехода и выбора

Перечислим операторы перехода и выбора VBA.

Оператор

Действие

GoTo

If Then Else

Select Case

Оператор безусловного перехода.

Синтаксис:

GoTo Строка

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

Синтаксис:

If Условие Then [Инструкции] [Else Инструкции else]

Если Условие принимает значение True, то выполняется инструкция (или инструкции) после Then, если False, то выполняется инструкция (или инструкции) после Else. Ветвь Else является необязательной.

Допускается также использование формы синтаксиса в виде блока:

If Условие Then [Инструкции]

[Elself Условие-n Then [Инструкции

elseif ] . . . [Else [Инструкции else] ] End If Оператор выбора. Синтаксис: Select Case выражение [Case списокВыражений-1 [ инструкции- 1] ]

[Case списокВыражений-n [инструкции-п] ] [Case Else [инструкции else] ]

End Select

Оператор

Действие

инструкции-n (необязательная часть) - одна или несколько инструкций, выполняемых в том случае, если выражение совпадает с любым компонентом списка список-Выражений-n инструкции else (необязательная часть) - одна или несколько инструкций, выполняемых в том случае, если выражение не совпадает ни с одним из предложений Case

On Error GoTo строка

Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением последнего может быть любая метка строки или номер строки. Для того чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, необходимо помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:

Sub InitializeMatrix (Varl, Var2, Var3, Var4) On Error GoTo ОбработкаОшибок

Exit Sub ОбработкаОшибок :

Resume Next .

End Sub

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

On Error Resume Next

Указывает, что при возникновении ошибки происходит передача управления на инструкцию, непосредственно следующую за инструкцией, вызвавшей ошибку

On Error GoTo 0

Отключает любой активизированный обработчик ошибок в текущей процедуре

Операторы повтора

Перечислим операторы повтора VBA.

Оператор | Действие
For — Next | Синтаксис: For Счетчик = Начало То Конец [Step Шаг] [Инструкции]

For Each - Next Do Until — Loop

Do — Loop While Do While — Loop

[Exit For] [Инструкции] Next [Счетчик] Повторяет выполнение группы инструкций, пока Счетчик изменяется от начального значения до конечного с указанным шагом. Если Шаг не указан, то он полагается равным 1.

Альтернативный способ выхода из цикла предоставляет инструкция Exit For

Синтаксис:

For Each Элемент

In Группа [Инструкции] [Exit For] [Инструкции]

Next [Элемент]

Повторяет выполнение группы инструкций для каждого элемента массива или семейства. Альтернативный способ выхода из цикла предоставляет инструкция Exit For

Синтаксис:

Do [While Условие] [Инструкции] [Exit Do] [Инструкции] Loop

Повторяет выполнение набора инструкций, пока условие имеет значение True. Условие проверяется после выполнения инструкции по крайней мере один раз. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Синтаксис:

Do [Инструкции] [Exit Do] [Инструкции] Loop [While Условие]

Повторяет выполнение набора инструкций, пока условие имеет значение True. Сначала выполняется инструкция, а потом проверяется условие. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Синтаксис:

Do [While Условие] [Инструкции] [Exit Do]

Оператор | Действие
Do — Loop Until While — Wend | [Инструкции] Loop Повторяет выполнение набора инструкций, пока условие не примет значение True. Условие проверяется после выполнения инструкции по крайней мере один раз. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do Синтаксис: Do [Инструкции] [Exit Do] [Инструкции] Loop [While Условие] Повторяет выполнение набора инструкций, пока условие не примет значение True. Сначала выполняется инструкция, а потом проверяется условие. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do Синтаксис: While Условие [Инструкции] Wend Выполняет последовательность инструкций, пока заданное условие имеет значение True

Условная компиляция

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

Синтаксис:

#Const имяКонстанты = выражение

Аргументы:

ИмяКонстанты | Имя константы; должно соответствовать стандартным соглашениям об именах переменных
выражение | Константа в явном представлении, другая условная константа компилятора или любая их комбинация, которая включает любые арифметические или логические операторы, за исключением is

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

Синтаксис:

#If выражение Then

инструкции [#Elself выражение-n Then

[инструкции_elseif]] [#Еlse

[инструкции_elseif ]],

#End If

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

IConst WinPl = 1

' если Windows95, то Const WinPl = 1

' если Windows NT, то Const WinPl = 2

#If WinPl = 1 Then ФайлЗаставка = Start95.bmp"

#If WinPl = 2 Then ФайлЗаставка = "StartNT.bmp"

Процедура

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

Синтаксис:

[Private | Public] [Static] Sub Имя [(СписокАргументов)] [Инструкции]

[Exit Sub] [Инструкции]

End, Sub

Элементы описания:

Public | Указывает, что процедура Sub доступна для всех других процедур во всех модулях
Private | Указывает, что процедура sub доступна для других процедур только того модуля, в котором она описана
Static | Указывает, что локальные переменные процедуры sub сохраняются в промежутках времени между вызовами этой процедуры
Имя | Имя процедуры Sub, удовлетворяющее стандартным правилам именования переменных
СписокАргументов | Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой
Инструкции | Любая группа инструкций, выполняемых в процедуре Sub

Инструкция Exit sub приводит к немедленному выходу из процедуры sub.

Синтаксис элемента СписокАргументов:

[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )]

[As тип] [= поУмолчанию]

Optional | Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке СписокАргументов, также должны быть необязательными и описаны с помощью ключевого слова optional. Все аргументы, описанные как Optional, должны иметь тип variant. He допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray
ByVal | Указывает, что этот аргумент передается по значению
ByRef | Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию
ParamArray | Используется только в качестве последнего элемента в списке СписокАргументов для указания, что конечным аргументом является описанный как Optional массив значений типа variant. Ключевое слово paramArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами Byval, ByRef или Optional
имяПеременной | Имя переменной, удовлетворяющее стандартным правилам именования переменных
тип | Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только строки переменной длины), object, variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип
поУмолчанию | Любая константа или выражение, дающее константу. Используется только вместе с параметром optional. Если указан тип object, единственным значением по умолчанию может быть значение Nothing

Приведенный ниже синтаксис описывает имя, аргументы и текст программы, составляющие тело процедуры Function.

Синтаксис:

[Public I Private] [Static] Function Имя [(СписокАргументов)]

[As Тип]

[Инструкции]

[Имя = Выражение]

[Exit Function]

[Инструкции]

[Имя = Выражение] End Function

Синтаксис инструкции Function содержит те же элементы, что и sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function.

Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры sub, когда требуется использовать возвращаемое функцией значение, .процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, cos.

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

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

Переход в подпрограмму и возвращение из подпрограммы

В VBA от первоначальных версий BASIC сохранилась конструкция подпрограммы GoSub- Return, которая в настоящее время редко используется. Для полноты изложения вкратце напомним синтаксис этой инструкции.

Синтаксис:

GoSub строка

строка

Return

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

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

Вызов процедуры

Вызов процедуры sub из другой процедуры можно произвести несколькими способами.

Первый способ вызова процедуры Sub: ИмяПроцедуры СписокФактическихПараметров

ИмяПроцедуры | Имя вызываемой процедуры
СписокФактическихПараметров | Список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в процедуре по количеству и типу

Если требуется использовать несколько процедур с одинаковыми названиями, при их вызове после имени процедуры через точку надо указывать имя модуля, на котором они расположены. А именно, ИмяМодуля.ИмяПроцедуры СписокФактическихПараметров

Второй способ вызова процедуры sub производится с помощью инструкции Call.

ИмяПроцедуры (СписокФактическихПараметров)

Обратите внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.

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

Приведенный ниже пример показывает основные способы передачи параметров в процедуры.

Dim с As Double ',

'

' с - глобальный параметр '

Function F(ByVal x As Integer) As Integer

F = x ^ 2

End Function

Sub Assistant(ByVal a As Integer, ByVal b As Integer)

'

' Процедура, находящая сумму двух чисел и выводящая

' результат в диалоговом окне

'

с = а + b

'

MsgBox CStr(c)

End Sub

'

Sub Main ()

'

' Процедура, находящая сумму двух чисел и выводящая

' результат в диалоговом окне

Dim x, у As Double

' x, у — переменные, используемые в качестве фактических параметров

' Вызов процедуры с конкретными числами как фактическими параметрами

'

Assistant 1, 3

' Первоначальное присвоение переменным значений,

' с последующим вызовом процедуры

'

х = 1: у = 1 Assistant x, у + 2

' Использование функции как фактического параметра

'

х = 1: у = 3

Assistant F(x), у

'

' Вызов процедуры с указанием фактических параметров по имени

'

Assistant a:=l, b:=3

End Sub

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

=СторонаТреугольника(;В2;С2)

вычисляет катет А по введенным в ячейки В2 и С2 длинам катета В и гипотенузы С. При работе с необязательными переменными необходимо использовать функцию isMissing, возвращающую значение True, если соответствующий аргумент не был передан в процедуру, и False в противном случае.

Function СторонаТреугольника(Optional A,

Optional В, Optional С)

If Not (IsMissing(A)) And Not (IsMissing(В)) Then

СторонаТреугольника = Sqr(А ^ 2 + В ^ 2)

End If

If Not (IsMissing(A)) And Not (IsMissing(C)) Then

СторонаТреугольника = Sqr(С ^ 2 - А ^ 2)

End If

If Not (IsMissing(B)) And Not (IsMissing(C)) Then

СторонаТреугольника = Sqr(C ^ 2 - В ^ 2)

End If

End Function

Назначение значений по умолчанию необязательным параметрам

Для необязательного параметра можно определить значение по умолчанию. В следующем примере, если значение параметра ь не передано в функцию, то ему присваивается указанное по умолчанию значение 8.

Function Сумма (a As Double, Optional b As Double = 8)

Сумма = a + b End Function

Использование неопределенного количества параметров

Как правило, количество передаваемых параметров в процедуру совпадает с количеством определенных у этой процедуры параметров. Однако ключевое слово ParamArray предоставляет возможность ввода в процедуру произвольного, заранее не указанного числа параметров (например, как это происходит при использовании функции рабочего листа СУММ (sum)). В качестве примера приведем процедуру, которая выполняет то же действие, что и функция рабочего листа СУММ. Отличием функции СуммаПользователя от СУММ является то, что в ней в каждое поле ввода диалогового окна мастера функций можно вводить только либо число, либо ссылку на ячейку, а не на диапазон, как при работе с функцией СУММ.

Function СуммаПользователя(ParamArray Массив())

s = 0

For Each a In Массив

s = s + а Next a

СуммаПользователя = s

End Function

Рекурсивные процедуры

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

Fact(n) =n!, где Fact (0) =1.

Ясно, что

Fact(n) = n Fact (n - 1}

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

Function Fact(n As Integer) As Integer

If n<l Then

Fact = 1 Else

Fact = Fact(n - 1) n

End If

End Function

Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (нод) двух целых чисел — это наибольшее целое, на которое делятся оба числа. Например, HOД(10, 14} = 2 и НОД (15, 31} = 1.

Алгоритм Евклида состоит в следующем:

  1. Если а делится на b, то НОД(а, b) = b
  2. В противном случае — НОД(а, b) = НОД(b, a Mod b) Приводимая ниже рекурсивная функция программирует алгоритм Евклида.

Function НОД(Целое1 As Long, Целое2 As Long) As Long

If Целое2 Mod Целое1 = 0 Then

НОД = Целое1 Else

НОД = НОД(Целое2, Целое1 Mod Целое2)

End If

End Function

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

Область определения переменной

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

  1. Переменные уровня процедуры используются только в процедуре, в которой они описаны при помощи инструкции Dim, размещенной в процедуре.
  2. Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim, размещенной в области описания модуля, т. е. перед описанием процедур.
  3. Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.

Время жизни переменной

Личная (private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.


  • ГЛАВА 12. ПРОЦЕДУРЫ ОБРАБОТКИ ОШИБОК И ОТЛАДКА ПРОГРАММ
    • РАЗРАБОТКА ПРОЦЕДУР, ПРЕДОТВРАЩАЮЩИХ ПОЯВЛЕНИЕ ОШИБОК
      • Перехват и обработка ошибок
    • ОТЛАДКА ПРОГРАММ
      • Ошибки компиляции
      • Ошибки выполнения
      • Логические ошибки
      • Инструкция Option Explicit
      • Пошаговое выполнение программ
      • Точка останова
      • Вывод значений свойств и переменных

Глава 12.

Процедуры обработки ошибок и отладка программ

Разработка процедур, предотвращающих появление ошибок

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

  • Предотвращение ошибок: программно анализировать вводимые или вычисляемые данные и в случае, если они могут приводить к ошибке, обеспечить, чтобы программа информировала пользователя о необходимости корректного задания данных.
  • Обработка ошибок: в случае появления ошибки, перехватить ее, обработать и программно откликнуться на возникшую ошибку.
  • При создании приложений надо сочетать оба подхода, применяя в каждом конкретном случае и для каждой возможной ошибки тот, который кажется разработчику наиболее эффективным.
  • В данном разделе рассмотрим процесс создания приложения, в котором предотвращается появление ошибок, на простейшем примере:
  • В диалоговом окне два поля (числитель и знаменатель) предусмотрены для ввода данных. Пользователь вводит в них по числу (рис. 12.1).
  • По нажатию кнопки Счет, программа делит число, введенное в поле Числитель, на число, введенное в поле знаменатель, и выводит полученный результат в поле ответ.

Следующая программа производит деление числителя на знаменатель по нажатию кнопки Счет без контроля появления возможных ошибок:

Private Sub CommandButtonl_Click()

Dim Числитель, Знаменатель, Результат As Double

Числитель = CDbl(TextBoxl.Text)

Знаменатель = CDbl(TextBox2.Text)

Результат = Числитель / Делитель

TextBoxS.Text = CStr(Результат)

End Sub

Рис. 12.1. Диалоговое окно Деление

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

Рис. 12.2. Диалоговое окно Microsoft Visual Basic с сообщением об ошибке

Данное сообщение об ошибке связано с одной из следующих двух инструкций в программе:

Числитель = CDbl(TextBoxl.Text)

Знаменатель = CDbl(TextBox2.Text)

где аргументом функции соы должна быть строка, преобразуемая в число. Если в какое-то из полей, числитель или Знаменатель, ничего не введено, по умолчанию из этого поля будет считываться пустая строка. Но пустая строка не может быть преобразована в число, и поэтому из-за функции CDbl происходит ошибка. Ошибка о несоответствии типов возникнет также, если в одно из полей пользователь по неосторожности введет число с десятичной запятой, а установками системы предусматривается десятичная точка и наоборот.

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

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

Рис. 12.3. Пример сообщения о некорректном вводе данных

  • Если вводимая информация не преобразуется в числа, то выдается сообщение о поле, в которое некорректно введены данные, и на него перемещается фокус. Например, в ситуации, показанной на рис. 12.3, в поле

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

Private Sub CoramandButtonl_Click()

Dim Числитель, Знаменатель, Результат As Single

'

If IsNumeric(TextBoxl.Text) = False Then MsgBox "Ошибка в числителе",

vblnformation, "Деление" TextBoxl.SetFocus

Exit Sub

End If

'

If IsNumeric(TextBox2.Text) = False Then

MsgBox "Ошибка в знаменателе",

vblnformation, "Деление"

TextBox2.SetFocus

Exit Sub

End If

'

Числитель = CDbl(TextBoxl.Text)

Знаменатель = CDbl(TextBox2.Text)

Результат = Числитель / Делитель

TextBox3.Text = CStr(Результат)

End Sub

Но это еще не все подводные камни, которые подстерегают неосторожного пользователя при вводе данных даже в этом простом примере. Если пользователь в поле Знаменатель введет 0, то также произойдет аварийная остановка выполнения программы с отображением в диалоговом окне Microsoft Visual Basic сообщения: Деление на 0. Для избежания подобной ошибки будем проверять не только, являются ли введенные в поле данные числом, но и что это не ноль. Например, добавим перед расчетным блоком в процедуре следующую дополнительную проверку:

If CDbl(TextBox2.Text) = 0 Then

MsgBox "Знаменатель не может быть нулем", vblnformation, "Деление"

TextBox2.SetFocus

Exit Sub

End If

Перехват и обработка ошибок

Из диалогового окна Microsoft Visual Basic видно, что каждая ошибка имеет свой код. В табл. 12.1 приведены коды наиболее часто встречаемых ошибок.

Таблица 12.1. Коды наиболее часто встречаемых ошибок

Код | Сообщение
5 | Приложение не запущено
6 | Переполнение
7 | Не хватает памяти
9 | Индекс выходит за пределы допустимого диапазона
11 | Деление на нуль
13 | Несоответствие типа
18 | Произошло прерывание, вызванное пользователем
52 | Неправильное имя файла или идентификатор
53 | Файл не найден
54 | Неверный режим работы с файлом
55 | Файл уже открыт
56 | Ошибка ввода-вывода
61 | Переполнение диска
68 | Устройство недоступно
71 | Диск не готов
72 | Повреждена поверхность диска
335 | Невозможен доступ к системным ресурсам
368 | Истек срок действия данного файла. Программе требуется файл более новой версии
482 | Ошибка принтера

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

Инструкция

On Error

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

Подпрограмма обработки ошибки

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

Синтаксис 1:

On Error GoTo строка

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

Синтаксис 2:

On Error Resume Next

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

Синтаксис 3:

On Error GoTo 0

Отключает любой активизированный обработчик ошибок в текущей процедуре.

Инструкция

Resume

Обеспечивает процедуре возможность продолжить работу после обработки ошибки. Допустимы следующие синтаксисы.

Синтаксис 1:

Resume

После обработки ошибки управление передается той инструкции, в которой произошла ошибка.

Синтаксис 2:

Resume строка

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

Синтаксис 3:

Resume Next

После обработки ошибки управление передается инструкции, следующей за инструкцией, в которой произошла ошибка.

Инструкция

Exit

Останавливает выполнение процедуры.

Допустимые синтаксисы:

  • Exit Sub
  • Exit Function
  • Exit Property

Подпрограмма обработки ошибки обычно включает объект Err, который содержит информацию об ошибках выполнения. Приведем свойства и методы объекта Err.

Свойства объекта Err

Number | Возвращает код ошибки
Source | Имя текущего проекта VBA
Description | Возвращает строковое выражение, содержащее текст сообщения об ошибке
HelpFile | Полное имя (включая диск и путь) файла справки VBA
HelpContext | Контекстный идентификатор файла справки VBA, соответствующий ошибке с кодом, указанным в свойстве Number
LastDLLError | Содержит системный код ошибки для последнего вызова библиотеки динамической компоновки (DLL)

Методы объекта Err

Clear

Очищает все значения свойств объекта Err. Метод clear используется для явной очистки значений свойств объекта Err после завершения обработки ошибки. Это необходимо, например, при отложенной обработке ошибки, которая задается инструкцией on

Error Resume Next

Raise

Создает ошибку выполнения. Используется при моделировании ситуаций ошибки.

Синтаксис:

Raise number, source, description, helpfile, helpcontext

Аргументы:

  • number — номер ошибки, т. е. целое число от 0 до 65535
  • source — строковое выражение, определяющее имя объекта или приложения, в котором возникла ошибка
  • description — строковое выражение, содержащее описание ошибки
  • Helpfile — полное имя (включая диск и путь) файла справки Microsoft Windows, содержащего описание данной ошибки
  • helpcontext — контекстный идентификатор, определяющий соответствующий обрабатываемой ошибке раздел в файле, указанном в аргументе helpfile

На конкретном примере покажем, как применяется объект Err при создании обработчика ошибок. В предыдущем разделе в процессе создания диалотового окна деление и связанной с ним программы, на первый взгляд были предусмотрены все возможные ошибки. Но это только на первый взгляд. Введем, например, в поле Знаменатель значение 1е-40. Это число ничем не лучше или не хуже любого другого числа типа single. Тем не менее, вместо вывода результата произойдет аварийное прерывание выполнения программы с отображением сообщения об ошибке переполнения. Усовершенствуем программу с учетом возможности обработки подобной ошибки. В обработчике ошибок предусмотрим два отклика:

  • Пользователь информируется программой в случае появления ошибки переполнения, знаменателю и числителю присваиваются 1 и с этими данными проводятся вычисления.
  • При появлении ошибки, отличной от ошибки переполнения, выполнение программы прерывается с информированием пользователя об ошибке (рис. 12.4).

Рис. 12.4. Диалоговое окно с указанием типа ошибки

Private Sub CommandButtonl_Click()

Dim Числитель, Знаменатель, Результат As Single

'

' Передача управления на обработчик ошибок,

' помеченный меткой Обработка

'

On Error GoTo Обработка

'

' Проверка, является ли числитель числом

'

If IsNumeric(TextBoxl.Text) = False Then MsgBox "Ошибка в числителе",

vblnformation, "Деление" TextBoxl.SetFocus

Exit Sub

End If

' Проверка, является ли знаменатель числом

'

If IsNumeric(TextBox2.Text) = False Then

MsgBox "Ошибка в знаменателе",

vblnformation, "Деление"

TextBox2.SetFocus

Exit Sub

End If

'

' Проверка, не является ли знаменатель нулем

'

If CDbl(TextBox2.Text) = 0 Then

MsgBox "Знаменатель не может быть нулем", vblnformation, "Деление"

TextBox2.SetFocus

Exit Sub

End If

'

Числитель = CDbl(TextBoxl.Text)

Знаменатель = CDbl(TextBox2.Text)

Результат = Числитель / Знаменатель

TextBox3 . Text = CStr (.Результат)

'

' Выход из процедуры в случае успешного нахождения результата

'

Exit Sub

'

' Обработчик ошибок

'

Обработка: Select Case Err.Number

'

' Обработка ошибки переполнения

'

Case Is = 6

MsgBox " Произошла ошибка переполнения",

vblnformation, "Деление"

TextBoxl.Text = 1

TextBox2.Text = 1

Знаменатель = 1

Числитель = 1 Resume

' Обработка любой другой ошибки

'

Case Else

MsgBox "Произошла ошибка: " & Err.Description &

vblnformation, "Деление"

Exit Sub

End Select

End Sub

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

Отладка программ

При написании программ пользователь независимо от его опыта допускает те или иные ошибки. Кто-то из мудрых совершенно верно подметил, что только тот, кто ничего не делает, не совершает ошибок. Позвольте перефразировать эту жизненную мудрость для изучаемого в данной книге предмета следующим образом: в программах не делал ошибок только тот, кто никогда не писал их. Итак, ошибки — это объективная неизбежность или реальное воплощение этой неизбежности. Какие же бывают ошибки и как с ними бороться? Условно ошибки можно поделить на три типа: ошибки компиляции, выполнения и логические ошибки.

Ошибки компиляции

Ошибки компиляции возникают, если VBA не может интерпретировать введенный код. Например, при некорректном вводе числа скобок, неправильном имени, неполном вводе инструкции и т. д. Некоторые из этих ошибок обнаруживаются VBA при завершении набора строки с инструкцией в редакторе кода и после нажатия клавиши <Enter>. Строка, в которой содержится ошибка, выделяется красным цветом, и на экране отображается диалоговое окно с сообщением о возможной причине, вызвавшей ошибку (рис. 12.5).

Рис. 12.5. Сообщение об ошибке компиляции, обнаруженной при вводе инструкции

Рис. 12.6. Сообщение об ошибке компиляции в диалоговом окне Microsoft Visual Basic

Другие ошибки компиляции обнаруживаются перед выполнением программы. Отметим, что VBA каждый раз автоматически компилирует программу при ее запуске на выполнение. В VBA предусмотрена также возможность компилировать программу без запуска на выполнение посредством команды Отладка, Компилировать (Debug, Compile). В этом случае предполагаемое местоположение ошибки выделяется синим цветом и на экране отображается диалоговое окно Microsoft Visual Basic с сообщением о возможной причине, вызвавшей ошибку (рис. 12.6).

Ошибки выполнения

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

  1. Некорректная информация при считывании файла с диска.
  2. Некорректные данные, введенные пользователем, например требуется число, а пользователь вводит строковую информацию.
  3. Некорректность вычислений, например деление на ноль.

В этих и подобных случаях на экране отображается диалоговое окно Microsoft Visual Basic с сообщением о номере ошибки и возможной причине, ее вызвавшей (рис. 12.7).

Рис. 12.7. Сообщение об ошибке выполнения в диалоговом окне Microsoft Visual Basic

Если в диалоговом окне Microsoft Visual Basic нажать кнопку Отладка (Debug), то в строке модуля желтым цветом будет выделена строка, вызвавшая ошибку и по причине которой выполнение программы было прервано. Кроме того, эта строка будет помечена стрелочкой. При прерывании выполнения программы VBA переходит в режим прерывания. Одной из наиболее удобных возможностей режима прерывания являются возможность узнать текущее значение переменных и свойств. Для этого достаточно расположить указатель мыши на имени свойства или переменной. Это вызовет появление всплывающей подсказки с текущим значением переменной или свойства. Из текста кода, изображенного на рисунке, видно, что значение переменной у равно 0, что и вызвало ошибку прерывания. Для задания режима вывода всплывающей подсказки с текущими значениями данных должен быть установлен флажок Подсказки значений данных (Auto Data Tips) диалогового окна Параметры (Options), вызываемого с помощью команды Сервис, Параметры (Tools, Options).

Логические ошибки

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

Рис. 12.8. Редактор кода в режиме прерывания

Инструкция Option Explicit

Простейшим средством предотвращения случайных ошибок является использование инструкции Option Explicit. Эта инструкция предписывает явно описывать все переменные, встречающиеся в программе. Использование инструкции option Explicit позволяет избежать следующей трудно отслеживаемой ошибки. Предположим, что в программе используется переменная с именем ссуда, а при наборе имени этой переменной где-то в программе вместо русской буквы с по ошибке набрана латинская буква с. Визуально, эти имена ничем не отличаются друг от друга, но воспринимаются программой как имена разных переменных. Если бы использовалась инструкция option Explicit, а значит имело место явное описание переменной Ссуда, то компилятор указал бы на переменную ссуда с латинской буквой с, как на неописанную, и эта, трудно отслеживаемая ошибка, была бы быстро найдена.

Пошаговое выполнение программ

Редактор VBA позволяет выполнять пошаговую отладку программы. Ее можно выполнить либо при помощи панели инструментов Отладка (Debug), либо меню Отладка (Debug), которое включает команды и соответствующие комбинации клавиш (рис. 12.9). Если панель инструментов Отладка (Debug) не отображена на экране, то ее можно отобразить, выполнив команду Вид, Панели инструментов, Отладка (View, Toolbars, Debug).

Рис. 12.9. Панель инструментов Отладка и раскрывающееся меню Отладка

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

  1. Команда Отладка, Шаг с заходом (Debug, Step Into), либо кнопка Шаг с заходом (Step Into) панели инструментов Отладка (Debug) осуществляет последовательную шаг за шагом отладку всей программы, включая процедуры, вызываемые в программе.
  2. Команда Отладка, Шаг с обходом (Debug, Step Over), либо кнопка Шаг с обходом (Step Over) панели инструментов Отладка (Debug) осуществляет последовательную шаг за шагом отладку всей программы, исключая процедуры, т. е. если встречается процедура, то она выполняется целиком, а не пошагово, как это делается в команде Отладка, Шаг с заходом (Debug, Step Into).
  3. Команда Отладка, Шаг с выходом (Debug, Step Out), либо кнопка Шаг с выходом (Step Out) панели инструментов Отладка (Debug) завершает выполнение текущей процедуры и останавливает процесс пошаговой отладки на следующей после вызвавшей ее инструкции программы.
  4. Команда Отладка, Выполнить до текущей позиции (Debug, Run to Cursor) выполняет программу до инструкции, на которой установлен курсор.

Точка останова

Точка останова устанавливается или снимается с помощью команды Отладка, Точка останова (Debug, Toggle Breakpoint), либо посредством кнопки Точка останова (Toggle Breakpoint) панели инструментов Отладка (Debug). На листе модуля точки останова выделяются полосой кирпичного цвета и кругом того же цвета (рис. 12.10).

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

Одновременно снять все точки останова можно, выполнив команду Отладка, Снять все точки останова (Debug, Clear All Breakpoint).

Вывод значений свойств и переменных

Одним из наиболее удобных средств режима отладки является возможность узнать текущее значение переменных и свойств. Для этого достаточно расположить указатель мыши на имени свойства или переменной. Это вызовет появление всплывающей подсказки с текущим значением переменной или свойства. Для установки режима вывода всплывающей подсказки с текущими значениями данных должен быть установлен флажок Подсказки значений данных (Auto Data Tips) диалогового окна Параметры (Options), вызываемого командой Сервис, Параметры (Tools, Options).

Рис. 12.10. Точки останова

Другим способом отслеживания текущих значений данных является использование диалогового окна Контрольные значения (Quick Watch), отображаемого на экране с помощью команды Вид, Окно контрольного значения (View, Quick Watch), либо команды Отладка, Контрольное значение (Debug, Quick Watch) (рис. 12.11). Диалоговое окно Контрольные значения (Quick Watch) применяется для одновременного отображения текущих значений нескольких данных. Команда Отладка, Добавить контрольное значение (Debug, Add Watch) позволяет добавить новые контрольные значения в диалоговом окне Контрольные значения (Quick Watch).

Удаление контрольного значения из диалогового окна производится посредством его выделения и нажатия клавиши <Delete>.

Существует также программный способ вывода значений свойств и переменных в диалоговом окне Контрольные значения (Quick Watch) при помощи метода Print объекта Debug. Ниже приведен пример программного способа вывода значения переменной:

ПроверяемаяПеременная = "Вывод текста в окно отладки." Debug.Print ПроверяемаяПеременная

Окно Локальные переменные (Locals Window), отображаемое на экране командой Вид, Окно локальных переменных (View, Locals Window), выводит значения всех переменных текущей процедуры, а не только специально выбранных, как это происходит в окне Контрольные значения (Quick Watch).

Внешний же вид и структура обоих окон, Локальные переменные (Locals Window) и Контрольные значения (Quick Watch), одни и те же.

Рис. 12.11. Диалоговое окно Контрольные значения

Окно Проверка (Immediate Window), отображаемое на экране командой Вид, Окно отладки (View, Immediate Window), предоставляет пользователю возможность:

  • Набирать и вычислять отдельные инструкции VBA. Для этого достаточно в окне Проверка (Immediate Window) ввести соответствующую инструкцию и нажать клавишу <Enter>. Единственным ограничением на использование, инструкции является то, что она должна быть набрана в одну строку. Например,

    s=0: For i=1 to 5: s=s+i^2: Next i: MsgBox s

  • Определять текущие значения переменных и свойств. Для этого в окне Проверка (Immediate Window) надо набрать вопросительный знак, имя переменной или свойства и нажать клавишу <Enter>. Например,

    ?х

  • Устанавливать новые текущие значения переменных. Для этого в окне Проверка (Immediate Window) надо набрать имя переменной, знак равенства и новое значение переменной:

    х = 15


  • ГЛАВА 13. РАБОТА С ФАЙЛАМИ
    • Типы ФАЙЛОВ в VBA
    • ОТКРЫТИЕ И ЗАКРЫТИЕ ФАЙЛА
    • ВВОД ДАННЫХ В ФАЙЛ ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА
    • ВЫВОД ДАННЫХ ИЗ ФАЙЛА ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА
    • РАБОТА с ФАЙЛОМ ПРОИЗВОЛЬНОГО ДОСТУПА
    • НАИБОЛЕЕ УПОТРЕБЛЯЕМЫЕ ИНСТРУКЦИИ и ФУНКЦИИ ПРИ РАБОТЕ С ФАЙЛАМИ
    • ОБЪЕКТ FILESEARCH

Глава 13.

Работа с файлами

Типы файлов в VBA

В VBA допустима работа с тремя типами текстовых файлов. .

Файл последовательного доступа | Рассматривается как последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно
Файл произвольного доступа | Состоит из записей фиксированной длины и размер записи указывается при его открытии. Это позволяет локализовать любую запись в файле по ее номеру
Бинарный файл | Является частным случаем файла произвольного доступа. Размер записи в бинарном файле считается равным 1 байту

Открытие и закрытие файла

Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.

Open

Разрешает выполнение операций ввода/вывода при работе с файлом.

Синтаксис:

Open Путь For Режим [Access Доступ] [Блокировка] As [ # ] НомерФайла [Lеn=Длина]

  • Путь — строковое выражение, указывающее имя файла
  • Режим — устанавливает режим работы с файлом. Допустимые Значения: Append, Binary, Input, Output или Random
  • Доступ — устанавливает операции, разрешенные с открытым файлом. Допустимые значения: Read, Write или Read Write
  • Блокировка — устанавливает операции, разрешенные с открытым файлом другим процессам. Допустимые значения:
  • Shared, Lock Read, Lock Write и Lock Read Write и номерФайла — допустимый номер файла. Число в интервале от 1 до 255. Обратите внимание на то, что параметру Номер-Файла предшествует символ #. Значение номерФайла нельзя изменять, пока файл открыт. Но при следующем открытии файла номерФайла может быть другим числом
    длина — число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов Про инструкцию open важно также знать, что во время ее работы VBA также резервирует файловый буфер в памяти компьютера для ускорения процесса записи и считывания (прямое записывание информации на диск может существенно замедлить выполнение программы, что особенно заметно при работе с большими файлами). Максимальное число файловых буферов устанавливается в системном файле Config.sys

Close

Завершает операции ввода/вывода с файлом, открытым с помощью инструкции open. Эта инструкция 'очищает буфер и указывает операционной системе обновить FAT (таблицу размещения файлов). Важно, чтобы каждый файл по завершении работы с ним был закрыт, иначе это может привести к частичной потере информации.

Синтаксис:

Close [СписокНомеровФайлов] Аргумент СписокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где номерФайла представляет любой допустимый номер файла: [[#] номерФайла] [, [#] номерФайла] ...

Reset

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

На диск, открытых с помощью инструкции Open

FreeFile

Функция возвращает доступный номер, который может использоваться в инструкции Open

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

Open "Первый" For Binary Access Write As #1 Close #1

Ввод данных в файл последовательного доступа

Обсудим инструкции, используемые при вводе информации в файл последовательного доступа.

Print

Записывает форматированные данные в файл последовательного доступа. Синтаксис:

Print #НомерФайла, [СписокВывода]

  • номерФайла — номер файла О слисокВывода — выражение (или список выражений), записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является ";" (данные выводятся подряд) или "," (данные выводятся по зонам). Кроме того, в аргументе СписокВывода допускается использование функций Spc и таь:
    • spc(n) — используется для вставки п пробелов в файл
    • Tab(n) — устанавливает курсор в столбец с номером n

Write

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

Синтаксис:

Write #НомерФайла, [СписокВывода]

  • НомерФайла — номер файла
  • СписокВывода — выражение или список выражений, записываемых в файл Данные, записанные с помощью инструкции write, обычно считываются из файла с помощью инструкции input

Приведем две процедуры, использующие инструкции Print и write для создания файлов последовательного доступа. Сначала рассмотрим процедуру с инструкцией

Print. Sub

ПримерИспольэования Print

Open "С:\Новый" For Output As II

' Печатает текст в файл '

Print #1, "Тест"

'

' Печатает пустую строку в файл

'

Print #l,

'

' Печатает в двух зонах печати

'

Print #1, "Зона 1";

Tab;

"Зона 2" ;

Spc(3) ;

"3 пробела"

Close #1

End Sub

Результатом описанных выше инструкций будет файл со следующим содержимым:

Тест

Зона 1 Зона 2 3 пробела

Перейдем теперь к примеру процедуры, создающей файл последовательного

Достпа при помощи инструкции Write.

Sub ПримерИспользованияwriteе

Open "ЕщеПример"

For Output As #1

Write #1, "Пример";

"использования"

Write #l, "инструкции";

Write #1, "Write"

x = 1

Write #1, "Число";

х Close #1

End Sub

Результатом описанных выше инструкций будет файл со следующим содержимым:

"Пример","использования" "инструкции","Write" "Число",1

Обратите внимание на автоматическое размещение в файле разделителей -запятых, и то, что строковая информация берется в кавычки. В процедуре

ПримерислользованияWrite вторая инструкция write специально заканчивается знаком ";" Это обеспечивает вывод данных третьей инструкцией write в ту же строку файла, в которую выводила вторая инструкция.

Вывод данных из файла последовательного доступа

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

Input #

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

Синтаксис:

Input #НомерФайла, СписокПеременных

  • номерФайла — номер файла
  • СписокПеременных — список переменных, которым следует присвоить значения, считанные из файла. Переменные в списке разделяются запятыми

Line Input #

Считывает строку из открытого файла последовательного доступа и присваивает ее переменной типа string. Данные, считываемые с помощью инструкции Line input I, как правило, записываются в файл с помощью инструкции Print #.

Синтаксис:

Line Input #НомерФайла, ИмяПеременной

Синтаксис инструкции Line Input1 содержит следующие элементы:

  • НомерФайла — номер файла
  • ИмяПеременной — имя переменной типа Variant или String

Функция

Input

Возвращает значение типа string, содержащее символы из файла, открытого в режиме input или Binary. Функция input считывает данные, записываемые в файл с помощью инструкции Print # или Put.

Синтаксис:

Input (Число, [#] НомерФайла)

  • Число задает число возвращаемых символов. Если аргумент Число равен 1, то производится посимвольное считывание данных.

ФУНКЦИЯ EOF

Функция возвращает значение True при достижении конца файла.

Синтаксис:

EOF (НомерФайла} При последовательном считывании информации из файла часто используется следующий цикл:

Do While Not EOF(l) Loop

или, для тех пользователей, кто предпочитает инструкцию While - Wend инструкции Do While - Loop, следующий эквивалентный цикл:

While Not EOF (I) Wend

Приведем пример использования инструкции input # для считывания данных из файла. В этом примере предполагается, что на диске существует файл группаЭкономистов, содержащий информацию о студентах. Файл был создан при помощи инструкции write # и состоит из двух столбцов, в первом из которых указывается фамилия, а во втором — оценка студента. Для удобства работы с информацией введен пользовательский тип Студенты. Процедура примериспользованияInput последовательно считывает фамилии и оценки из файла и выводит их в ячейки первого и второго столбца рабочего листа.

Туре Студенты

' Фамилия As String * 20

Оценка As String * 3

End Type

Sub ПримерИспользованияInput()

Dim Студент As Студенты

Open "ГруппаЭкономистов"

For Input As 12 i = 1

Do While Not EOF(2) With Студент

Input #2, .Фамилия, .Оценка

Cells(i, 1).Value = .Фамилия

Cells(i, 2).Value = .Оценка

End With

i = i + 1 Loop

Close #2

End Sub

Приведем пример использования инструкции Line input # для считывания данных из файла группаЭкономистов, имеющего ту же структуру, что и в предыдущем примере, но созданного с помощью инструкции Print #. Инструкция Line input # считывает всю строку из файла в строковую переменную. Поэтому в этом случае уже нет необходимости использовать введенный пользовательский тип, а достаточно ограничиться только обычной строковой переменной. Вся считываемая информация строка за строкой вводится в список диалогового .окна.

Private Sub UserForm_Initialize()

Dim Студент As String

Open "ГруппаЭкономистов"

For Input As #1

i = 1

With ListBoxl

.Clear Do While Not EOF(l)

Line Input 11, Студент

.Addltem Студент

i = i + 1 Loop

Close #l

End With

End Sub

Работа с файлом произвольного доступа

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

Put

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

Синтаксис:

Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной

  • НомерФайла — номер файла
  • НомерЗаписи — номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись. Если аргумент НомерЗаписи опущен, то записывается на то место, где был установлен указатель после выполнения последней инструкции Get или Put, либо куда он переведен с помощью функции Seek
  • ИмяПеременной — имя переменной, содержащей данные, которые следует записать в файл

Get

Читает данные из открытого файла произвольного доступа в переменную. Синтаксис:

Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной

  • НомерФайла — номер файла
  • НомерЗаписи — номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение
  • Имяпеременной — имя переменной, в которую следует поместить считанные данные

Seek

Функция возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open.

Синтаксис:

Seek (НомерФайла)

LOF

Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Оpen . Для определения размера закрытого файла следует использовать функции FileLen.

Синтаксис:

LOF (НомерФайла)

FileLen

Возвращает значение типа Long, содержащее размер файла в байтах.

Синтаксис:

FileLen (Путь )

Как видно из приведенного в предыдущем разделе примера для считывания информации при помощи инструкции input # из файла группаЭкономистов, файл последовательного доступа иногда удобно задавать как последовательность записей (в данном случае, записей о студентах), причем каждая из записей формируется из группы полей (в данном случае из полей Фамилия и оценка). Отметим, что такая группировка по записям не является чем-то присущим файлам последовательного доступа. Это просто подход, позволяющий упростить процесс последовательного считывания записей. В файле последовательного доступа существует только одна внутренняя структура, образованная разделителями (запятыми или специальными символами, обозначающими переход на новую строку).

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

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

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

Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды Put и Get.

Приведем один, пример работы с файлом произвольного доступа группа Экономистов, который имеет ту же структуру, что и в предыдущем примере. Файл создается с помощью процедуры записьвоайл, которая последовательно считывает данные из первого и второго столбца рабочего листа и затем вводит их в файл. В этой процедуре число вводимых записей фиксировано и равно 5. Процедура Считываниеизфайла производит обратное действие — считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа. Интересной особенностью файла произвольного доступа является то, что при работе с ним можно определить число записей не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при помощи которой файл был создан, размер открытого файла возвращается функцией LOF, а еще не открытого — функцией FileLen. В рассматриваемом случае число записей в файле равно LOF(l) / Len(Студент).

Туре Студенты

Фамилия As String * 20 Оценка As String * 3

End Type

'

Sub ЗаписьВФайл()

Dim Студент As Студенты

Dim i As Integer

Open "ГруппаЭкономистов"

For Random As #1 Len = Len(Студент)

For i = 1 To 5

With Студент

.Фамилия = Cells(i, 1).Value .Оценка = Cells(i, 2).Value

End With

Put #1, i, Студент

Next i

Close #1

End Sub '

Sub СчитываниеИзФайла()

Dim Студент As Студенты

Dim i As Integer

Dim n As Integer

Open "ГруппаЭкономистов"

For Random As #1 Len = Len(Студент)

n = LOF(l) / Len(Студент)

For i = 1 To n

Get #1, i, Студент

With Студент

Cells (i, 3) .Value = .Фамилия Cells(i, 4).Value = .Оценка

End With

Next i

Close #1

End Sub

Наиболее употребляемые инструкции и функции при работе с файлами

Приведем наиболее часто употребляемые инструкции и функции для работы с файлами.

ChDir | Изменяет текущую папку. Синтаксис: ChDir путь
ChDrive | Изменяет текущий диск. Синтаксис: ChDrive диск Например, ChDrive "D"
CurDir | Функция возвращает текущую папку

FileAttr

Возвращает значение типа Long, представляющее режим файла, открытого с помощью инструкции open. Возвращаемые значения: 1 (для режима input), 2 (output), 4 (Random), 8 (Append) и 32 (Binary).

Синтаксис:

FileAttr (НомерФайла, Тип)

  • НомерФайла — допустимый номер файла
  • Тип — число, указывающее характер возвращаемых данных. Если тип установлен равным 1 , то функция FileAttr возвращает значение, указывающее режим работы файла

GetAttr

Возвращает значение типа integer, определяющее атрибуты файла, каталога или папки. Значение, возвращаемое функцией GetAttr, является суммой констант, приведенных в табл. 13.1.

Синтаксис:

GetAttr (путь)

SetAttr

Устанавливает атрибуты файла.

Синтаксис:

SetAttr pathname, attributes

Атрибуты в аргументе attributes определяются как сумма констант из табл. 13.1

FileCopy

Копирует файл.

Синтаксис:

FileCopy source, destination

Аргументы:

  • source — строковое выражение, указывающее имя копируемого файла
  • destination — строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска

FileDateTime

Функция возвращает дату и время последнего изменения файла.

Синтаксис:

FileDateTime (путь )

Kill

Удаляет существующий файл.

Синтаксис:

Kill путь

В аргументе путь допустимо использование символой (*) и (?) для удаления нескольких файлов по маске.

MkDir

Создает новую папку.

Синтаксис:

MkDir путь

RmDir

Удаляет существующую папку.

Синтаксис:

RmDir путь

Табл. 13.1. Константы атрибутов файла

Константа | Значение | Описание
vbNormal | 0 | Обычный
vbReadOnly | i | Только чтение
vbHidden | 2 | Скрытый
vbSystem | 4 | Системный
vbDi rector у | 16 | Каталог или папка
vbArchive | 32 | Файл был изменен после последнего резервирования

Объект FileSearch

Объект FileSearch обладает функциональными возможностями диалогового окна Открытие документа (Open), отображаемого на экране_посредством выбора команды Файл, Открыть (File, Open). Объект FileSearch входит в объект Application и иерархически включает в себя (рис. 13.1):

  • Семейство FoundFiles, которое является списком всех файлов, возвращаемых в результате поиска
  • Семейство PropertyTests, которое является списком всех критериев поиска

Рис. 13.1. Иерархическая структура объекта FileSearch

Объект FileSearch возвращается свойством FileSearch объекта Application.

Объект FileSearch имеет следующие два метода.

Execute

Поиск специфицированных файлов.

Синтаксис:

Execute (SortBy, SortOrder, AlwaysAccurate)

Аргументы:

  • SortBy — устанавливает способ сортировки файлов. Допустимые значения: msoSortbyFileName, msoSortbyFileType, msoSortbyLastModif led и msoSortbySize
  • SortOrder — устанавливает порядок сортировки файлов.
    Допустимые значения: msoSortOrderAscending и msoSort Order Descending
  • AiwaysAccurate — допустимые значения: True (поиск среди измененных файлов) и False (в противном случае)

NewSearch

Устанавливает критерии, используемые при поиске по умолчанию

Приведем наиболее часто применяемые свойства объекта FileSearch.

FileName | Устанавливает имя файла для поиска. Допустимо использование символов (*) и (?)
FileType | Задает тип файла для поиска. Допустимые значения: msoFileTypeAHFiles, msoFileTypeBinders, msoFile-TypeDatabases, msoFileTypeExcelWorkbooks, msoFi-leTypeOff ice Files, ms о FileType Power Point Presentations, msoFileTypeTemplates И msoFileTypeWordDocuments
Lookln | Задает папку для поиска файла
SearchSubFolders | Допустимые значения: True (поиск также проводить в поддиректориях) и False (в противном случае)

Следующий пример позволяет в поле со списком диалогового окна вывести список всех файлов текущей папки:

Private Sub UserForm_Initialize()

ComboBoxl.Clear With Application.FileSearch

.FileName = "*.xls" .SearchSubFolders = False

If .Execute(SortBy:=msoSortByFileName,

sortorder:=msoSortOrderAscending) > 0 Then

For i = 1 To .FoundFiles.Count

ComboBoxl.Addltem .FoundFiles(i)

Next i

End If

End With

End Sub

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

Private Sub UserForm_Initialize()

Dim ИмяПапки As String

Dim ИмяФайла As String

Dim ДлинаПути As Integer

ComboBoxl.Clear ИмяПапки = CurDir ДлинаПути = Len(ИмяПапки)

With Application.FileSearch .FileName = "*.xls"

.SearchSubFolders = False

If .Execute (SortBy:=msoSortByFileName,

sortorder:=msoSortOrderAscending) > 0 Then

For i = 1 To .FoundFiles.Count

ИмяФайла = Right(.FoundFiles(i), Len(.FqundFiles(i))

- ДлинаПути - 1) ComboBoxl.Addltem ИмяФайла

Next i

End If

End With

End Sub


  • ГЛАВА 14. ПОЛЬЗОВАТЕЛЬСКИЕ ОБЪЕКТЫ
    • СОЗДАНИЕ МОДУЛЕЙ КЛАССА
    • ПРОЦЕДУРЫ PROPERTY LET, PROPERTY SET и PROPERTY GET
    • ПРИМЕР СОЗДАНИЯ КЛАССА

Глава 14.

Пользовательские объекты

Создание модулей класса

В VBA наряду с огромным числом встроенных объектов предусмотрена возможность создания пользовательских объектов. Использование таких объектов позволяет сократить текст программы и сделать его более понятным. Пользовательские объекты являются элементами пользовательских классов (или образно говоря, классы являются формами, из которых "пекутся" конкретные объекты). Пользовательские классы конструируются в модулях классов, которые создаются в редакторе Visual Basic выбором команды Вставка, Модуль класса (Insert, Class Module). При создании классов надо предусмотреть его инициализацию, описание свойств и методов, которыми будет наделен объект.

Опишем процесс создания класса в виде следующей последовательности шагов:

  1. Выберите команду Вставка, Модуль класса (Insert, Class Module). Откроется окно нового модуля класса.
  2. Нажмите клавишу <F4> и присвойте в появившемся окне свойству Name имя класса. Имя модуля класса является именем класса объектов.
  3. В разделе описания модуля объявите переменные уровня модуля, которые используются как "значения свойств".
  4. Инициализируйте класс при помощи процедуры Private Sub Class_Initialize. В этой процедуре надо указать значения, принимаемые по умолчанию переменными уровня модуля, описывающими "значения свойств".
  5. При помощи процедур Property Let объявите имена свойств, значениями которых являются числовые данные, а при помощи процедур Property set объявите имена свойств, значениями которых являются объекты. Если какое-то свойство — только для чтения, то для него не надо составить процедуру Property Let.
  6. При помощи процедур Property Get установите возможность считывания значения свойств.
  7. Создайте методы класса. Методы создаются при помощи обычных процедур и функций. Если метод возвращает число, то для его конструирования используется функция, а в остальных случаях — процедура.
  8. Допустимо также создание процедуры Private Sub Class_Terminate для удаления объекта из памяти по завершению работы с ним.

Процедуры Property Let, Property Set и Property Get

Процедура Property Let служит для объявления имен свойств, значениями которых являются числовые данные.

Процедура Property set служит для объявления имен свойств, значениями которых являются объекты.

Процедура Property Get обеспечивает возможность считывания значения свойств.

Как видно из приведенного ниже синтаксиса, процедуры Property Let, Property Set и Property Get имеют такую же структуру, что и обычные процедуры. Просто, они предназначены для специфических задач, описанных выше.

[Public | Private] [Static] Property Let имя [(списокАргументов)]

[инструкции]

[Exit Property]

[инструкции] End Property

Public | Private] [Static] Property Set имя.[(списокАргументов)]

[инструкции]

[Exit Property]

[инструкции] End Property

[Public | Private] [Static] Property Get имя [(списокАргументов)] [As тип]

[инструкции] [имя = выражение] [Exit Property]

[инструкции] [имя = выражение] End Property

Пример создания класса

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

Итак, в модуле класса, у которого установлено свойство Name, равное Вектор, наберите следующий код:

'

' X - координата абсциссы

' У - координата ординаты

'

Dim X, Y As Double

'

Public Property Get Абсцисса() As Double

'

' Возвращает значение свойства Абсцисса

'

Абсцисса = X End Property

Public Property Get Ордината () As Double

'

' Возвращает значение свойства Ордината

'

Ордината = Y

End Property

'

Public Property Let Абцисса(ByVal НоваяАбсцисса As Double)

'

' Устанавливает значение свойства Абсцисса

'

If Not IsNumeric(НоваяАбсцисса) Then

MsgBox "Абсцисса не является числом", vblnformation, "VBA"

Exit Property

End If

X = НоваяАбсцисса

'

End Property

'

Public Property Let Ордината(ByVal НоваяОрдината As Double)

'

' Устанавливает значение свойства Ордината

If Not IsNumeric(НоваяОрдината) Then

MsgBox "Ордината не является числом", vblnformation, "VBA"

Exit Property

End If

Y = НоваяОрдината End Property

'

Public Property Get Длина() As Double

'

' Возвращает длину вектора. Это свойство только для чтения

'

Длина = Sqr(X ^ 2 + Y ^ 2)

End Property

'

Public Sub ПрибавитьВектор(ByVal ДругойВектор As Вектор)

'

' Покоординатное сложение двух векторов

X = X + ДругойВектор.Абсцисса Y = Y + ДругойВектор.Ордината

End Sub

'

Public Sub УмножитьНаЧисло(ByVal Число As Double)

'

' Покоординатное умножение вектора на число

'

If Not IsNumeric(Число) Then

MsgBox "Число, на которое умножается вектор," & Chr(13) & "на самом деле не число", vblnformation, "VBA"

Exit Sub

End If

'

X = Число * X Y = Число * У

'

End Sub

Public Function СкалярноеПроизведение(ByVal ДругойВектор As Вектор)

'

' Скалярное произведение векторов

СкалярноеПроизведение = X * ДругойВектор.Абсцисса

+ Y * ДругойВектор.Ордината

End Function

Private Sub Class_Initialize()

'

' Инициализация класса

' Вектор (1, 0)

'

X = 1 Y = 0

End Sub

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

Sub ДемонстрацияОбъектов()

Dim a, s As Double

' Объявление двух векторов

'

Dim МойВектор, ЕщеВектор As Вектор

' Создание вектора

'

Set МойВектор = New Вектор

' Установка координат вектора

'

With МойВектор

.Абсцисса = 1 .Ордината = 1

End With

'

' Определение длины вектора

'

а = МойВектор.Длина

MsgBox CStr(a)

'

' Умножение вектора на 2

МойВектор.УмножитьНаЧисло Число:=2

'

' Определение координат преобразованного вектора

'

MsgBox CStr(МойВектор.Абсцисса)

MsgBox CStr(МойВектор.Ордината)

'

' Создание еще одного вектора

'

Set ЕщеВектор = New Вектор

With ЕщеВектор

.Абсцисса = 2

.Ордината = 3 End With

'

' Сложение векторов

'

МойВектор.ПрибавитьВектор ДругойВектор:=ЕщеВектор

'

' Определение координат преобразованного вектора

'

MsgBox CStr(МойВектор.Абсцисса)

MsgBox CStr(МойВектор.Ордината)

'

' Определение скалярного произведения

'

s = МойВектор.СкалярноеПроизведение(ДругойВектор:=ЕщеВектор)

MsgBox CStr(s)

End Sub


  • ГЛАВА 15. РАБОТА С ВНЕШНИМИ БАЗАМИ ДАННЫХ
    • СОЗДАНИЕ ЗАПРОСОВ С ПОМОЩЬЮ MICROSOFT QUERY
    • ЧТО ТАКОЕ ODBC?
    • MICROSOFT JET
    • DАО — ОБЪЕКТНЫЙ ДОСТУП К ДАННЫМ
    • ПОРЯДОК РАБОТЫ ПРИ ОБЪЕКТНОМ ДОСТУПЕ К ДАННЫМ
      • Создание рабочей области
      • Открытие базы (источника) данных
      • Объект Recordset
    • ПРИМЕР ПРИЛОЖЕНИЯ

Глава 15.

Работа с внешними базами данных

Создание запросов с помощью Microsoft Query

В Microsoft Office входит отдельная программа, которая называется Microsoft Query, предоставляющая доступ к базам данных, созданных с помощью таких программных средств, как dBASE, Access, Paradox, Microsoft SQL Server и т. п. Эта программа позволяет отбирать информацию из базы данных, сортировать, редактировать и копировать ее на рабочий лист. Используя Microsoft Query, можно получить данные на основе заданных пользователем критериев. Excel связывается с Microsoft Query посредством механизма DDE (Dynamic Data Exchange — динамический обмен данными). Microsoft Query работает с внешними источниками данных через драйверы ODBC (Open Database Connectivity), которые являются разработанным Microsoft стандартом для работы с базами данных. Для получения данных по запросу посредством драйвера ODBC используется язык запросов SQL (Structured Query Language).

Рассмотрим последовательность создания запроса при помощи Microsoft Query на основе простой базы данных о студентах, созданной в Access (рис. 15.1).

Выполните команду Данные, Внешние данные, Создать запрос (Data, Get External Data, New Database Query). Появится диалоговое окно Выбор источника данных (Choose Data Source) (рис. 15.2). В этом окне выберите источник данных, например базу данных, составленную в Access 97. Нажмите кнопку Параметры (Options), при помощи появившегося окна Источник данных (Data Source) можно установить папки, в которых следует искать источник данных. Итак, выберите базу данных, составленную в Access 97, в качестве источника и нажмите кнопку ОК.

В появившемся диалоговом окне Select Database (рис. 15.3) в списке Database Name выберите имя файла базы данных (в данном случае студенты.mdb) и нажмите кнопку ОК, что приведет к запуску мастера запросов.

Рис. 15.1. База данных о студентах

Рис. 15.2. Диалоговое окно Выбор источника данных

Рис. 15.3. Диалоговое окно Select Database

Откроется диалоговое окно Создание запроса: выбор столбцов (Query Wizard — Choose Columns) (рис. 15.4), которое позволяет добавлять столбцы или поля в список Столбцы запроса (Query Columns). При нажатии на кнопку >, расположенную в средней части диалогового окна Создание запроса: выбор столбцов (Query Wizard Choose Columns), выбранный столбец добавляется в запрос, кнопка < служит для удаления выбранного столбца из списка столбцов запроса, а кнопка « позволяет удалить все столбцы запроса. В рассматриваемом случае в список Столбцы запроса (Query Columns) добавим все поля базы данных, кроме поля номер. Нажмите кнопку Далее > (Next >), переходя к следующему шагу работы мастера запросов.

Рис. 15.4. Диалоговое окно Создание запроса: выбор столбцов

Откроется диалоговое окно Создание запроса: отбор данных (Query Wizard -Filter Data) (рис. 15.5), которое позволяет отфильтровать данные в выбранных полях. Для фильтрации данных в списке Столбцы для отбора, выделите столбец, по которому будет производиться фильтрация. В первом раскрывающемся списке выбирается операция отбора, а во втором, содержащем все имеющиеся в выбранном поле значения, выберите нужное или введите свое. При необходимости ввести дополнительную операцию отбора выберите переключатель и (AND) или или (OR), и воспользуйтесь следующими раскрывающимися списками для ввода критериев фильтрации и т. д. Завершив создание критериев фильтрации, нажмите кнопку Далее > (Next >), переходя к следующему шагу работы мастера запросов. В рассматриваемом случае проведем фильтрацию по полю группа, установив критерий равно значению Экономика, и полю предмет с критерием равно значению информатика, т. е. отобразим только информацию о результатах сдачи информатики студентов-экономистов. Отметим, что визуально выбранные поля отличаются от невыбранных тем, что они выделяются полужирным шрифтом.

Рис. 15.5. Диалоговое окно Создание запроса: отбор данных

Откроется диалоговое окно Создание запроса: порядок сортировки (Query Wizard - Sort Data) (рис. 15.6), которое позволяет отсортировать данные в выбранных полях в порядке возрастания или убывания. Отсортируем данные по фамилиям в порядке возрастания. Нажмите кнопку Далее > (Next >), переходя к следующему шагу работы мастера запросов.

Рис. 15.6. Диалоговое окно Создание запроса: порядок сортировки

Откроется диалоговое окно Создание запроса: заключительный шаг (рис. 15.7). При желании еще раз воспользоваться тем же запросом его можно сохранить, используя кнопку Сохранить запрос (Save Query). Для завершения создания запроса выберите флажок Вернуть данные в Microsoft Excel (Return Data to Microsoft Excel) и нажмите кнопку Готово (Finish).

Рис. 15.7. Диалоговое окно Создание запроса: заключительный шаг

На экране отобразится диалоговое окно Возврат данных в Microsoft Excel (Returning External Data to Microsoft Excel) (рис. 15.8). выберите переключатель Имеющийся лист и укажите адрес верхней левой ячейки, куда надо поместить данные, нажмите кнопку ОК. Полученный результат запроса данного примера показан на рис. 15.9.

Рис. 15.8. Диалоговое окно Возврат данных в Microsoft Excel

Рис. 15.9. Результат запроса

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

Sub Макрос1()

'

' Макрос1 Макрос

' Макрос записан 03.06.99 (Андрей)

'

'

With ActiveSheet.QueryTables

.Add(Connection:=Array(Array(

"ODBC;DSN=MS Access 97

Database;DBQ=C:\МУ_DОС\студенты.mdb;

DefaultDir=C:\MY__DOC;Driverld=25;

FIL=MS Aceess;MaxBufferSize=512;PageT-imeo")

, Array("ut=5;")),

Destination:=Range("Al"))

.Sql = Array( "SELECT ПервыйКурс.Фамилия,

ПервыйКурс.Группа, ПервыйКурс.Предмет,

ПервыйКурс.Оценка" & Ghr(13) & "" & Chr(10) & "FROM

`C:\МY_ООС\СТУДЕНТЫ` .ПервыйКурс

ПервыйКурс" & Chr(13) & "" & Ghr,(10) & "WHERE (ПервыйКурс.Группа='Экономика')

AND (ПервыйКурс.Предмет='Инф" ,"орматика')"

& Chr(13) & "" & Chr(10) &

"ORDER BY ПервыйКурс.Фамилия")

.FieldNames = True

.RefreshStyle = xlInsertDeleteCells

.RowNumbers = False

.FillAdjacentFormulas = False

.RefreshOnFileOpen = False

.HasAutoFormat = True

.BackgroundQuery = True

.TablesOnlyFromHTML = True

.Refresh BackgroundQuery:=False

.SavePassword = True

.SaveData = True

End With

End Sub

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

Центральную роль в данном макросе играют: инструкция SELECT, указывающая выбираемые поля, инструкция WHERE, задающая критерий отбора записей и инструкция ORDER BY, устанавливающая порядок вывода записей.

В макросе используется семейство QueryTables. Семейство QueryTables является семейством всех объектов QueryTable, представляющих собой внедренные на рабочий лист результаты запроса по внешней базе данных посредством Microsoft Query. Основными методами семейства QueryTables являются Add и item. Несмотря на громоздкость макроса макрос1, метод Add имеет простую синтаксическую структуру:

Add(Connection, Destination, Sql)

Аргументы:

Connection | ODBC-строковое выражение, указывающее базу данных, к которой производится запрос
Destination | Устанавливает верхнюю левую ячейку диапазона рабочего листа, в который выводится результат запроса
Sql | ODBC-строковое выражение, указывающее критерии, по которым создается запрос

Что такое ODBC?

Для унификации способа работа с базами данных, созданными разными средствами (например, Access, FoxPro, SQL Server и т. д.), Microsoft разработал интерфейс доступа к данным, называемый протоколом ODBC (Open Database Connectivity - открытая связь с базой данных). Ввод, получение и работа с данными происходит при помощи структурированного языка запросов (SQL, Structured Query Language). Протокол ODBC обеспечивает стандарт передачи данных из одного приложения в другое.

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

Microsoft Jet

Microsoft Jet — это ядро базы данных, которое обеспечивает возможность доступа к данным из любого приложения, поддерживающего OLE Automation, в частности VBA и Excel, независимо от интерфейса конкретной системы управления базами данных. Ядро Jet хранит свою информацию по умолчанию в файлах с базами данных, имеющих расширение mdb. Такие файлы содержат таблицы, модули, формы, отчеты, запросы и индексы. Конечно, формат mdb — это не единственный формат баз данных, с которыми работает Microsoft Jet. Он поддерживает форматы баз данных, созданных с помощью FoxPro, dBASE и т. д.

DАО — объектный доступ к данным

Объектный доступ к данным (DAO, Data Access Objects) создавался как объектно-ориентированный интерфейс ядра базы данных Jet, т. е. для обеспечения взаимодействия между приложением, например VBA, и ядром базы данных Jet. В Office 97 включена новая версия DАО - DАО 3.5, которая позволяет манипулировать данными в обход ядра Jet. В DАО 3.5 можно напрямую связываться с источниками данных через ODBCDirect, что делает приложения более быстродействующими.

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

Всего имеется 17 типов объектов доступа к данным. На рис. 15.10 представлены объекты доступа к данным первых четырех иерархических уровней. В верхней части иерархии объектов доступа находится объект DBEngine, непосредственно процессор ядра базы данных Jet. Объект Error, являющийся элементом семейства Errors, хранит информацию об ошибках, возникающих при объектном доступе к данным. Объект DBEngine также содержит в себе семейство workspaces объектов workspace, которые устанавливают именованные сеансы работы пользователя. Каждый объект workspace включает семейство Databases, которое состоит из одного или более объектов Database, являющихся открытыми базами данных. Объект TabieDef, элемент семейства TabieDefs, представляет сохраненное определение основной или присоединенной таблицы. Объект QueryDef, элемент семейства QueryDefs, представляет сохраненное определение запроса в базе данных Microsoft Jet или временное определение запроса в рабочей области ODBCDirect. Объект Recordset, элемент семейства Recordsets, представляет набор записей в основной таблице или набор записей, который получается в результате выполнения запроса. В объектах Container группируются однотипные объекты, а объект Relation представляет связь между полями таблиц или запросами.

Рис. 15.10. Иерархия объектов DАО

Для возможности использования объектов доступа необходимо задать ссылку на библиотеку DАО 3.5. Для этого в редакторе VBA необходимо выбрать команду Сервис, Ссылки (Tools, References) и в появившемся диалоговом окне Ссылки (References) установить флажок напротив элемента Microsoft DAO 3.5 Object Library

Порядок работы при объектном доступе к данным

При извлечении информации с помощью объектного доступа к данным надо:

  • Создать рабочую область (объект Workspace)
  • Открыть базу (источника) данных (объект Database)
  • Создать набор записей (объект Recordset)
  • Выполнить непосредственную работу с конкретными записями и полями

Создание рабочей области

Рабочую область можно создать методом CreateWorkspace объекта DBEngine.

Синтаксис:

Set РабочаяОбласть = CreateWorkspace(Name, UserName, Password, UseType)

Аргументы:

РабочаяОбласть | Объектная переменная, представляющая создаваемый объект Workspace
Name | Выражение или переменная типа string, содержащая уникальное имя нового объекта workspace
UserName | Выражение или переменная типа string, определяющая владельца нового объекта workspace
Password | Выражение или переменная типа string, содержащая пароль для доступа к новому объекту workspace
UseType | Допустимые значения: dbUseJet (создание рабочей области ядра Microsoft Jet) и dbUseODBC (создание рабочей области ODBCDirect)

Например, для создания рабочей области Microsoft Jet можно использовать следующие две инструкции:

Dim РабочаяОбласть As CreateWorkspace

Set РабочаяОбласть = DBEngine.CreateWorkspace(Name:="МояОбласть", UserName:="admin", Password:="", UseType:=dbUseJet)

Рабочую область ODBCDirect можно создать следующим образом (ссылка на объект DBEngine применяется по умолчанию, поэтому во второй инструкции объект DBEngine опущен):

Dim РабочаяОбласть As CreateWorkspace

Set РабочаяОбласть = CreateWorkspace(Name:="МояОбласть", UserName:="UID'V Password:="", UseType:=dbUseODBC)

Открытие базы (источника) данных

Открыть базу данных можно методом OpenDatabase объекта Workspace.

Синтаксис:

Set БазаДанных = РабочаяОбласть.OpenDatabase (name, options, readonly, connect)

Аргументы:

БазаДанных | Объектная переменная, представляющая открываемый объект Database
РабочаяОбласть | Объектная переменная, представляющая существующий объект workspace, который будет содержать базу данных. Если аргумент РабочаяОбласть не задан, метод OpenDatabase использует стандартную рабочую область
Name | Выражение или переменная типа string, задающая имя существующего файла базы данных с ядром Microsoft Jet или имя источника данных ODBC

Options
  • Для рабочей области ядра Microsoft Jet допустимыми являются следующие значения аргумента: True (открытие базы данных для монопольного доступа) и False (по умолчанию, открытие базы данных для общего доступа)
  • Для рабочей области ODBCDirect допустимыми являются следующие значения аргумента:
    dbDriverNoPrompt,
    dbDriver Prompt,
    dbDrive r Complete,
    dbDriverCompleteRequired

Readonly

Допустимые значения: True (база данных открывается только для чтения) и значение False (по умолчанию, база данных открывается как для чтения, так и для записи)

Connect

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

Для закрытия базы данных следует применять метод close.

Например, для открытия базы данных с ядром Microsoft Jet можно использовать следующие две инструкции:

Dim БазаДанных As Database

Set БазаДанных = РабочаяОбласть

.OpenDatabase (Name:="C: \Пример.mdb",

Options:=True)

Объект Recordset

После открытия базы данных можно создать объект Recordset. Объект Recordset представляет собой записи исходной таблицы базы данных или результирующий набор записей, возвращаемые в результате запроса. Он позволяет управлять данными в базе данных на уровне записи. На уровне полей управление данными осуществляется объектом Field.

Имеются следующие типы объекта Recordset;

Тип | Описание
forward-only dynamic | Статический режим с последовательным доступом. Перемещаться от записи к записи можно только вперед. Этот режим самый скоростной Позволяет получать, анализировать, удалять и редактировать данные из нескольких динамически связанных таблиц. Этот тип соответствует динамическому указателю ODBC
table dynaset snapshot | Работает с одной таблицей текущей базы данных. В этом случае данные можно индексировать, что ускоряет поиск записей и их сортировку. При поиске записей допустимо использовать вместо метода Find метод Seek Позволяет получать, анализировать, удалять и редактировать данные из нескольких динамически связанных таблиц. Этот тип соответствует указателю ключевого набора записей ODBC В этом режиме в общем случае нельзя редактировать базу данных, но скорость работы больше, чем в двух предыдущих

Создание объекта Recordset

Объектная переменная типа Recordset создается при помощи метода openRecordSet. Как и для любой объектной переменной, ее надо сначала объявить, а только потом установить ссылку на объект, возвращаемый методом OpenRecordSet.

Синтаксис для объектов Connection и Database:

Set НаборЗапйсей = объект.OpenRecordset (Источник, Тип, Параметры, Блокировки)

Синтаксис для объектов QueryDef, Recordset и TableDef: Set НаборЗапйсей = Объект.OpenRecordset (Тип, Параметры, Блокировки) Аргументы:

Набор Записей | Объектная переменная, представляющая открываемый объект Recordset
Объект | Объектная переменная, представляющая существующий объект, используемый при создании нового объекта Recordset
Источник | Выражение (или переменная типа string) , определяющее источник записей для нового объекта Recordset. В качестве источника записей можно указать имя таблицы или запроса, а также инструкцию SQL, которая возвращает записи. Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы
Тип | Константа, указывающая тип открываемого объекта Recordset. Допустимые Значения: dbOpenTable, dbOpenDynaset, dbOpenSnapshot, DbOpenForwardOnly и DbOpenDynamic
Блокировки | Устанавливает тип блокировки данных. Допустимые значения: dbReadOnly, dbPessimistic, dbOptimistic и dbOptimisticValue
Параметры | Специфицирует работу пользователя с объектом Recordset. Приведем некоторые из допустимых значений: dbAppendOnly (пользователь может добавлять записи, но не может редактировать уже существующие), dbReadOnly (запрещено вносить изменения в записи), dbDenyWrite (запрещено другим пользователям вносить изменения)

Методы и свойства объекта Recordset

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

Методы объекта Recordset.

AddNew | Создает и добавляет новую запись. После внесения изменений в новую запись следует вызвать метод update для сохранения изменений и добавления записи в объект Recordset. До вызова метода update изменения в базу данных не заносятся
Clone | Создает копию объекта Recordset. Синтаксис: Set Копия = Оригинал . Clone
Close | Закрывает открытый объект доступа к данным
Delete | Удаляет текущую запись в обновляемом объекте Recordset
Edit | Копирует текущую запись из обновляемого объекта Recordset в буфер копирования для последующего изменения. После внесения изменений в новую запись следует вызвать метод update для сохранения изменений и добавления записи в объект Recordset
MoveFirst, MoveLast, MoveNext и MovePrevious | Делает текущей первую, последнюю, следующую или предыдущую запись объекта Recordset соответственно
FindFirst, FindLast, FindNext и FindPrevious | Находит первую, последнюю, следующую или предыдущую запись соответственно, удовлетворяющую заданным условиям, и делает эту запись текущей записью Синтаксис: (FindFirst | FindLast | FindNext | FindPrevious )Criteria criteria — это выражение (или переменная типа string), используемая для поиска записи Приведем несколько примеров критериев: "[Оценка] > 3" "[Фамилия] = 'Петров'" "[Оценка] =5 AND [Предмет] = 'Информатика'" " [ДатаЭкзамена] = #17/06/991

Seek

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

Синтаксис:

Seek comparison, keyl, key2 . . . key13

Аргументы: comparison — допустимые значения: "<", "<=", "=", ">=" или ">". keyl, key2, ..., key13 — одно или несколько значений ключевых полей в текущем индексе объекта Recordset

GetRows

Загружает строки объекта Recordset в массив.

Синтаксис:

Set ИмяМассива = НаборЗаписей . GetRows (NumRows)

  • NumRows — число строк

Update

Сохраняет вставки и изменения, произведенные в объекте Recordset При помощи методов AddNew и Edit

CancelUpdate

Отменяет все изменения объекта Recordset, выполненные При помощи методов AddNew и Edit

Свойства объекта Recordset.

BOF EOF | Возвращает значение True, если указатель текущей записи расположен перед первой записью набора записей, и значение False, если указатель текущей записи расположен на первой записи набора или на любой записи после нее Возвращает значение True, если указатель текущей записи расположен после последней записи набора, и значение False, если указатель текущей записи расположен на последней записи набора или на любой записи перед ней
Bookmark | Устанавливает или возвращает закладку, которая однозначно определяет текущую запись в объекте Recordset. Обычно используется для возврата в объект Recordset на определенное место, без указания конкретного адреса записи
NoMatch | Возвращаемые значения: True, если нужная запись не найдена, и False в противном случае
RecordCount | Возвращает число записей, к которым был осуществлен доступ в объекте Recordset. Свойство RecordCount не показывает, сколько записей содержится в объекте Recordset до обращения ко всем записям. После обращения к последней записи набора значение свойства RecordCount становится равным полному числу не удаленных записей в объекте Recordset. Для принудительного обращения к последней записи следует вызвать для объекта Recordset метод MoveLast
Filter | Задает или возвращает значение, определяющее записи, которые будут включены в открываемый объект Recordset. При указания критерия фильтрации названия полей заключаются в квадратные скобки. Приведем несколько примеров критериев: [Оценка] = 5 [Оценка] >= 3 [Оценка] =5 AND [Предмет] = "Информатика" [Оценка] = 4 AND [Предмет] = "Информатика" [Оценка] >= 4 AND [Предмет] IN ("Информатика", "Право") [Длина] * [Ширина] > 100 В критериях вместо знака равенства допустимо использование ключевого слова LIKE, например: [Оценка] LIKE 5
Sort | Задает или возвращает порядок сортировки записей в объекте Recordset (только в рабочей области Microsoft Jet). Для сортировки по возрастанию используется ключевое слово ASC, а по убыванию — DESC. Например, [Оценка] ASC [Фамилия] DESC Для сортировки первоначально по полю оценка, а потом по полю Фамилия: [Оценка] ASC, [Фамилия] DESC

Пример приложения

Рассмотрим работу с базой данных на примере следующего простого приложения, в котором используются все основные операции с записями. База данных находится в файле студенты.mdb, созданным в Access, и состоит из одной таблицы ПервыйКурс. В таблице имеются четыре поля: Фамилия, Группа, предмет и Оценка. При запуске приложения на экране отображается диалоговое окно Студенты первого курса.

Рис. 15.11. Диалоговое окно Студенты первого курса

Приводимая ниже программа:

  1. При активизации диалогового окна выводит в поля ввода информацию о первом студенте и в надписи всего записей указывает общее число записей в таблице.
  2. При нажатии кнопок > и < происходит перемещение на одну запись вперед и назад соответственно, а при нажатии кнопок >> и << — перемещение в конец и начало таблицы соответственно.

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

  1. При нажатии кнопки Удалить удаляется запись.
  2. При нажатии кнопки новая запись создается новая запись по данным, введенным в поля ввода.
  3. При нажатии кнопки Редактировать вносятся изменения в запись из базы данных.
  4. При нажатии кнопки Закрыть закрываются база данных и диалоговое окно.
  5. При выборе переключателя хорошисты и отличники в диалоговом окне выводятся данные только о хорошистах и отличниках, а при выборе переключателя все — выводится информация обо всех студентах.

'

' Переменные уровня модуля

'

Dim РабочаяОбласть As Workspace

Dim БазаДанных As Database

Dim Запись As Recordset

Dim ЗаписьДубль As Recordset

Dim Фамилия As String

Dim Критерий As String

Dim Закладка As Variant

'

Private Sub CommandButton1_Click()

'

' Найти запись по фамилии

'

' Запоминается на закладке текущая запись

Закладка = Запись.Bookmark

'

' Считывается фамилия из поля Фамилия, на ее основе

' создается критерий поиска и ищется первая запись с

' подобной фамилией '

Фамилия = Trim(TextBoxl.Text)

Критерий = "[Фамилия]="' & Фамилия & "'"

Запись.FindFirst Критерий

' Если запись с указанной фамилией найдена, то она отображается

' в диалоговом окне.

' Если запись не найдена, то отображается сообщение и

' при помощи закладки происходит возврат к записи, с которой

' был начат поиск

'

If Запись.NoMatch = False Then

ПоказатьЗапись Else

MsgBox "Запись не найдена", vblnformation, "Студенты"

Запись.Bookmark = Закладка

ПоказатьЗапись End If

End Sub

Private Sub CommandButtonlO_Click()

'

' Переход к последней записи

'

'

Запись.MoveLast ПоказатьЗапись

End Sub

'

Private Sub CommandButton2_Click()

' Найти следующую запись по фамилии

'

Закладка = Запись.Bookmark

Фамилия = Trim(TextBoxl.Text)

Критерий = "[Фамилия]='" & Фамилия & "'"

Запись.FindNext Критерий

If Запись.NoMatch = False Then

Показать Запись Else

MsgBox "Больше таких записей нет", vblnformation, "Студенты"

Запись.Bookmark = Закладка

Показать Запись

End If

End Sub

Private Sub CommandButton3_Click()

'

' Удаление записи

'

With Запись

.Delete

.MoveNext End With ПоказатьЗапись

End Sub

'

Private Sub CommandButton4_Click()

'

' Добавление записи

'

With Запись .AddNew

.Fields("Фамилия").Value = TextBoxl.Text

.Fields("Группа").Value = TextBox2.Text

.Fields("Предмет").Value = TextBox3.Text

.Fields("Оценка").Value = TextBox4.Text .Update

End With

'

Exit Sub

'

End Sub

Private Sub CommandButton5_Click()

'

' Редактирование записи

'

With Запись .Edit

.Fields("Фамилия").Value = TextBoxl.Text

.Fields("Группа").Value = TextBox2.Text

.Fields("Предмет").Value = TextBox3.Text

.Fields("Оценка").Value = TextBox4.Text

.Update End With End Sub

Private Sub CommandButton6_Click()

'

' Закрытие записи, базы данных и окна

'

Запись.Close

БазаДанных.Close

РабочаяОбласть.Close

UserForml.Hide

End Sub

Private Sub CommandButton7_Click()

' Переход к первой записи

'Запись.MoveFirst Показать Запись

End Sub

Private Sub CommandButton8_Click()

'

' Переход к предыдущей записи

'Запись.MovePrevious

'

' Если достигнута первая запись, то отображается сообщение

'

If Запись.BOF = True Then

Запись.MoveFirst

MsgBox "Первая запись", vblnformation, "Студенты"

End If

'ПоказатьЗапись

End Sub

'

Private Sub CommandButton9_Click()

' Переход к последующей записи

'

Запись.MoveNext

' Если достигнута последняя запись, то отображается сообщение

'

If Запись.EOF = True Then

Запись.MoveLast

MsgBox "Последняя запись", vblnformation, "Студенты"

End If

ПоказатьЗапись

End Sub

'

Private Sub OptionButtonl_Click()

'

' Отображение данных только о хорошистах и отличниках

'

' Создание копии записи

'

Set ЗаписьДубль = Запись.Clone

'

' Фильтрация записей по критерию

'

Запись.Filter = "[Оценка] >= 4"

'

' Создание отфильтрованной записи

'

Set Запись= Запись.OpenRecordset()

If Запись.RecordCount > 0 Then

'

' Если отфильтрованная запись существует, то она отображается

' в диалоговом окне

'ПоказатьЗапись

Else

'

' Если отфильтрованной записи нет, то отображается соответствующее

' сообщение, восстанавливается первоначальный объект Recordset

' и выбирается переключатель Все

'

MsgBox "Таких студентов нет", vblnformation, "Студенты"

Set- Запись = ЗаписьДубль.Clone

Set Запись = Запись.OpenRecordset()

OptionButton2.Value = True

End If

End Sub

Private Sub OptionButton2_Click()

'

' Отображение всех студентов

'

Set ЗаписьДубль = Запись.Clone

Set Запись = ЗаписьДубль.OpenRecordset()

ЗаписьДубль.Close

ПоказатьЗапись

End Sub

'

Private Sub UserForm_Initialize()

'

' Создание рабочей области

'

Set РабочаяОбласть = CreateWorkspace(Name:="", UserName:="admin",

Password:="", UseType:=dbUseJet)

'

' Открытие базы данных студенты.mdb

Set БазаДанных = _

РабочаяОбласть.OpenDatabase

(Name:="C:\MY_DOC\студенты.mdb",

Options:=True)

'

'

' Создание записей

'

Set Запись = БазаДанных.OpenRecordset("ПервыйКурс",dbOpenDynaset)

'

' Принудительное перемещение на последнюю запись для того,

' чтобы определить число записей Запись.MoveLast

'

' Вывод числа записей в надписи Номер записи из

'

'

Labels.Caption = "Всего записей " & CStr(Запись.RecordCount)

'

' Принудительное перемещение на первую запись

'Запись.MoveFirst

'

' Вывод первой записи в поля диалогового окна

'

ПоказатьЗапись With UserForm1

.Caption = "Студенты первого курса"

.OptionButton2.Value = True End With

End Sub

'

Sub ПоказатьЗапись()

'

' Процедура вывода записи в поля диалогового окна

'

TextBoxl.Text = Запись.Fields("Фамилия").Value

TextBox2.Text = Запись.Fields("Группа").Value

TextBox3 .Text = Запись.Fields ("Предмет.").Value

TextBox4.Text = Запись.Fields("Оценка").Value

'

End Sub


  • ЧАСТЬ П. ПРАКТИЧЕСКИЕ ПРИЕМЫ ПРОГРАММИРОВАНИЯ НА VBA
    • УРОК 1. ТЕМА: ИГРА "ОРЕЛ И РЕШКА"
      • ЦЕЛЬ УРОКА
      • ТЕОРИЯ
      • ПРАКТИКА
      • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Часть II.

Практические приемы программирования на VBA

Урок 1.

Тема: Игра "Орел и Решка"

Цель урока

На примере простейшей компьютерной игры будет полностью разработано первое приложение в этой книге. Это приложение должно моделировать игру в орел и решку. Игрок вносит в банк определенную сумму денег. Во время игры нельзя добавлять деньги в банк. Игра состоит из последовательности шагов, которая, вообще говоря, может быть бесконечной. На очередном шаге игрок загадывает либо орел, либо решку. Компьютер "бросает монету". Если "монета падает той же стороной", которую загадал игрок, то банк увеличивается на единицу, в противном случае - уменьшается на единицу. Игра заканчивается либо по желанию игрока, либо когда величина банка становится нулем или больше 10 000. Игрок забирает себе содержимое банка. В приложении отслеживаются максимальные и минимальные суммы, которые были в банке в течение игры.

Конструируя данное приложение, вы на практике узнаете, как:

  • Создавать из формы диалоговое окно
  • Набирать код программы
  • Программировать контроль ввода, т. е. проверять вводятся ли в поля числа или строковая информация
  • Управлять запретом ввода данных в поле
  • Работать с функцией генератора случайных чисел
  • Выводить числовую информацию в поле
  • Запускать программы на выполнение

Теория

Для моделирования бросания монеты потребуется генератор случайных чисел. Функция Rnd возвращает случайное число типа single из диапазона [0,1). Это приятное известие, что в VBA имеется генератор случайных чисел из диапазона [0,1). Но нам-то надо, чтобы моделировался процесс бросания монеты и с равной вероятностью генерировались два числа, скажем, 1 для орла и 0 для решки. На самом деле, этого легко достичь, рассматривая вместо Rnd функцию Int(2*Rnd). Функция int отбрасывает дробную часть аргумента и возвращает его целую часть. По аналогии с помощью функции Int (6*Rnd) +1 можно моделировать бросание игральной кости.

Практика

  1. Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Edit Visual Basic), откроется окно редактора Visual Basic.
  2. Выберите команду Вставить User Form (Insert UserForm).
  3. Используя панель элементов и окно свойств, заполните пользовательскую форму элементами управления (рис. У1.1), создав требуемое диалоговое окно приложения.

Рис. У1.1. Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка

  4. Для написания кода программы, связанного с пользовательской формой, достаточно дважды щелкнуть, например, кнопку Бросание монеты. Откроется редактор кода на листе модуля userFormi. Более того, он откроется на том месте, где программируются действия, связанные с элементом управления, который вы дважды щелкнули. Если код еще не набран, то при открытии редактора кода появятся инструкции заголовка и окончания процедуры, которая будет ассоциирована с элементом управления. В данном случае в редакторе кода будет:

    Private Sub CommandButtonl_Click() End Sub

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

  5. Когда-то Конфуций сказал: "То что слышу — забываю, то что вижу -запоминаю, а то что делаю — поминаю", а Мао Дзе Дун добавил: "Для того чтобы стул сдвинулся, его надо сдвинуть". Итак, вдохновившись этими двумя мудростями, наберем текст следующей программы на листе модуля UserForm1.

' Переменные уровня модуля

'

Dim Банк As Long

Dim Партия As Long

Dim НомерМаксимум As Long

Dim НомерМинимум As Long

Dim Максимум As Long

Dim Минимум As Long

'

Private Sub CommandButtonl_Click()

' Определяет номер очередной партии

Партия = Партия + 1

' Запрещается изменение пользователем значения

' в поле Банк в течение игры

TektBoxl.Enabled = False

'

' Проверяется, являются ли вводимыми в поле Банк данные числом

If IsNumeric(TextBoxl.Text) = False Then

MsgBox "Введите ставку", vbExclamation, "Орел и решка"

TextBoxl.Enabled = True

TextBoxl.SetFocus

Exit Sub End If Банк = CLng(TextBoxl.Text)

' Проверяется, не превышает ли Банк максимально допустимую величину

If Банк > 10000 Or Банк <= 0 Then

MsgBox "Ставка должна быть в диапазоне [1,10000]", vbExclamation, "Орел и решка"

TextBoxl.Enabled = True TextBoxl.SetFocus

Exit Sub

End If

'

' Бросается монета

'

Randomize

Монета = Int(2'* Rnd)

' Сравнение результата бросания монеты компьютером

' с ситуацией, когда игрок загадал "орел"

'

If OptionButtonl.Value = True Then

If Монета = 0 Then

Банк = Банк - 1

TextBoxl,Text = CStr(BaHK)

End If

If Монета = 1 Then

Банк = Банк + 1

TextBoxl.Text = CStr(Банк)

End If

End If

' Сравнение результата бросания монеты компьютером

' с ситуацией, когда игрок загадал "решка"

If OptionButton2.Value = True Then

If Монета = 1 Then Банк = Банк - 1

TextBoxl.Text = CStr(Банк)

End If

If Монета = 0 Then Банк = Банк + 1

TextBoxl.Text = CStr(Банк)

End If

End If TextBox2.Text = CStr(Партия)

' Определяется, превышает ли текущее значение поля Банк максимальную

' величину

'

If Банк > Максимум Then

Максимум = Банк

НомерМаксимум = Партия

TextBox3.Text = CStr(Максимум)

TextBox5.Text = CStr(НомерМаксимум)

End If

' Определяется, превышает ли минимальное значение поля Банк текущее

' значение

'

If Банк < Минимум Then

Минимум = Банк

НомерМинимум = Партия

TextBox4.Text = CStr(Минимум)

TextBox6.Text = CStr(НомерМинимум)

End If

End Sub

'

Private Sub CommandButton2_Click()

'

' Процедура закрытия диалогового окна

'

UserForml.Hide End Sub

Private Sub UserForm_Initialize()

' Процедура инициализации диалогового окна

Максимум = 0

Минимум = 10000

Партия = 0

'

' Поле Банк доступно для ввода информации пользователем

' при инициализации диалогового окна

'

TextBoxl.Enabled = True

'

' Поля Партия, Максимум, Минимум и Игра не доступны для

' ввода информации пользователем

'

TextBox2.Enabled = False

TextBox3.Enabled = False

TextBox4 ..Enabled = False

TextBox5.Enabled = False

TextBox6.Enabled = False

' При инициализации диалогового окна выбран переключатель Орел

OptionButtonl.Value = True

End Sub

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

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Поле Банк доступно для ввода информации пользователем при инициализации диалогового окна.
  3. В поля Партия, Максимум, Минимум и Игра разрешен только программный ввод данных.
  4. При инициализации диалогового окна выбран переключатель орел.

Нажатие кнопки

Бросание монеты

запускает на выполнение процедуру

CommandButton1 Click
  5. В переменной партия учитывается номер очередной партии.
  6. В поле Банк разрешен только программный ввод данных. Перед началом игры первой партии проверяется, является ли вводимое данное числом в диапазоне от 1 до 10 000. Если это условие не выполняется, отображается соответствующее сообщение (рис. У 1.2), предлагающее пользователю откорректировать данные. В поле Банк снова разрешен ввод данных пользователем. После чего происходит выход из процедуры для повтора ввода данных.
  7. Генерируется бросание модели. Определяется, кто выиграл в текущей партии. Корректируется информация о максимальном и минимальном выигрыше в течение игры, если какие-то изменения в этой информации имели место. Вся информация о текущем состоянии игры отображается в полях ввода.

Нажатие кнопки Отмена запускает на выполнение процедуру

CommandButton2 Click

Закрывает диалоговое окно.

Для запуска приложения достаточно нажать кнопку Запуск подпрограммы/UserForm или выбрать команду Запуск, Запуск подпрограммы/UserForm.

На экране появится диалоговое окно игры. Игрок вводит в поле Банк сумму денег, и потом, выбирая соответствующий переключатель в группе выбор, загадывает орел или Решка. Нажатие кнопки Бросание монеты приводит к подбрасыванию компьютером монеты. Текущий счет игрока отображается в поле Банк. В поле партия выводится номер текущей партии, а в полях максимум и минимум выводятся максимальный и минимальный счет игрока втечение предыдущих партий. На рис. У 1.3 приведено диалоговое окно орел-решка на 30-м ходе игры при начальном банке в 100 единиц. Отображаемая информация в диалоговом окне Орел-Решка показывает, что 30 партий изнурительной игры принесли игроку выигрыш только в 2 единицы. Если бы игрок не жадничал и остановил игру на 18 ходе, то его выигрыш был бы в два раза больше. А если бы игрок струсил, когда стал проигрывать, и вышел из игры на 3 ходе, то его проигрыш составил бы 3 единицы.

Рис. У1.2. Возможное сообщение о неправильном вводе данных в поле Банк

Рис. У1.3. Диалоговое окно Орел-Решка

Самостоятельное задание

Разработайте приложение для игры, которую назовем игрой в двенадцать. В этой игре последовательно до трех раз бросается игральная кость. Игрок может бросить игральную кость только один раз, или оценив результат первого броска - выполнить его во второй раз, или помня результаты двух предыдущих попыток -- бросить кость в третий раз. Все выпавшие очки суммируются. Если эта сумма 12 и более очков, то игрок проигрывает и игра заканчивается. Если сумма менее 12 очков, в игру вступает компьютер. Компьютеру известно только то, что игрок набрал менее 12 очков. Компьютер, как и игрок, может совершить до трех попыток бросания игральной кости. Если он наберет 12 и более очков, то компьютер проигрывает. Если компьютер набирает менее 12 очков, очки, набранные игроком и компьютером, сравниваются. Побеждает тот, у кого большая сумма очков. Конечно при равенстве очков — ничья. Попытайтесь построить для компьютера оптимальную стратегию. Если вы знаете хотя бы немного теории вероятности, то ее легко найти математически. Если вы не знакомы с теорией вероятности, попытайтесь определить стратегию экспериментально. Экспериментальный подход может быть даже более увлекательным, чем формальный.


  • УРОК 2. ТЕМА: РАСЧЕТ МАРГИНАЛЬНОЙ ПРОЦЕНТНОЙ СТАВКИ
    • ЦЕЛЬ УРОКА
    • ТЕОРИЯ
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 2

Тема: Расчет маргинальной процентной ставки

Цель урока

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

  • Как при помощи метода Goaiseek решаются уравнения
  • Программный ввод формулы в ячейку рабочего листа
  • Применение финансовой функции пз (PV)
  • Проверку корректности ввода данных из диалогового окна
  • Назначение клавишам <Enter> и <Esc> функций кнопок диалогового окна
  • Назначение кнопкам всплывающих подсказок
  • Использование MacroRecorder для упрощения и ускорения написания кода
  • Программное форматирование ячеек рабочего листа

Теория

Рассматриваемое приложение решает задачу следующего типа. В одной стране со стабильной валютой, скажем рублем, жил-был Ксенофон Заковыркин, начинающий бизнесмен. Однажды ему была предложена следующая сделка. Ксенофон дает в долг 10 000 руб., а ему возвращают по 2 000 руб. в течение 6 последующих лет, т. е. в сумме 12 000 руб., что больше даваемой в долг суммы денег. Ксенофон Заковыркин может не давать эти деньги в долг, а положить под проценты в банк. Спрашивается: при какой минимальной процентной ставке более выгодно класть деньги под проценты, чем давать в долг на данных условиях? Чему равен текущий объем вклада при годовой ставке 7%?

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

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

Для решения этой задачи воспользуемся понятием текущий объем вклада. Текущий объем вклада — это сегодняшний объем будущих платежей (отрицательные значения) и поступлений (положительные значения). Например, вам предлагают следующую сделку. У вас берут в долг некоторую сумму денег и предлагают через k1 год вернуть Рk1денег, через k2 года вернуть Рk2 денег и т. д., через kn лет вернуть Pkn денег. Кроме данной сделки у вас есть альтернативный способ использования ваших денег, например положить их в банк под i% годовых. Тогда текущим объемом вклада является та сумма денег, которой вы должны располагать в текущем году, чтобы положив их в банк под i% годовых, вы получили предлагаемую вам прибыль.

Текущий объем вклада на основе постоянных периодических платежей в течение согласованного срока возвращает финансовая функция рабочего листа пз (PV) .

Синтаксис:

ПЗ(ставка; кпер; выплата; бз; тип)

Аргументы:

ставка | Процентная ставка за период
кпер | Общее число периодов выплат
выплата | Величина постоянных периодических платежей
бз | Будущая стоимость или баланс наличности, который нужно достичь после последней выплаты. Если бз опущено, оно полагается равным 0 (будущая стоимость займа, например, равна 0)
тип | Число 0 или 1, обозначающее, когда должна производиться выплата. Если тип равен 0 или опущен, то оплата в конце периода, если — 1, то в начале периода

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

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

Текущий объем вклада = размер ссуды

Данное соотношение является уравнением относительно одной неизвестной величины -- процентной ставки. Корень одного уравнения с одной неизвестной находится на рабочем листе с помощью команды Сервис, Подбор параметра (Tools, GoalSeek) или программно посредством метода GoalSeek.

Практика

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

Рис. У2.1. Диалоговое окно Маргинальная процентная ставка

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Запрещает ввод данных пользователем в поля Текущий объем ссуды И Маргинальная процентная ставка.
  3. Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> - вычислить.
  4. Связывает с кнопками Вычислить и отмена всплывающие подсказки.

Нажатие кнопки вычислить запускает на выполнение процедуру

CommandButton1_Click
  5. Проверяет, являются ли вводимые данные числами. Если хотя бы одно из них не является числом, то на экране отображается соответствующее информационное сообщение с ; установкой фокуса на поле, где произведен некорректный ввод данных.
  6. Проверяет, будет ли ссуда меньше, чем возвращаемая сумма денег. Если ссуда больше этой суммы, то отображается сообщение с указанием, на сколько ссуда меньше возвращаемой суммы денег (рис. У2.2).
  7. Используя финансовую функцию рабочего листа, пз (PV) вычисляет чистый текущий объем ссуды при введенной процентной ставке.
  8. Используя метод Goaiseek (подбор параметра), находит маргинальную процентную ставку, т. е. ставку, при которой чистый текущий объем ссуды равен величине самой ссуды.
  9. Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (рис. У2.3).

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

CommandButton2_Click

Закрывает диалоговое окно.

Рис. У2.2. Сообщение о некорректном вводе данных

Рис. У2.3. Отчет, выводимый на рабочем листе программой расчета маргинальной процентной ставки

Private Sub CommandButtonl_Click() '

' Процедура расчета маргинальной процентной ставки

'

Dim i As Double

Dim p As Double

Dim A As Double

Dim iMarg As Double

Dim pPure As Double

Dim n As Integer

' n - число выплат

' p - размер ссуды

' a - размер одной выплаты

' i - процентная ставка

' pPure - текущий объем ссуды,

'на рабочем листе вычисляется функцией ПЗ

' iMarg - маргинальная процентная ставка

' Проверка того, чтобы введенные

' в диалоговое окно данные являются числами

'

If IsNumeric(TextBoxl.Text) = False Then MsgBox "Ошибка в числе выплат",

vblnformation, "Маргинальная ставка"

TextBoxl.SetFocus

Exit Sub

End If

'

If IsNumeric(TextBox2.Text) = False Then MsgBox "Ошибка в размере ссуды",

vblnformation, "Маргинальная ставка" TextBox2.SetFocus

Exit Sub

End If

If IsNumeric(UserForml.TextBox3.Text) = False Then MsgBox "Ошибка в размере одной выплаты",

vblnformation, "Маргинальная ставка"

TextBox3.SetFocus

Exit Sub

End If

'

If IsNumeric(TextBox4.Text) = False Then

MsgBox "Ошибка в процентной ставке",

vblnformation, "Маргинальная ставка"

TextBox2.SetFocus

Exit Sub

End If

'

' Ввод данных в переменные из диалогового окна

'

n = CInt(TextBoxl.Text)

р = CDbl(TextBox2.Text)

А = CInt(TextBqx3.Text)

i = CInt(TextBox4.Text) / 100

'

' Проверка согласованности ввода данных

'

If n * А < р Then

MsgBox "Возвращается на " & CStr(Format(р - n * A, "Fixed")) & " меньше размера ссуды", vbExclamation, "Маргинальная ставка"

TextBoxl.SetFocus

Exit Sub

End If

'

' Изменение ширины столбцов и задание режима ввода

' текста с переносом

'

ActiveSheet.Columns("A:A").Select

With Selection

.ColumnWidth =20 .WrapText = True

End With

ActiveSheet.Columns("B:B").Select

Selection.ColumnWidth = 12

' Выбор ячейки В2 для того, чтобы снять выделение со столбца В

ActiveSheet.Range("В2").Select

'

' Ввод названий записей на рабочем листе

With ActiveSheet

.Range("A2").Value = "Число выплат"

.Range("A3").Value = "Размер ссуды"

.Range("A4").Value = "Размер одной выплаты"

.Range("A5").Value = "Процентная ставка"

.Range("A6").Value = "Текущий объем ссуды"

.Range("А7").Value = "Маргинальная процентная ставка"

.Range("A8").Value = "Маргинальный чистый текущий объем ссуды"

.Range("B8").Activate End With

'

' Расчет чистого текущего объема ссуды

'

pPure = Application.PV(i, n, -A)

'

' Нахождение маргинальной процентной ставки

' с помощью команды Подбор параметра.

' Ввод данных в ячейки активного рабочего листа

' и задание процентного и денежного форматов в ячейках

With ActiveSheet

.Range("B2").Value = n

.Range("B3").NumberFormat = "#,##0$"

.Range("B3").Value = p

.Range("B4").NumberFormat = "#,##0$"

.Range("B4").Value = A

.Range("B5").NumberFormat = "0.00%"

.Range("B5").Value = i

.Range("B7").NumberFormat = "0.00%"

'

' Ввод начального приближения для маргинальной процентной ставки

'

.Range("B7").Value = i

'

' Ввод формулы расчета '

.Range("B8").FormulaLocal = "=ПЗ(B7;B2;-B4)"

.Range("B6").Value = .Range("B8").Value

'

' Выполнение команды Подбор параметра

'

.Range("B8").GoalSeek Goal:=p, ChangingCell:=.Range("B7")

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

' переменной iMarg

iMarg = .Range("B7").Value

End With

'

' Переформатирование найденных значений ' и вывод их в диалоговом окне

TextBoxS.Text = CStr(Format(pPure, "Fixed"))

TextBox6.Text = CStr(Format(iMarg * 100, "Fixed"))

End Sub

Private Sub CommandButton2_Click()

'

' Процедура закрытия диалогового окна

UserForml.Hide

'

End Sub

Private Sub UserForm_Initialize()

' Процедура вызова диалогового окна.

' Поля

' Чистый текущий объем ссуды

' и Маргинальная процентная ставка

' доступны для вывода информации, но не для ее ввода

TextBox5.Enabled = False

TextBox6.Enabled = False

'

' Клавише <Enter> назначена функция кнопки Вычислить

' Кнопке Вычислить назначен текст всплывающей подсказки

'

With CommandButtonl .Default = True

.ControlTipText = "Расчет и составление отчета на рабочем листе"

End With

'

' Клавише <Esc> назначена функция кнопки Отмена

' Кнопке Отмена назначен текст всплывающей подсказки

With CommandButton2 .Cancel = True

.ControlTipText = "Кнопка отмены"

End With '

UserForml.Show End Sub

При написании программ, в которых используется те или иные возможности рабочего листа, а не только VBA, часто бывает удобным вариантом воспользоваться средством MacroRecorder. Он создаст макрос, описывающий на языке VBA осуществляемые вами действия. MacroRecorder является одним из интеллектуальных средств Microsoft Office, которое облегчает работу разработчиков приложений. Конечно, создаваемый им макрос будет во многих отношениях не оптимальным, но тем не менее он даст хорошую подсказку о том, какие инструкции должны быть добавлены в программу, чтобы добиться требуемого эффекта.

Итак, для активизации MacroRecorder выберите команду Сервис, Макрос. Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК, появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка.

Сперва решите уравнение, вычисляющее маргинальную процентную ставку. В ячейку В2 введено число выплат, равное б, ячейка B7 отведена под процентную ставку, а в ячейку вб введена формула =пз{В7;в2;-B4), вычисляющая текущий объем ссуды. Требуется найти процентную ставку, при которой текущий объем ссуды равен 10 000.

Итак, MacroRecorder включен, осталось решить данную задачу вручную на рабочем листе и посмотреть на записанный макрос.

Решите задачу в соответствии со следующим алгоритмом:

  1. Выберите команду Сервис, Подбор параметра (Tools, Goal Seek).
  2. В появившемся диалоговом окне Подбор параметра (Goal Seek) в поле Установить в ячейке (Set cell) укажите ссылку на ячейку B6, где содержится формула с левой частью решаемого уравнения. В поле Значение (То value) введите число 10 000, значение правой части решаемого уравнения. В поле Изменяя значение ячейки (By changing cell) укажите ссылку на ячейку B7, которая отведена под неизвестную в решаемом уравнении.
  3. Нажмите на кнопку ОК. Появится диалоговое окно Результат подбора параметра (Goal Seek Status) с информацией о найденном решении.
  4. Нажмите на кнопку ОК диалогового окна Результат подбора параметра (Goal Seek Status).

Перечисленные выше действия будут переведены MacroRecorder в следующий макрос.

Sub Макрос1()

' Макрос1 Макрос

' Макрос записан 06.05.99 (Ксенофон Заковыркин)

'

Range ("B8") .GoalSeek Goal:=10000,

ChangingCell:=Range ("-B7")

End Sub

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

При написании программы данного приложения MacroRecorder может также пригодиться для задания числовых форматов в ячейках вз, В4, B5 и B7.

Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись.

Задавайте числовые форматы в ячейках вз, В4, В5 и BV по следующему алгоритму:

  1. Выделите ячейку вз. Выберите команду Формат, Ячейки (Format, Cells). В появившемся диалоговом окне Формат ячеек (Format Cells), на вкладке Число (Number) в списке Числовые форматы (Category) выберите Денежный (Currency). В поле Число десятичных знаков (Decimal places) введите 0, а в раскрывающемся списке Обозначения (Symbol) выберите р. Нажмите кнопку ОК.
  2. Выделите ячейку В4 и установите в ней числовой формат, как описано в выше.
  3. Выделите ячейку В5. Выберите команду Формат, Ячейки (Format, Cells). В появившемся диалоговом окне Формат ячеек (Format Cells) на вкладке Число (Number) в списке Числовые форматы (Category) выберите Процентный (Percentage). В поле Число десятичных знаков (Decimal places) введите 2. Нажмите кнопку ОК.
  4. Выделите ячейку B7 и установите в ней числовой формат, как описано в предыдущем пункте.

Перечисленные выше действия будут переведены MacroRecorder в следующий макрос.

Sub Макрос3()

'

' МакросЗ Макрос

' Макрос записан 06.05.99 (Ксенофон Заковыркин)

'

'

'

Range("ВЗ").Select

Selection.NumberFormat = "#,##0$"

Range("B4").Select

Selection.NumberFormat = "#,##0$"

Range("B5").Select

Selection.NumberFormat = "0.00%"

Range("B7").Select

Selection.NumberFormat = "0.00%"

End Sub

Рис. У2.4. Диалоговое окно Формат ячеек

Созданные в данном макросе инструкции как раз и осуществляют требуемое в программе приложения форматирование.

Самостоятельное задание

Разработать приложение с диалоговым окном Решение уравнения (рис. У2.5) для реализации следующих задач:

  • Нахождение корней уравнения хеbx = а
  • Отметим, что данное уравнение в зависимости от параметров а и b может иметь два корня, либо только один корень, либо вообще их не иметь. В приложении следует предусмотреть отображение информационного сообщения о том, сколько корней при вводимом наборе параметров имеет уравнение. В случае наличия корней вывести их значения
  • Используя свойство visible (видимый) элементов управления, сделайте так, чтобы в группе корни в случае единственного корня отображалось только одно поле с этим корнем, а при отсутствии корней в этой группе не отображалось бы ни одного поля, но вместо них отображался бы элемент управления Caption (надпись) с текстовым сообщением об их отсутствии.

Рис. У2.5. Диалоговое окно Решение уравнения


  • УРОК 3. ТЕМА: РАБОТА СО СПИСКОМ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 3.

Тема: Работа со списком

Цель урока

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

  • Заполнять списки
  • Выбирать несколько элементов из списка
  • Выполнять специфицированную операцию над выбранными элементами из списка

Практика

Создадим приложение, которое позволит выбрать несколько чисел, выводимых В списке В диалоговом Окне Операции над элементами списка (рис. У3.1).

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

Рис. У3.1. Диалоговое окно Операции над элементами списка

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Запрещает ввод данных в поле Результат,
  3. Назначает клавише <Esc> функцию кнопки Отмена, а клавише <Enter> — Вычислить.
  4. Связывает с кнопками вычислить и отмена, а также с переключателями всплывающие подсказки.

Нажатие кнопки вычислить запускает на выполнение процедуру

CommandButtonl Click

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

Нажатие кнопки Отмена запускает на выполнение процедуру

CommandButton2 Click

Закрывает диалоговое окно.

'

Private Sub CommandButtonl_Click()

'

' Процедура проведения вычислений с выбранными элементами

' списка в зависимости от выбранной операции

'

Dim i As Integer

Dim n As Integer

'

' i - вспомогательная переменная

' n - играет роль счетчика числа выбранных элементов из списка

'

Dim Сумма As Double

Dim Произведение As Double

Dim Среднее As Double

Dim Результат As Double

'

' Сумма - сумма выбранных элементов из списка

' Произведение - произведение выбранных элементов из списка

' Среднее - среднее арифметическое значение выбранных элементов из списка

' Результат - в эту переменную записывается результат, найденный

' в зависимости от выбранного переключателя

'

'

' При выборе первого переключателя вычисляется сумма выбранных элементов

If OptionButtonl.Value = True Then Сумма = 0

With ListBoxl

For i = 0 To .ListCount - 1

If .Selected(i) = True Then Сумма = Сумма + .List(i)

End If

Next i

End With

Результат = Сумма

End If

'

' При выборе второго переключателя вычисляется произведение

'

выбранных элементов

'

If OptionButton2.Value = True Then Произведение = 1

With ListBoxl

For i = 0 To .ListCount - 1

If .Selected(i) = True Then

Произведение = Произведение * .List(i)

End If

Next i

End With

Результат = Произведение End If

'

' При выборе третьего переключателя вычисляется среднее арифметическое

' значение выбранных элементов

'

If OptionButton3.Value = True Then Среднее = 0

n = 0

With ListBoxl

For i = 0 To .ListCount - 1 i

If .Selected(i) = True Then

n = n + 1

Среднее = Среднее + .List(i)

End If

Next i

End With

Результат = Среднее / n

End If

' Результат выводится в поле Результат

'

TextBoxl.Text = CStr(Format(Результат, "Fixed"))

End Sub

Private Sub CommandButton2_Click()

'

' Процедура закрытия диалогового окна

'

UserForml.Hide

End Sub

'

'

Private Sub UserForm_Initialize()

'

' Процедура инициализации диалогового окна

'

' Заполнение списка и установка режима выбора

' нескольких элементов из списка

'

With ListBoxl

.List = Array(1, 3, 4, 5, 6, 7, 8, 10)

.Listlndex = 0

.MultiSelect = fmMultiSelectMulti

End With

'

' Первоначальный выбор переключателя Сумма при

' инициализации диалогового окна и задание

' текста всплывающих подсказок у переключателей

'

With OptionButtonl

.Value = True

.ControlTipText = "Сумма выбранных элементов"

End With OptionButton2.ControlTipText = "Произведение выбранных элементов"

OptionButton3.ControlTipText = "Среднее значение выбранных элементов"

'

' Поле Результат не доступно для пользователя

'

TextBoxl.Enabled = False

' Назначение клавише <Enter> функции кнопки Вычислить

' и задание текста всплывающей подсказки

With CommanandButtonl

.Default = True

.ControlTipText = "Нахождение результата"

End With

'

' Назначение клавише <Esc> функции кнопки Отмена

' и задание текста всплывающей подсказки

'

CommandButton2.Cancel = True

'

' Задание -заголовка пользовательской формы

'

UserForm1.Caption = "Операции над элементами списка"

UserForm1.Show

End Sub

Самостоятельное задание

Интересной особенностью приводимой процедуры инициализации userForm_initiaiize является то, что заголовок диалогового окна вводится программно при помощи свойства Caption, а не вручную при помощи окна Свойства (Properties).

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

В качестве самостоятельного задания составьте программу нахождения среднего балла студентов, выбранных из списка в диалоговом окне Средний балл (рис. УЗ.2). Список заполните из данных, введенных из диапазона на рабочем листе с помощью свойства RowSource объекта ListBox. Фамилии студентов пусть будут расположены в столбце А, а их оценки в столбце в диапазона с данными о студентах. Создайте в программе обработчик ошибок, который будет проверять, являются ли данные из второго столбца списка с оценками студентов числами. Если хотя бы одно из этих данных не является числом, программа должна проинформировать об этом пользователя с просьбой исправить найденную некорректность. Обратите внимание также на то, чтобы в диалоговом окне средний балл надписи на кнопках ок и Отмена для большей презентабельности были выведены полужирным шрифтом увеличенного размера.

Рис. УЗ.2. Диалоговое окно Средний балл


  • УРОК 4. ТЕМА: РАСЧЕТ АМОРТИЗАЦИИ
    • ЦЕЛЬ УРОКА
    • ТЕОРИЯ
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 4

Тема: Расчет амортизации

Цель урока

В уроке разрабатывается приложение, решающее задачу расчета амортизации в зависимости от выбранного метода: стандартного или А;-кратного учета амортизации. На примере данного приложения вы узнаете, что такое:

  • Финансовые функции расчета амортизации
  • Управление видимостью отдельных элементов управления в окне диалога
  • Программный вывод объектов WordArt на рабочий лист

Теория

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

Функция рабочего листа AMP (SLN) возвращает величину амортизации имущества за один период времени, используя метод равномерной амортизации.

Синтаксис:

АМР(стоимость; остаток; время_эксплуатации)

Аргументы:

стоимость | Начальная стоимость имущества
остаток | Остаточная стоимость в конце периода амортизации (иногда называется ликвидной стоимостью имущества)
время_эксплуатации | Количество периодов, за которые собственность амортизируется (иногда называется периодом амортизации)

Предположим, вы купили за 6 000 руб. компьютер, который после 5 лет эксплуатации будет оцениваться в 1 000 руб. Снижение стоимости для каждого года эксплуатации вычисляется формулой =дмр(6000; 1000; 5), которая определяет 1 000р.

Функция АМГД (SYD) возвращает годовую амортизацию имущества для указанного периода.

Синтаксис:

АМГД(стоимость; остаток; время_эксплуатации; период)

Аргументы:

стоимость | Начальная стоимость имущества
остаток | Остаточная стоимость в конце периода амортизации (иногда называется ликвидной стоимо- : стью имущества)
время эксплуатации | Количество периодов, за которые собственность амортизируется (иногда называется периодом амортизации)
период | Номер периода для вычисления амортизации (должен измеряться в тех же единицах, что и время полной амортизации)

При расчете предыдущего примера получим, что за первый год эксплуатации компьютера амортизация вычисляется формулой =АМГД(6000;1000;5,-1), которая возвращает значение1 666.67р., а за последний — формулой =АМГД(6000;1000;5;5), которая возвращает значение 333.33р.

Функция ДОБ (DB) возвращает амортизацию имущества на заданный период, используя метод постоянного учета амортизации.

Синтаксис:

ДОБ(стоимость; остаток; время_эксплуатации; период; месяц)

Аргументы:

стоимость | Начальная стоимость имущества
остаток | Остаточная стоимость в конце периода амортизации (иногда называется ликвидной стоимостью имущества)
время эксплуатации | Количество периодов, за которые собственность амортизируется (иногда называется периодом амортизации)
период | Номер периода для вычисления амортизации (должен измеряться в тех же единицах, что и время полной амортизации)
месяц | Количество месяцев в первом году. Если аргумент месяц опущен, то предполагается число 12

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

При расчете предыдущего примера получим амортизацию за время эксплуатации компьютера:

=ДОБ(6000;1000;5; 1) возвращает значение 1806.00р.

=ДОБ(6000;1000;5;2) возвращает значение 1262.39р.

=ДОБ(6000;1000;5;3) возвращает значение 882.41р.

=ДОБ(6000;1000;5,-4) возвращает значение 616.81р.

=ДОБ(6000; 1000;5;5) возвращает значение 431.15р.

Функция ДДОБ (DDB) возвращает величину амортизации имущества для указанного периода, используя метод двукратного (или к- кратного) учета амортизации.

Синтаксис:

ДДОБ(стоимость; остаток; время_эксплуатации; период; коэффициент)

Аргументы:

Стоимость | Начальная стоимость имущества
остаток | Остаточная стоимость в конце периода амортизации (иногда называется ликвидной стоимостью имущества)
время эксплуатации | Количество периодов, за которые собственность амортизируется (иногда называется периодом амортизации)
период | Номер периода для вычисления амортизации (должен измеряться в тех же единицах, что и время полной амортизации)
коэффициент | Норма снижения балансовой стоимости (амортизации). Если коэффициент опущен, то предполагается, что он равен 2 (метод двукратного учета амортизации)

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

В примере с компьютером по методу двукратной амортизации она составит:

=ДДОБ(6000;юоо;5,-1) возвращает значение 2400.00р.

=ДДОБ{6000; 1000;5;2) возвращает значение 1440. 00р.

=ДДОБ (босо,-1000,-5; 3) возвращает значение 864.00р.

=ДДОБ(6000;1000;5; 4 г возвращает значение 296. 00р.

=ДДОБ (6000,- 1000;5,- 5) возвращает значение 0. 00р.

В следующем разделе рассматривается разработка приложения, в котором по начальной и остаточной стоимостям оборудования, сроку амортизации и расчетному периоду амортизации при выбранном методе расчета находится величина амортизации. Кроме того, в диалоговом окне, с помощью которого происходит управление работой приложения, используя свойство visible осуществляется управление видимостью поля, счетчика и надписи. Изменение свойства Visible происходит при выборе метода амортизации. Для придания большей презентабельности отчету об амортизации на рабочий лист внедряется объект WordArt при помощи метода AddTextEffeet семейства Shapes.

Практика

Для решения задачи нахождения вычисления амортизации оборудования по стандартному методу или методу к-кратного учета с помощью редактора пользовательских форм создадим диалоговое окно Расчет амортизации (рис. У4.1).

Рис. У4.1. Диалоговое окно Расчет амортизации

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Запрещает ввод данных пользователем в поле Кратность метода.
  3. Назначает клавише <Esc> функцию кнопки Отмена, а клавише <Enter> -- Вычислить.
  4. Назначает кнопке вычислить сочетание клавиш <Alt>+<B>, а кнопке Отмена — <Alt>+<O>.
  5. В группе тип амортизации при инициализации диалогового окна назначает выбор переключателя Стандартный метод. За счет выбора этого переключателя при инициализации диалогового окна не отображаются надпись кратность метода и соответствующие ей поле и счетчик (рис. У4.2).
  6. Устанавливает для счетчика минимальное значение, равное 2, и шаг изменения значений счетчика, также равный 2, для убыстрения прокрутки ; счетчика. Промежуточные значения вводятся в i поле Кратность метода не с помощью счетчика, i а посредством клавиатуры.

Рис. У4.2. Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета

SpinButton1_ Change | Изменяет значение счетчика, которое вводится в i поле Кратность метода .
OptionButton2_Click | Отображает в диалоговом окне надпись кратность ; метода и соответствующие ей поле и счетчик.

OptionButton2_Click

Скрывает в диалоговом окне надпись кратность метода и соответствующие ей поле и счетчик.

Нажатие кнопки вычислить запускает на выполнение процедуру

CoramandButton1_Click
  1. Проверяет согласованность вводимых данных. В случае их несогласованности отображает соответствующее сообщение (рис. У4.3, а и У4.3, б).
  2. Используя финансовую функцию рабочего листа SYD (АМГД) и DDB (ДДОБ) вычисляет величину амортизации выбранным методом.
  3. Удаляет с рабочего листа все ранее созданные графические объекты и внедряет объект WordArt. Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (рис. У 4. 4).

а)

б)

Рис. У4.3. Сообщения о несогласованности вводимых данных

Рис. У4.4. Отчет, выводимый на рабочем листе программой расчета амортизации

Нажатие кнопки отмена запускает на выполнение процедуру CommandButton2_Click | Закрывает диалоговое окно.

Private Sub CommandButtonl_Click()

' Процедура расчета амортизации

'

Dim В As Double

Dim E As Double

Dim A As Double

Dim Ye As Integer

Dim Yc As Integer

Dim k As Integer

Dim Flag As Boolean

'

' В - первоначальная стоимость оборудования, для которого

' подсчитывается амортизация

' Е - остаточная стоимость оборудования

' Ye - время полной „амортизации

' Yc - период, для которого рассчитывается амортизация

' Flag - логическая переменная, равная True, если амортизация

' рассчитывается стандартным методом, и False, если методом

' k-кратного учета

Dim n As Integer

Dim j As Integer

' n, j - вспомогательные переменные, используемые для удаления

' ранее созданных графических объектов

'

' Считывание в переменные из диалогового окна значений параметров

В = CDbl(TextBoxl.Text)

Е = CDbl(TextBox2.Text)

Ye = CInt(TextBox3.Text)

Yc = CInt(TextBox4.Text)

' Проверка согласованности вводимых данных

'

If В < Е Then

MsgBox "Остаток больше начальной стоимости", vbExclamation, "Амортизация"

TextBoxl.SetFocus

Exit Sub

End If

If Ye < Yc Then

MsgBox "Ошибка в сроке амортизации", vbExclamation, "Амортизация"

TextBox3.SetFocus

Exit Sub

End If

'

' Определение выбранного переключателя:

' если Стандартный, то переменной Flag присваивается True;

' если k-кратного учета, то переменной Flag присваивается False

'

If OptionButtonl.Value = True Then

Flag = True

Else

Flag = False

End If

' Расчет амортизации в зависимости от выбранного метода

'

If Flag = True Then

'

' Стандартным методом

A = Application.SYD(В, Е, Ye, Yc)

Else

' Методом k-кратного учета

'

k = CInt(TextBox6.Text)

A = Application.DDB(B, E, Ye, Yc, k)

End If

' Вывод величины амортизации в диалоговом окне

'

If A >= 0.01 Then

A = Format(A, "Fixed")

Else

A = 0

End If

TextBoxS.Text = CStr(A)

'

' Подготовка рабочего листа для ввода данных

'

'

' Определения общего числа объектов Shape на рабочем листе

'

n = ActiveSheet.Shapes.Count

'

' Удаление с рабочего листа всех ранее созданных объектов Shape

'

If n >= 1 Then

For j = 1 To n

ActiveSheet.Shapes(j ).Select Selection.Delete

Next j

End If

'

' Создание объекта WordArt

'

ActiveSheet.Shapes.AddTextEffeet(msoTextEffect14, "Амортизация",

"Impact", 18#, msoTrue, msoFalse, 166.5, 105#).Select

'

' Сдвиг объекта WordArt

'

Selection.ShapeRange.IncrementLeft 111# Selection.ShapeRange.IncrementTop -100.5

' Изменение ширины столбцов А и В и установка в

' них режима ввода текста с переносом

ActiveSheet.Columns("A").Select

With Selection

.ColuranWidth = 30

.WrapText = True

End With

ActiveSheet.Columns("B")

.Select With Selection

.ColumnWidth = 20 .WrapText = True

End With

' Снятие выделения со столбца В выбором одной ячейки

'

ActiveSheet.Range("Bl").Select

' Ввод заголовков полей на рабочем листе

'

With ActiveSheet

.Range (."Al") .Value = "Начальная стоимость"

.Range("A2").Value = "Остаточная стоимость"

.Range("A3").Value = "Время полной амортизации"

.Range("A4").Value = "Период, для которого рассчитывается амортизация"

.Range("A5").Value = "Расчет выполнен"

.Range("A6").Value = "Величина амортизации"

End With

'

'

' Ввод данных в ячейки рабочего листа

'

With ActiveSheet

.RangeC"B1").Value = В

.Range("B2").Value = Е

.Range("ВЗ").Value = Ye

.Range("B4").Value = Yc

.Range("B6").Value = A

.Range("B5").WrapText = True

If Flag = True Then

.Range("B5").Value = "стандартным методом"

Else

.Range("B5").Value = "методом " & CStr(k) &

" кратного учета амортизации"

End If

End With

End Sub

'

Private Sub CommandButton2_Click ()

'

' Процедура закрытия диалогового окна

'

UserForml.Hide End Sub

Private Sub OptionButtonl__Click()

'

' Процедура скрывает название, поле и счетчик для ввода

' кратности амортизации

'

Label6.Visible = False

TextBox6.Visible = False

SpinButtonl.Visible = False

End Sub

Private Sub OptionButton2_Click()

'

' Процедура делает видимыми название, поле для ввода

' кратности амортизации и счетчик

Label6.Visible = True

TextBox6.Visible = True

SpinButtonl.Visible = True

End Sub

Private Sub SpinButtonl_Change()

' Процедура вводит значение счетчика в поле ввода

'

TextBox6.Text = CStr(SpinButtonl.Value)

End Sub

Private Sub UserFormJEnitialize()

'

' Процедура активизирует диалоговое окно Расчет амортизации

'

' При инициализации окна выбран первый переключатель

OptionButtonl.Value = True

'

' Первоначально название, поле и счетчик для ввода

' кратности амортизации не отображаются в диалоговом окне i

TextBoxS.Enabled = False

TextBox6.Visible = False

Label6.Visible = False

SpinButtonl.Visible = False

'

' Минимальное значение и шаг,

' с которым изменяются значения счетчика

'

With SpinButtonl .Min = 2 .SmallChange = 2

End With

'

' Функция кнопки Отмена выполняется по умолчанию

'

CommandButton2.Default = True

'

' Нажатие .клавиши <Esc> эквивалентно нажатию кнопки Отмена

CommandButton2.Cancel = True

'

' Функция кнопки Вычислить выполняется по нажатию клавиш <Alt>+<D>

' или на русской клавиатуре <Alt>+<B>

'

CommandButtonl.Accelerator = "D" '

' Функция кнопки Отмена выполняется по нажатию клавиш <Alt>+<J>

' или на русской клавиатуре <Alt>+<0>

CommandButton2.Accelerator = "J"

UserForml.Show

'

End Sub

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

Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Выполните построение объекта WordArt по следующему алгоритму:

  1. Нажмите кнопку Добавить объект WordArt (Insert WordArt) панели инструментов Рисование (Drawing).
  2. В появившемся окне Коллекция WordArt (WordArt Gallery) выберите нужный стиль надписи. Нажмите кнопку ОК.
  3. В появившемся окне Изменение текста WordArt (Edit WordArt Text) установите шрифт и размер отображаемого текста, а также в поле Текст (Text) введите текст, который будет отображаться, например Амортизация . Нажмите кнопку ОК.
  4. На рабочем листе появится внедренный объект WordArt. Выберите и перенесите его в требуемое место на этом листе.
  5. Для того чтобы разобраться, как происходит программное удаление объекта WordArt с рабочего листа, выделите его и удалите с помощью клавиши <Delete>.

Перечисленные выше действия будут переведены MacroRecorder в следующий макрос.

Sub Макрос1()

' Макрос1 Макрос

' Макрос записан 26.04.99 (Андрей)

'

ActiveSheet.Shapes.AddTextEffeet(msoTextEffect!4,

"Амортизация", "Impact",

18#, msoTrue, msoFalse, 166.5, 105#).Select

Selection.ShapeRange.IncrementLeft lilt

Selection.ShapeRange.IncrementTop -100.5

ActiveSheet.Shapes("WordArt 1").Select

Selection.Delete

End Sub

Первые три инструкции этого макроса предназначены для создания объекта wordArt. Их просто надо скопировать в то место программы расчета амортизации, где создается этот объект. Две последние инструкции связаны с удалением объектов wordArt с рабочего листа. Подсказка со стороны MacroRecorder очень полезна, т. к. у объекта wordArt нет метода Delete. Удаляемый объект необходимо выбрать, что приведет к образованию объекта selection. Удалять надо не непосредственно объект wordArt, а полученный указанным способом объект Selection. Эта идея как раз и реализована в данном приложении.

Самостоятельное задание

Разработать приложение, с помощью которого можно:

  • Либо вычислить значение заданной функции, скажем у(х) = Sin(x) / (1 + х2), при вводимом значении аргумента и вывести найденное значение в поле диалогового окна.

Рис. У4.5. Диалоговое окно Значение или график при выборе переключателя Значение

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

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

Переключателя из группы Операция диалогового окна Значение или график.

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

Рис. У4.6. Диалоговое окно Значение или график при выборе переключателя График


  • ГЛАВА 2. ОСНОВНЫЕ ОБЪЕКТЫ VBA
    • ОБЪЕКТ APPLICATION
      • Свойства объекта Application
      • Методы объекта Application
      • События объекта Application
    • ОБЪЕКТ WORKBOOK и СЕМЕЙСТВО WORKBOOKS
      • Свойства объекта Workbook и семейства Workbooks
      • Методы объекта Workbook и семейства Workbooks
      • События объекта Workbook и семейства Workbooks
    • ОБЪЕКТ WORKSHEET и СЕМЕЙСТВО WORKSHEETS
      • Свойства объекта Worksheet и семейства Worksheets
      • Методы объекта Worksheet и семейства Worksheets
      • События объекта Worksheet
    • ОБЪЕКТЫ RANGE и SELECTION
      • Адресация ячеек
      • Задание групп строк и столбцов с помощью объекта Range
      • Связь объекта Range и свойства Cells
      • Свойства и методы объекта Range

Глава 2.

Основные объекты VBA

Объект Application

Объект Application (приложение) является главным в иерархии объектов Excel и представляет само приложение Excel. Он имеет более 120 свойств и 40 методов. Эти свойства и методы предназначены для установки общих параметров приложения Excel. Кроме того, объект Application позволяет вызывать более 400 встроенных функций рабочего листа при помощи конструкции вида:

Application.ФункцияРабочегоЛиста(Аргументы)

Например:

Application . Pi ( ) | Вычисление числа п
Application. Pmt (Аргументы) | Определение постоянных периодических платежей при постоянной процентной ставке с помощью функции ППЛАТ (РМТ)
Application . Sum (Аргументы) | Нахождение суммы значений из ячеек диапазона

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

Свойства объекта Application

Свойства | Выполняемые действия и допустимые значения
ActiveWorkbook, ActiveSheet ActiveCell | Возвращают активный объект: рабочую книгу, лист, ячейку, диаграмму, диалоговое окно. Свойство ActiveCell содержится В ActiveSheet, а свойства ActiveSheet, ActiveChart И ActiveDialog в ActiveWorkbook.
Свойства | Выполняемые действия и допустимые значения
ActiveChart | В следующем примере в активной ячейке устанавливается по-
ActiveDialog | лужирный шрифт и в нее вводится строка текста Отчет за май: With ActiveCell .Font. Bold = True .Value = "Отчет за май" End With
ThisWorkbook | Возвращает рабочую книгу, содержащую выполняющийся в данный момент макрос. Это свойство может возвращать рабочую книгу, отличную от возвращаемой свойством Active-Workbook, т. к. выполняемый макрос может находиться в неактивной книге
Calculation | Устанавливает режим вычислений. Допустимые значения: xlCalculationAutomatic (автоматический режим) xlCalculationManual (вычисления выполняются вручную) xlCalculationSemiAutomatic (автоматический режим, не распространяется на таблицы)
Caption | Возвращает текст в строке имени главного окна Excel. Установка свойства равным Empty возвращает заголовок, используемый по умолчанию. В следующем примере первая инструкция устанавливает в качестве заголовка окна приложения текст Отчет за 1999 год, а вторая возвращает имя окна, используемое по умолчанию, т. е. Microsoft Excel: Application. Caption = "Отчет за 1999 год" Application. Caption = Empty
DisplayAlerts | Допустимые значения: True (отображаются встроенные предупреждения о работе программы) и False (предупреждения не отображаются)
DisplayFormulaBar | Допустимые значения: True (строка формул выводится в окне Excel) и False (строка формул не выводится). В данном ниже примере установлен режим, при котором строка формул не будет выводиться в окне Excel: Application. DisplayFormulaBar = False
DisplayScrollBars | Допустимые значения: True (полосы прокрутки видны в окне Excel) и False (полосы прокрутки не отображаются). Например: Application. DisplayScrollBars = False — строка формул не будет выводиться в окне Excel
Свойства | Выполняемые действия и допустимые значения
DisplayStatusBar | Допустимые значения: True (строка состояния видна в окне Excel) и False (строка состояния не видна). Например: Application. DisplayStatusBar = True — строка состояния не будет выводиться в окне Excel
EnableCancelKey | Определяет действие при нажатии комбинации клавиш <Ctrl>+<Break>, используемой для прерывания выполнения процедуры. Допустимые значения: xlDisabled (прерывания программы запрещено) xllnterrupt (прерывание процедуры разрешено) XlErrorHandler (прерывание воспринимается как ошибка)
Height | Высота окна приложения в пунктах
Width | Ширина окна приложения в пунктах
Left | Расстояние в пунктах от левой границы окна приложения до левого края экрана
Right | Расстояние в пунктах от правой границы окна приложения до правого края экрана
Top | Расстояние в пунктах от верхней границы окна приложения до верхнего края экрана
ScreenUpdating | Допустимые значения: True (изображение обновляется во время выполнения программы) и False (изображение не обновляется). Задание False в качестве значения свойства ускоряет выполнение процедуры. В конце процедуры свойству ScreenUpdating необходимо присвоить значение True
StatusBar | Выводит заданный текст в строке состояния. Выполнение приведенного ниже примера позволит вывести текст Ввод данных. . . в строке состояния: Application. DisplayStatusBar = True Application. StatusBar = "Ввод данных..."
Version | Возвращает номер текущей версии Excel. Применяется для проверки того, что приложение используется в корректной версии. Например: If Application. Version о "8.0" Then Exit Sub
WindowState | Устанавливает размер окна. Допустимые значения: xlMaximized (максимальный) xlMinimized (минимальный) xlNormal (нормальный) Например: Application. WindowState = xlMaximized — устанавливается максимальный размер окна

Методы объекта Application

Методы

Выполняемые действия

Calculate

Run

Volatile

Wait

OnKey

Вызывает принудительное вычисление во всех открытых рабочих книгах. Например:

Application. Calculate

Запускает на выполнение подпрограмму или макрос. Синтаксис:

Run (Macro, Argl, Arg2, ...)

  • Macro — строка с именем макроса
  • Arg1, Arg2, ... — аргументы передаваемые макррсу Например:

Application. Run Macro:= "Расчет"

- запускает макрос Расчет

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

Function Квадрат (х) Application .

Volatile Квадрат = х^2 End Function

Временно приостанавливает работу приложения без остановки работы других программ.

Синтаксис:

Wait (Time)

  • Time — время, в которое предполагается возобновить работу приложения

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

Application. Wait "17:00:00"

Устанавливает выполнение специфицированной процедуры при нажатии заданной комбинации клавиш.

Синтаксис:

OnKey(Key, Procedure)

  • Procedure — имя выполняемой подпрограммы при нажатии клавиш
  • Key — строка, определяющая комбинацию клавиш, которая должна быть нажата. В этой строке можно также указывать специальные клавиши, используя следующие коды:

Методы

Выполняемые действия

OnRepeat и OnUndo
  • <Backspace> — {BACKSPACE} или (BS)
  • <Break> — {BREAK}
  • <Caps Lock> — {CAPSLOCK}
  • <Delete> или <Del> — {DELETE} или {DEL}
  • <вниз>— {DOWN}
  • <End> — {END}
  • <Enter> (цифровая клавиатура) — {ENTER}
  • <ESC> — {ESCAPE}или {ESC}
  • <Home> — {HOME}
  • <lns>или <lnsert>— {INSERT}
  • <<-> — {LEFT}
  • <Num Lock> — {NUMLOCK}
  • <Page Down> — {PGDN}
  • <Page Up> — {PGUP}
  • <Return> — {RETURN}
  • <->> — {RIGHT}
  • <Scroll Lock> — {SCROLLLOCK}
  • <Tab>- {TAB}
  • <вверх>- {UP}
  • ОТ <F1> до<F15> — ОТ {F1}до{F15}

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

  • <Shift> - +
  • <Ctrl> ^
  • <Alt>-%

В примере процедуре Амортизация назначена комбинация клавиш <Ctrl>+<+>, а процедуре ПроцентнаяСтавка — <Shift>+<Ctrl>+<->.>:

Application. OnKey "^{+}", "Амортизация"

Application. ОпКеу "+^ {RIGHT}", "ПроцентнаяСтавка"

Определяет процедуру, выполняемую при выборе команды Правка, Повторить (Edit, Repeat) и Правка, Отменить (Edit, Undo) соответственно.

Методы

Выполняемые действия

OnTime

Quit

Синтаксис:

OnRepeat (Text, Procedure)

OnUndo (Text, Procedure)

  • Text — строка, задающая текст команды Правка, Повторить (Edit, Repeat)

Procedure — имя подпрограммы, выполняемой при выборе команды Правка, Повторить (Edit, Repeat)

Назначает выполнение процедуры на определенное время. Синтаксис:

OnTime (EarliestTime, Procedure, LatestTime, Schedule)

  • EarliestTime — момент запуска процедуры
  • Procedure — имя процедуры
  • batestTime — если на момент запуска процедуры, Excel не может ее запустить в силу того, что выполняется другое действие, то параметр LatestTime определяет последнее время ее запуска. Если этот аргумент опущен, то Excel будет ждать до тех пор, пока не сможет выполнить эту процедуру
  • Schedule — допустимые значения: True (выполнение процедуры откладывается на сутки) и False (во всех остальных случаях)

В следующем примере демонстрируется, как запустить процедуру Очистка на выполнение через 15 секунд от текущего времени:

Application. OnTime Now +_ TimeValue ("00:00:15"), "Очистка" Закрывает приложение.

Например:

Application. Quit

События объекта Application

Событие | Когда возникает событие
NewWorkbook | При создании новой рабочей книги
WorkbookActivate | При активизации рабочей книги
WorkbookBeforeClose | Перед закрытием рабочей книги
WorkbookBeforePrint | Перед печатью рабочей книги
WorkbookBeforeSave | Перед сохранением рабочей книги
WorkbookNewSheet | При добавлении нового листа в рабочую книгу
WorkbookOpen | При открытии рабочей книги
WorkbookDeactivate | Когда активная книга теряет фокус

Объект Workbook и семейство Workbooks

В иерархии Excel объект workbook (рабочая книга) идет сразу после объекта Application и представляет файл рабочей книги. Рабочая книга хранится либо в файлах формата XLS (стандартная рабочая книга) или XLA (полностью откомпилированное приложение). Свойства и методы рабочей книги позволяют работать с файлами.

Свойства объекта Workbook и семейства Workbooks

Свойства

Выполняемые действия и допустимые значения

ActiveSheet

Возвращает активный лист книги. Например:

MsgBox "Имя активного листа " & ActiveSheet . Name — выводит в диалоговом окне имя активного рабочего листа

ActiveDialog

Возвращает активное диалоговое окно

ActiveChart

Возвращает активную диаграмму

Sheets

Возвращает семейство всех листов книги

Worksheets

Возвращает семейство всех рабочих листов книги

Charts

Возвращает семейство всех диаграмм книги (которые не внедрены в рабочие листы)

Count

Возвращает число объектов семейства workbooks

HasPassword

Допустимые значения: True (если у документа имеется пароль защиты), False (в противном случае)
WriteRe served Допустимые значения: True (если документ закрыт для записи), False (в противном случае)

Saved

Допустимые значения: True (если не производились изменения в документе со времени его последнего сохранения), False (в противном случае)

MailSystem

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

  • xlNoMailSystem (не установлена система электронной почты)
  • xlMAPi (установлена система Microsoft Mail)
  • xlPowerTalk (установлена система Apple PowerTalk Mail, на компьютерах Macintosh).

В следующем примере проверяется, инсталлирована ли электронная почта. Если электронная почта не установлена, то отображается соответствующее сообщение:

If Application. MailSystem <> xlMAPI Then

MsgBox "Microsoft Mail неинсталлирован"

End If

Методы объекта Workbook и семейства Workbooks

Методы

Выполняемые действия
Activate

Активизирует рабочую книгу так, что ее первый рабочий лист становится активным.

Например:

Workbook. Activate
Add Создает новый объект для семейства Workbooks.

Синтаксис:

Add (Template)

  • Template — задает шаблон, на основе которого создается новая рабочая книга. Допустимые значения: xlWBATChart, xlWBATExce14IntlMacroSheet, xlWBATExce14MacroSheet или xlWBATWorksheet.

Если аргумент Template опущен, то создается новая рабочая книга с количеством листов, заданных свойством

SheetsInNewWorkbook
Protect

Защищает рабочую книгу от внесения в нее изменений. Синтаксис:

Protect (Password, Structure, Windows)

  • Password — строка, используемая в качестве пароля для защиты книги
  • Structure — допустимые значения True (защищена структура книги, т. е. взаимное расположение листов) и False (не защищена)
  • windows — допустимые значения True (защищено окно книги) и False (не защищено)

В следующем примере устанавливается защита для активной рабочей книги:

ActiveWorkbook. Protect Password:= "ВинниПух"

Unprotect

Снятие защиты с рабочей книги.

Синтаксис:

Unprotect (Password)

  • Password — строка, используемая в качестве пароля для защиты листа

В следующем примере снимается защита с активной рабочей книги:

ActiveWorkbook. Unprotect Password := "ВинниПух "

Close

Закрытие рабочей книги

Open

Открытие существующей рабочей книги

OpenText

Открытие текстового файла, содержащего таблицу данных

Save

Сохранение рабочей книги

SaveAs

Сохранение рабочей книги в другом файле.

Синтаксис:

SaveAs (Filename)

  • Filename — строка, указывающая имя файла, в котором будет сохранена рабочая книга

В следующем примере активная рабочая книга сохраняется в файле с именем НоваяВерсия:

ActiveBook. SaveAs Filename := "НоваяВерсия"

SaveAsCopy

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

Синтаксис:

SaveAs (Filename, FileFormat)

  • Filename — строка, указывающая имя файла, в котором будет сохранена рабочая книга

В следующем примере активная рабочая книга сохраняется в файле с именем ЗапаснаяВерсия:

ActiveBook. SaveAsCopy Filename := "ЗапаснаяВерсия"

PrintPreview

Предварительный просмотр

Printout

Печать содержимого рабочей книги

SendMail

Отсылка почты используя встроенные средства Microsoft Mail (MAPI).

Синтаксис:

SendMail (Recipients, Subject, ReturnReceipt )

  • Recipients — строка или массив строк, перечисляющих получателей
  • Subject — строка, специфицирующая тему сообщения
    Optional Variant.
  • ReturnReceipt — допустимые значения True (требуется уведомление о получении сообщения) и False (в противном случае)

В следующем примере рабочая книга отсылается по электронной почте получателю Порфирию Заковыркину:

ThisWorkbook . SendMail recipients : = " Порфирий Заковыркин"

События объекта Workbook и семейства Workbooks

Событие | Когда возникает событие
BeforeClose | При закрытии рабочей книги
BeforePrint | Перед печатью рабочей книги
BeforeSave | Перед сохранением рабочей книги
Deactivate | Когда рабочая книга теряет фокус
NewSheet | При добавлении нового листа
Open | При открытии рабочей книги
SheetActivate | При активизации любого рабочего листа
Sheet Deactivate | Когда рабочий лист теряет фокус

Объект Worksheet и семейство Worksheets

В иерархии Excel объект worksheet идет сразу после объекта workbook и представляет рабочий лист.

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

Свойства объекта Worksheet и семейства Worksheets

Методы

Выполняемые действия
Name

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

за декабрь :

Worksheets (1) . Visible = "Итоги за декабрь"

Add

Создает новый рабочий лист.

Синтаксис:

Add (Before, After, Count, Type)

  • Before — указывает лист, перед которым будет размещен новый рабочий лист
  • After — указывает лист, после которого будет размещен новый рабочий. Если аргументы Before и After опущены, то новый лист размещается перед активным листом
  • Count — число добавляемых листов, по умолчанию имеет значение 1
  • Туре — указывает тип добавляемого листа. Допустимые значения: xlWorksheet (по умолчанию),

xlExce14MacroSheet и хlЕхсеl4 IntlMacroSheet.

Например:

ActiveWorkbook . Worksheets . Add

— вставляется новый лист перед активным листом активной рабочей книги

Delete

Удаляет рабочий лист. Например:

Worksheets (1) . Delete - удаляется первый рабочий лист из активной рабочей книги

Защищает рабочий лист от внесения в него изменений Синтаксис:

Protect (Password, DrawingObjects, Contents, Scenarios, User Inter faceOnly)

  • Password — строка, используемая в качестве пароля для защиты листа
  • DrawingObjects —допустимые значения: True (графические объекты защищены) и False (графические объекты не защищены). По умолчанию используется значение False
  • Contents — допустимые значения: True (ячейки защищены) и False (ячейки не защищены). По умолчанию используется значение True
  • scenarios —допустимые значения: True (сценарии защищены) и False (сценарии не защищены). По умолчанию используется значение True

  • Userlnterf aceOnly — допустимые значения: True (лист защищен от изменений со стороны пользователя, но не подпрограммы VBA) и False (лист защищен от изменений со стороны как пользователя, так и подпрограммы VBA). По умолчанию используется значение False

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

Active Sheet .Protect

Password: =" Секрет" ,

DrawingObjects :=True,

Contents :=True, Scenarios : =True

Unprotect

Снятие защиты с рабочего листа.

Синтаксис:

Unprotect (Password)

  • Password — строка, используемая в качестве пароля для защиты листа

В следующем примере снимается защита с активного рабочего листа:

ActiveSheet . Protect Password: ="Секрет"

Copy

Копирование рабочего листа в другое место рабочей книги.

Синтаксис:

Copy (Before, . After)

  • Before — рабочий лист книги, перед которым вставляется данный
  • After — рабочий лист, после которого вставляется данный

Одновременно допустимо использование только одного из аргументов.

В следующем примере Лист1 активной рабочей книги копируется после ЛистЗ той же рабочей книги:

Worksheets ( "Лист1") .Сору after :=Worksheets ("ЛистЗ"')

Move

Перемещение рабочего листа в другое место рабочей книги.

Синтаксис:

Move (Before, After)

  • Before — лист рабочей книги, перед которым вставляется данный
  • After — лист, после которого вставляется данный

Одновременно допустимо использование только одного из аргументов.

В примере Лист1 активной рабочей книги перемещается перед ЛистЗ той же рабочей книги:

Worksheets ( "Лист1" ) .Move Before : =Worksheets ("Лист3")

Методы объекта Worksheet и семейства Worksheet

Evaluate

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

В следующем примере в поле ввода первого появившегося ) диалогового окна вводится ссылка на ячейку, например A1, процедура считывает значение из этой ячейки и отображает его в диалоговом окне. После этого в поле ввода следующего диалогового окна надо ввести какое-нибудь арифметическое выражение, например sin(l) ^2. Процедура вычислит значение этого выражения и отобразит в диалоговом окне:

Sub Два Примера ДляEvaluate ( ) '

' Ввод адреса ячейки '

Ячейка = InputBox ( "Введите имя ячейки") '

' Считывание значения из ячейки с указанным адресом '

Значение = Evaluate (Ячейка) .Value '

' Вывод считанного значения в диалоговое окно

'

MsgBox CStr (Значение) '

' Ввод в диалоговое окно формулы, например, sin(1)^2 '

Функция = InputBox ( "Введите функцию" ) '

' Вычисление значения по введенной формуле '

Значение = Evaluate (Функция)

' Вывод найденного значения в диалоговом окне '

MsgBox CStr (Значение) End Sub

События объекта Worksheet

Событие | Когда возникает событие
BeforeClose | При закрытии рабочей книги
BeforePrint | Перед печатью рабочей книги
BeforeSave | Перед сохранением рабочей книги
Deactivate | Когда рабочая книга теряет фокус
NewSheet | При добавлении нового листа
Open | При открытии рабочей книги
SheetActivate | При активизации любого рабочего листа
Sheet Deactivate | Когда рабочий лист теряет фокус

Объекты Range и Selection

В иерархии Excel объект Range (диапазон) идет сразу после объекта worksheet. Объект Range является одним из ключевых объектов VBA. Объект Selection (выбор) возникает в VBA двояко — либо как результат работы метода Select, либо при вызове свойства selection. Тип получаемого объекта зависит от типа выделенного объекта. Чаще всего объект Selection принадлежит классу Range и при работе с ним можно использовать свойства и методы объекта Range. Интересной особенностью объектов Range и selection является то, что они не являются элементами никакого семейства объектов.

Адресация ячеек

При работе с объектом Range необходимо помнить, как в Excel ссылаются на ячейку рабочего листа. Имеются два способа ссылки на ячейки рабочего листа: относительная адресация (т. е. когда начало координат, задающее нумерацию строк и столбцов, связывается с объектом, вызвавшим Range) и абсолютная адресация.

Относительная адресация:

Формат А1 | Имя ячейки состоит из имени столбца (их 256 — А, В, ..., Z, АВ, ..., HZ, IA, ..., IV) и номера (1, ...., 16384).
 | Например, A1, C2
Формат R1C1 | Адресация задается индексом строки и индексом столбца. Например, R1C1, R2C3

Абсолютная адресация:

Формат А1 | Признаком абсолютной адресации является знак "$", предшествующий имени строки (абсолютной адресации на строку) или столбца (абсолютной адресации на столбец). Например, $А10, А$10 и $А$10 задают абсолютную адресацию на столбец А, строку 10 и ячейку А10 соответственно
Формат R1C1 | Указывается смещение по отношению к активной ячейке. Смещение приводится в квадратных скобках, причем знак указывает на направление смещения. Например, если активной ячейкой является касз, то R[i]C[-1] дает ссылку на ячейку кзс2

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

А1

Лист2!А1

[МояКнига.хls]Лист2!А1

В первой строке данного примера дана относительная ссылка на ячейку AI активного рабочего листа, во второй — на ячейку AI рабочего листа листа активной книги, а в третьей на ячейку AI рабочего листа лист2 книги моякнига-xls текущего рабочего каталога.

Задание групп строк и столбцов с помощью объекта Range

Если в диапазоне указываются только имена столбцов или строк, то объект Range задает диапазон, состоящий из указанных столбцов или строк. Например, Range ("А: с") задает диапазон, состоящий из столбцов А, в и с, а Range {"2: 2") - из второй строки. Другим способом работы со строками и столбцами являются методы ROWS (строки) и Columns (столбцы), возвращающие коллекции строк и столбцов. Например, столбцом А является columns (1), а второй строкой - ROWS (2).

Связь объекта Range и свойства Cells

Так как ячейка является частным случаем диапазона, состоящим только из единственной ячейки, объект Range также позволяет работать с ней. Объект cells (ячейки) — это альтернативный способ работы с ячейкой. Например, ячейка А2 как объект описывается Range ("A2") или cells (1,2). В свою очередь объект ceils, вкладываясь в Range, также позволяет записывать диапазон в альтернативном виде, который иногда удобен для работы, а именно,

Range ("А2:C3") И Range(Cells(1,2), Cells(3,3))

Определяют один и тот же диапазон.

Свойства и методы объекта Range

Объект Range позволяет сочетать гибкость VBA и мощь рабочего листа Excel. Более 400 встроенных функций рабочего листа существенно упрощают и делают более наглядным программирование на VBA.

Далее приводятся наиболее часто используемые свойства и методы объекта

Range.

Перечислим основные свойства объекта Range.

Value | Возвращает значение из ячейки или в ячейки диапазона. В данном примере переменной х присваивается значение из ячейки C1 : х = Range ("C1") .Value В следующем примере в диапазон AI : В2 введена 1 : Range ("A1:B2") .Value = 1
Name | Возвращает имя диапазона. В данном примере диапазону А1:В2 присваивается имя итоги: Range ( "Al :B2") .Name = "Итоги"
Count | Возвращает число объектов в наборе. В данном примере переменной х присваивается значение, равное числу строк диапазона AI : В2 : х = Range ( "Al :B2") .Rows . Count
CurrentRegion | Возвращает число строк текущего диапазона. Текущим является диапазон, ограниченный пустыми строками и столбцами и содержащий данный элемент. В следующем примере переменной у присваивается значение, равное числу строк в текущем диапазоне, содержащем ячейку AI : у = Range ( "Al" ). CurrentRegion. Rows . Count
WrapText | Позволяет переносить текст при вводе в диапазон. Допустимые значения True и False. В следующем примере в ячейку В2 вводится текст длинный текст и в этой ; ячейке устанавливается режим ввода текста с переносом: With Range ("B2") .Value = "Длинный текст" .WrapText = True End With

EntireColumn, EntireRow

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

ActiveCell . EntireRow. Clear ActiveCell .EntireColumn. Select

ColumnWidth, RowHeight

Возвращает ширину столбцов и высоту строк диапазона соответственно

Comment

Возвращает объект comment (примечание), который связан с левым верхним углом диапазона при отображении на экране. Объект comment является элементом семейства comments. Метод AddComment, примененный к диапазону, создает новое примечание. Среди методов объекта comment отметим только метод Text, который задает текст, выводимый в примечании. Синтаксис:

Text (Text, Start, Overwrite)

  • Text — строка, выводимая в качестве примечания П start — с какого символа вводится текст в уже существующее примечание. Если аргумент опущен, то из примечания удаляется весь ранее введенный текст П overwrite — допустимые значения: True (вводимый текст записывается поверх уже существующего) и False (вводимый текст вставляется в уже существующий) Среди свойств объекта Comment отметим только свойство visible, устанавливающее отображение примечания при активизации диапазона, имеющего определенное примечание. В качестве примера рассмотрим следующие инструкции, которые создают и отображают примечание ячейки вз, поясняющее запланированное событие (рис. 3.1):

With Range ("ВЗ")

.AddComment

.Text Text:= "Чрезвычайно важно!" & Chr(10) & "Про это никак нельзя забыть ! "

.Visible = True End With

Рис. 2.1. Пример отображения примечания на рабочем листе

Font

Возвращает объект Font (шрифт). Объект Font имеет следующие свойства:

  • Name — строка, указывающая имя шрифта, например "Arial Cyr"
  • FontStyle — СТИЛЬ, возможен Regular (обычный), Bold (ПОЛУЖИРНЫЙ), Italic(курсив), Bold italic (полужирный курсив)
  • size - размер
  • strikethrough — допустимы два значения: True (буквы имеют линию по центру, как будто они перечеркнуты) и False (не имеют линии по центру)
  • Superscript — допустимы два значения: True (текст используется как верхний индекс) и False (не используется как верхний индекс)
  • Subscript — допустимы два значения: True (текст используется как нижний индекс) и False (не используется как нижний индекс)
  • Underline-допустимыми являются значения:
    • xlNone (нет подчеркивания)
    • xlSingie (одинарное, по значению)

    • xlDoubie (двойное, по значению)
    • xlsingleAccounting (одинарное, по ячейке)
    • Accounting (двойное, но ячейке)

Например, в следующем примере устанавливается для диапазона AI : в2 полужирный шрифт, красного цвета и с высотой символов 1 4 :

With Range ("A1:B2").Font

.Size = 14

.FontStyle = Bold

.Colorlndex = 3

End With

Formula

Возвращает формулу в формате Al. Например, следующая инструкция вводит в ячейку с2 формулу =$А$4+$А$ю:

Range ("C2") . Formula = "=$А$4+$А$10"

FormulaArray 1

Возвращает формулу диапазона в формате А1. В отличие от обыкновенной формулы рабочего листа, формула диапазона вводится на рабочем листе не посредством нажатия на клавишу <Enter>, а с помощью комбинации клавиш <Ctrl>+<Shift>+<Enter>. Следующая инструкция вводит в диапазон Е!:ЕЗ формулу {=Sum(Al:A3*Bl:B3) }:

Range ( "El :E3") .FormulaArray = "=Sum(Al:A3*Bl:B3) "

FormulaHidden

Допустимые значения: True (формула спрятана, если рабочий лист или книга защищены) и False (в противном случае). Например, следующая инструкция скрывает формулы в столбце А: Columns ("A") . FormulaHidden = True

FormulaLocal

Возвращает неанглоязычные (местные) формулы в формате А1. Например, следующая инструкция вводит в ячейку В2 формулу =СУММ(С1:С4):

Range("B2"). FormulaLocal = "=СУММ (С1:С4) "

JormulaRlCl

Возвращает формулу в формате R1C1. Например,

Range ("Bl") . FormulaRlCl = "=SQRT (R3C2 ) "

FormulaRlCl Local

Возвращает неанглоязычные формулы в формате R1C1

Text

Возвращает содержание диапазона в текстовом формате

HorizontalAlignment

Горизонтальное выравнивание. Допустимые значения:

  • xlceneral (обычное выравнивание, зависящее от типа вводимых значений)
  • xlcenter (выравнивание по центру)
  • xlRight (выравнивание по правому краю)
  • xlLeft (выравнивание по левому краю)
  • xUustify (выравнивание по ширине)
  • xlCenterAcrossSelection (выравнивание по центру в выделенном диапазоне)
  • xlFill (выравнивание по ширине

Vertical Alignment

Вертикальное выравнивание. Допустимые значения:

  • xlBottom (выравнивание по нижнему краю),
  • xlcenter (выравнивание по центру),
  • xUustify (выравнивание по высоте),
  • xlTop (выравнивание по верхнему краю)

Orientation

Ориентация. Допускается либо угол поворота текста в градусах от —90° до 90°, либо одно из допустимых значений:

  • xlDownward (выравнивание по левому краю сверху вниз, соответствует углу —90°)
  • xlHorizontal(выравнивание по горизонтали, соответствует нулевому углу )
  • xlupward (выравнивание по правому краю снизу вверх, соответствует углу 90°)
  • xlvertical (выравнивание по вертикали, нет соответствия в градусах)

ShrinkToFit

Допустимые значения: True (автоматическое изменение шрифта так, чтобы текст помещался в ячейку) и False (в противном случае)

Ниже приведены наиболее часто используемые методы объекта Range.

Address

Возвращает адрес ячейки.

Синтаксис:

Address (rowAbsolute, coluimAbsolute, referenceStyle, external, relativeTo)

Аргументы:

  • RowAbsoiute — допустимы два значения True и False, если используется значение True или аргумент опущен, то возвращается абсолютная ссылка на строку
  • ColumnAbsoiute — допустимы два значения True и False, если используется значение True или аргумент опущен, то возвращается абсолютная ссылка на столбец
  • ref erenceStyle — допустимы два значения xlAl и

    xiR1c1, если используется значение X1A1 или аргумент опущен, то возвращается ссылка в виде формата А1 П external — допустимы два значения True и False, если используется значение False или аргумент опущен, то возвращается относительная ссылка

  • relativeTo — В случае, если rowAbsoiute и СolumnAbsoiute равны False, a referenceStyle X1R1C1, то данный аргумент определяет начальную ячейку диапазона, относительно которой производится адресация Следующий пример показывает различные результаты адресации.

    MsgBox Cells (1, 1). Address ()
'
' В диалоговом окне отображается адрес $А$1 MsgBox Cells (1, 1) .Address (rowAbsoiute:=False)
'

' В диалоговом окне отображается адрес $А1 '

MsgBox Cells (1, 1) .Address (ref erenceStyle :=x1R1C1) '
' В диалоговом окне отображается адрес R1C1 '

Clear, ClearComments , Clear Contents, ClearFormats

И

Метод clear очищает диапазон. В следующем примере очищается диапазон Al :G37 . Range ("A1:G37") .Clear

Методы ClearComments, ClearContents, ClearFormats и ClearNotes очищают В диапазоне

AutoFit

Автоматически настраивает ширину столбца и высоту строки

ClearNotes

комментарии, содержание, форматы и примечания соответственно.

Copy

Копирует диапазон в другой диапазон или в буфер обмена.

Синтаксис:

Copy (destination)

  • Аргумент destination определяет диапазон, куда копируется данный диапазон. Если аргумент destination опушен, то копирование происходит в буфер обмена. В данном примере диапазон AI : D4 рабочего листа Лист! копируется в диапазон Е5:Н8 листа лист2:

Worksheets ("Лист1" ) . Range ( "А1 : D4 " ) .Сору destination :=Worksheets ("Лист2") .Range ("E5")

Cut

Копирует диапазон с удалением в указанный диапазон или в буфер обмена,

Синтаксис:

Cut (destination)

  • Аргумент destination определяет диапазон, в который копируется данный диапазон. Если аргумент destination опущен, то диапазол копируется в буфер обмена. В данном примере диапазон AI : D4 рабочего листа лист! копируется с удалением в буфер обмена:

Worksheets ( "Лист1 " ) . Range ( "А1 : D4 " ) . Cut

Delete

Удаляет диапазон. В данном примере удаляется третья строка активной рабочей страницы:

Rows (3) .Delete

Columns, Rows

Возвращают соответственно семейства столбцов и строк, из которых состоит диапазон. В следующем примере переменным i и j присваиваются значения, равные количеству столбцов и строк в выделенном диапазоне соответственно:

i = Selection. Columns . Count j = Selection. Rows . Count

Insert

Вставка ячейки или диапазона ячеек. В следующем примере вставляется новая строка перед четвертой строкой рабочего листа Лист1:

Worksheets ( "Лист1" ) . Rows (4 ) .Insert

Offset

Возвращает диапазон, смещенный относительно данного на величины, специфицированные в аргументах.

Синтаксис:

Of fset (rowOffset, columnOf f set )

Аргументы:

  • rowOffset — целое число, указывающее сдвиг по строкам
  • columnOf f set — целое число, указывающее сдвиг по столбцам Например, в следующем примере активизируется ячейка, расположенная на три строки ниже и на два столбца левее относительно предыдущей активной ячейки:

ActiveCell.Offset (rowOf fset :=3, columnOf fset : =-2) .Activate

Select

Выделение диапазона

PasteSpecial

Специальная вставка из буфера обмена.

Синтаксис:

BasteSpecial (paste, operation, skipBlanks, transpose)

Аргументы:

  • Paste — определяет ту часть содержимого буфера обмена, которая должна быть вставлена в диапазон. Допустимые значения:
    • xlAll (все)
    • xl Formulas (формулы)
    • xlvaiues (значения)
    • xlFormats (форматы)
    • xlNotes (примечания)
    • xlAllExceptBorders (без рамки)
  • Operation — определяет операции.Допустимые значения:
    • xlNone (нет)
    • xlAdd (СЛОЖИТЬ)
    • xlSubtract (ВЫЧИСТЬ)
    • xlMultiply (УМНОЖИТЬ)
    • xlDivide (разделить)
  • SkipBlanks — допустимые значения: True (пустые ячейки при вставке не учитываются) и False (пустые ячейки учитываются)
  • Transpose — допустимые значения True (диапазон выводится транспонированным) и False (не транспонированным)

В приведенном ниже примере данные из диапазона C1:C5 рабочего листа лист1 вставляются в диапазон D1 : D5 того же листа, причем они не заменяют уже существующие данные в диапазоне D1:D5, а прибавляются к ним данные из диапазона C1 : С5 :

Worksheets ( "Лист1 " ) . Range ( "С1 : С5 " ) . Сору Worksheets ("Лист1") .Range ("D1: D5") . PasteSpecial operation : =xlAdd

Метод PasteSpecial программирует выполнение на рабочем листе команды Правка, Специальная вставка (Edit, Paste Special). Аргументы метода PasteSpecial соответствуют установкам диалогового окна Специальная вставка (Paste Special), отображаемого с помощью этой команды (рис. 3.2)

Рис. 2.2. Диалоговое окно Специальная вставка

AddComment

Добавляет примечание к диапазону.

Синтаксис:

AddComment (Text)

  • Text — строковое выражение добавляемое в качестве примечания В следующем примере создается примечание внимание ! ячейки AI активного рабочего листа:

Range ( "А! " ) . AddComment "Внимание!"


  • УРОК 5. ТЕМА: РЕШЕНИЕ УРАВНЕНИЯ, ЗАВИСЯЩЕГО ОТ ПАРАМЕТРА. ПОСТРОЕНИЕ ДИАГРАММЫ
    • ЦЕЛЬ УРОКА
    • ТЕОРИЯ
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 5.

Тема:Решение уравнения, зависящего от параметра.

Построение диаграммы

Цель урока

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

  1. Вводить формулы при помощи элемента управления RefEdit
  2. Находить методом Goaiseek корни уравнения, зависящего от параметра
  3. Устанавливать параметры метода Goaiseek
  4. Создавать профессию на рабочем листе при помощи метода Dataseries
  5. Программировать протаскивание маркера заполнения выделенного диапазона на рабочем листе при помощи метода AutoFill
  6. Строить диаграммы

Теория

В этом разделе решается уравнение

х3 - х - b = 0

при различных величинах параметра Ь, изменяющихся от начального до конечного значения с указанным шагом. При каждом конкретном значении параметра корень уравнения находится методом Goaiseek. Для нахождения корней уравнения при различных значениях параметра, эти значения вводятся в диапазон ячеек рабочего листа, формулы левых частей уравнений в другой диапазон, третий диапазон отводится под неизвестную. В диапазон с неизвестными вводятся начальные приближения корня, а потом последовательно перебирая соответствующие ячейки из этих трех диапазонов методом GoalSeek находятся соответствующие корни.

Практика

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

Рис. У5.1. Диалоговое окно Нелинейное уравнение с параметром

О решаемом уравнении предполагается, что оно преобразовано к виду, когда только левая часть зависит от неизвестной и параметра. Правая же часть -постоянна. При вводе левой части уравнения в поле ввода элемента управления RefEdit вместо переменной х надо давать ссылку на ячейку В2, а вместо параметра — А2. Кроме того, формула должна быть составлена по тем же правилам, по которым пишутся формулы рабочего листа. Например, для упомянутого выше уравнения в поле надо ввести:

=В2^3-В2-А2

либо эквивалентную формулу с абсолютными ссылками на ячейки.

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

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> - вычислить.

Нажатие кнопки вычислить запускает на выполнение процедуру

CommandButtonl_Click
  3. При выполнении щелчка в соответствующей ячейке в поле элемента управления Re f Edit вводится абсолютная ссылка на эту ячейку. При выделении ячейки с формулой и протаскивании ее маркера заполнения вниз вдоль столбца для получения корректного результата нужна не абсолютная, а относительная ссылка. С этой целью из строки с формулой, присвоенной строковой переменной Формула, удаляются все знаки $, тем самым превращая все абсолютные ссылки в относительные.
  4. Удаляются с рабочего листа ранее введенные данные и создаются заголовки полей отчета.
  5. Устанавливаются предельное число итераций и относительная погрешность метода Goal Seek.
  6. Методом DataSeries в диапазоне создается арифметическая профессия изменения значений параметра от начального до конечного значения с указанным шагом.
  7. Вводится начальное приближение в диапазон.
  8. Вводится в диапазон левая часть уравнения при различных значениях параметра.
  9. Последовательно для каждой ячейки, имеющей формулу с левой частью уравнения, методом GoalSeek, находится корень уравнения.
  10. Вызывается процедура ПостроениеГрафика для построения графика (рис. У5.2).

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

CommandButton2 _Click

11 . Закрывает диалоговое окно.

Процедура

ПостроениеГрафика

12. Строит график.

Рис. У5.2. Отчет, выводимый на рабочем листе программой решения уравнения с параметром

Private Sub CommandButtonl_Click()

' Процедура нахождения корней уравнения с параметром

Dim ПараметрНач As Double

Dim ПараметрКон As Double

Dim ПараметрШаг As Double

Dim НачПрибл As Double

Dim ПраваяЧасть As Double

Dim Формула As String

'

' ПараметрНач - начальное значение параметра

' ПараметрКон - конечное значение параметра

' ПараметрШаг - шаг изменения параметра

' НачПрибл - начальное приближение корня, общее для всех

' значений параметра

' ПраваяЧасть - правая часть уравнения

' Формула - левая часть уравнения. Уравнение записывается так,

' что неизвестная входит только в левую часть, а

' правая часть - постоянна

Dim i As Integer

Dim Длина As Integer

Dim n As Integer

'

' i, n, Длина - вспомогательные переменные

'

' Ввод исходных данных из диалогового окна

'

With UserForml

ПарамётрНач = CDbl(.TextBoxl.Text)

ПараметрКон = CDbl(.TextBox2.Text)

ПараметрШаг = CDbl(.TextBox3.Text)

НачПрибл = CDbl(.TextBox4.Text)

Формула = Trim(CStr(.RefEditl.Text))

ПраваяЧасть = CDbl(.TextBox5.Text)

End With

'

' Элемент управления RefEdit при вводе в него ссылок на ячейки

' щелчком в соответствующей ячейке возвращает абсолютные ссылки на

' эти ячейки.

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

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

' для получения корректного результата необходима не абсолютная, а

' относительная ссылка. Для преобразования абсолютной ссылки в

' относительную ниже в операторе цикла Do-Loop из строки с формулой,

' присвоенной строковой переменной Формула, удаляются все знаки

' абсолютной ссылки $

'

i = l Do

If Mid(Формула, i, 1) = "$" Then Длина = Len(Формула)

Формула = Left(Формула, i - 1) + Right(Формула, Длина - i)

Else

i = i + 1

End If

Loop While i <= Len(Формула)

'

' Очистка трех первых столбцов рабочего листа

'

Range("А:С").Clear

' Форматирование заголовка отчетной таблицы.

' Установка:

' ширины первых трех столбцов высоты первой строки

выравнивание

'

Range("A:A").ColumnWidth = 12

Range("В:В").ColumnWidth = 14

Range("С:С").ColumnWidth = 17

Range("Al:Cl").Select With Selection

.RowHeight = 37

.HorizontalAlignment = xlGeneral

.VerticalAlignment = xlTop

.WrapText = True

.Font.Bold = True

.Font.Size = 11

End With '

' Ввод заголовков трех первых столбцов рабочего листа

'

Range("Al").Value = "Параметр" Range("Bl").Value = "Переменная"

Range("Cl").Value = "Левая часть уравнения"

'

' Установка параметров метода Подбор параметра

With Application

.Maxlterations = 1000

.MaxChange = 0.0001 End With

'

' Ввод в столбец А значений параметра

Range("A2")-Value = ПараметрНач

Range("A2").Select

Selection.DataSeries Rowcol:=xlColurnns,

Type:=xlLinear, Step:=napaметpШaг, Stop:=napaметpKoн

'

' Определение числа заполненных строк

n = Range ("A2") .Current-Region.Rows .Count

'

' Ввод в диапазон столбца В начального приближения

Range(Cells(2, 2), Cells(n, 2)).Value = НачПрибл

'

' Ввод в диапазон столбца С левой части уравнения

'

Range("C2").Formula = Формула Range("C2").AutoFill

Destination:=Range(Cells(2, 3), Cells(n, 3)),

Type:=xlFillDefault

'

' Последовательное решение уравнений с помощью команды Подбор параметра

For i = 2 То n

Cells(i, 3).GoalSeek Goal:=ПраваяЧасть,

ChangingCell:=Cells(i, 2) Next i

' Вызов процедуры для построения графика

'

ПостроениеГрафика

'

End Sub

Private Sub CommandButton2_Click()

'

' Процедура закрытия диалогового окна

'

UserForml.Hide

End Sub

'

Private Sub UserForm_Initialize()

'

' Процедура активизации диалогового окна

' Клавише <Enter> назначена функция кнопки Вычислить.

' Клавише <Esc> назначена функция кнопки Отмена.

CommandButtonl.Default = True CommandButton2.Cancel = True

UserForml.Show

End Sub

'

Sub ПостроениеГрафика()

' Процедура построения графика

'

Dim n As Integer

' n - число строк диапазона, по которому строится график

Dim ДиапазонОсиY As Object

Dim ДиапазонОсиХ As Object

Dim ИмяДиаграммы As String

Dim Диапазону As String

Dim ДиапазонХ As String

Dim ИмяЛиста As String

n = ActiveSheet.Cells(1, 1).CurrentRegion.Rows.Count

'

ИмяЛиста = ActiveSheet.Name

' Удаление всех ранее построенных диаграмм с. рабочего листа

ActiveSheet.ChartObj ects.Delete

' Создание новой диаграммы и установка ее типа

Charts.Add

ActiveChart.ChartType = xlLineMarkers

'

' Определение диапазона, отводимого под значения функции

'

Диапазону = "В2:В" & LTrim(CStr(n)}

Set ДиапазонОсиУ = Sheets(ИмяЛиста).Range(Диапазону)

'

' Определение диапазона, отводимого под значения аргумента

ДиапазонХ = "А2:А" & LTrim(CStr(n))

Set ДиапазонОсиХ = Sheets(ИмяЛиста).Range(ДиапазонХ)

'

' Построение графика

'

ActiveChart.SetSourceData

Source:=ДиапазонОсиY,

PlotBy:=xlColumns

ActiveChart.SeriesCollection(l).XValues = ДиапазонОсиХ

ActiveChart.Location Where:=xlLocationAsObject, Name:=ИмяЛиста With

ActiveChart .HasTitle = True

.ChartTitle.Characters.Text = "Зависимость корня от параметра"

.Axes(xlCategory, xlPrimary).HasTitle = True ,

.Axes(xlCategory, xlPrimary)

.AxisTitle.Characters.Text = "Параметр"

.Axes(xlValue, xlPrimary).HasTitle = True

.Axes(xlValue, xlPrimary)

.AxisTitle.Characters.Text = "Корень"

End With

ActiveChart.HasLegend = False

ИмяДиаграммы = ActiveSheet.ChartObjects(1).Name

'

' Перемещение диаграммы и изменение ее размеров

'

ActiveSheet.Shapes(ИмяДиаграммы).ScaleHeight 1.17, msoFalse,

msoScaleFromBottomRight ActiveSheet.Shapes(ИмяДиаграммы).IncrementLeft 124.5

ActiveSheet.Shapes(ИмяДиаграммы).IncrementTop -25.5

'

End Sub

Процедура построениеграфика выглядит довольно громоздкой. При ее написании лучше всего воспользоваться MacroRecorder, который переведет производимые пользователем вручную действия по построению диаграммы на язык VBA. Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте диаграмму по следующему алгоритму:

  1. Нажмите кнопку Мастер диаграмм (Chart Wizard) панели инструментов Стандартная (Standard).
  2. В появившемся окне первого шага мастера диаграм_м на вкладке Стандартные (Standard Types) в списке Тип (Chart type) выберите График (Line), а в группе Вид (Chart sub-type) - четвертый элемент. Нажмите кнопку Далее > (Next >).
  3. В появившемся окне второго шага мастера диаграмм на вкладке Диапазон данных (Data Range) выберите переключатель Ряды в столбцах (Series in Columns) и в поле Диапазон (Data range) введите ссылку на диапазон =лист1! $в$2:$в$12, отводимый под значения функции, график которой строится. В поле Подписи оси X (Category (X) axis labels) вкладки Ряд (Series) введите ссылку на диапазон =лист1 !$д$2:$д$12, отводимый под значения аргумента. Нажмите кнопку Далее > (Next >).
  4. В появившемся окне третьего шага мастера диаграмм на вкладке Заголовки (Titles) в поле Название диаграммы (Chart title) введите зависимость корня от параметра, в поле Ось X (категорий) (Category (X) axis) - - Параметр, в поле Ось Y (значений) (Category (Y) axis) - корень. На вкладке Легенда (Legent) снимите флажок Добавить легенду (Show Legent). Нажмите кнопку Далее > (Next >).
  5. В появившемся окне четвертого шага мастера диаграмм в группе Поместить диаграмму на листе (Place chart) выберите переключатель имеющемся (As object in). Нажмите кнопку Готово (Finish).
  6. В построенной диаграмме ухватитесь за маркер изменения размера и увеличьте размер диаграммы. После этого, ухватившись за маркер переноса, переместите диаграмму в требуемое место на рабочем листе.

Перечисленные выше действия будут переведены MacroRecorder в следующий макрос.

Sub Макрос1() '

' Макрос1 Макрос

' Макрос запиг.лн 27.04.99 (Андрей)

Charts.Add

AcliveChart.ChartType = xlLineMarkers

ActiveChart.SetSourceData _

Source:=Sheets("Лист!").Range("B2:В12"),

PlotBy:=xlColumns

ActiveChart.SeriesCollection(1).XValues = "=Лист1!R2C1:R12C1"

ActiveChart.Location Where:=xlLocationAsObject, Name:="Лиcтl" With

ActiveChart

.HasTitle = False

.Axes(xlCategory, xlPrimary).HasTitle = False

.Axes(xlValue, xlPrimary).HasTitle = False

End With

With ActiveChart .HasTitle = True

.ChartTitle.Characters.Text = "Зависимость корня от параметра"

.Axes (xlCategory, xlPrimary)

.HasTitle = True

.Axes(xlCategory, xlPrimary)

.AxisTitle.Characters.Text = "Параметр"

.Axes(xlValue, xlPrimary)

.HasTitle = True

.Axes(xlValue, xlPrimary)

.AxisTitle.Characters.Text = "Корень"

End With

ActiveSheet.ChartObjects("Диагр. 14")

.Activate ActiveChart.ChartArea.Select

ActiveSheet.Shapes("Диагр. 14")

.ScaleHeight 1.17, msoFalse,

msoScaleFromBottomRight

ActiveSheet.Shapes("Диагр. 14")

.IncrementLeft 124.5

ActiveSheet.Shages("Диагр. 14")

.IncrementTop -25.5

End Sub

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

Процесс создания процедур для построения графиков с использованием MacroRecorder, особенно для избавления процедуры от привязки к конкретному диапазону данных, рабочему листу и имени диаграммы, кому-то может показаться излишне искусственным. Им советуем для построения графиков использовать метод chartwizard, дающий более быстрый путь к цели. Ниже приведены необходимые изменения в процедуре построение-Графика для метода chartwizard. Уже поверхностное сравнение старой и новой версий процедуры построениеГрафика показывает, что благодаря методу chartwizard процедура стала компактнее. Кроме того, теперь она использует меньше вспомогательных переменных, необходимых при построении диаграммы.

Sub ПостроениеГрафика()

' Процедура построения графика

'

Dim n As Integer

'

'

' n - число строк диапазона, по которому строится график

'

n = ActiveSheet.Cells(1, 1).CurrentRegion.Rows.Count

' Удаление всех ранее построенных диаграмм с рабочего листа

'

ActiveSheet.ChartObjects.Delete

' (195, 30, 200, 190) - координаты области, где строится диаграмма

'

ActiveSheet.ChartObjects.Add(195, 30, 200, 190).Select

'

' Построение диаграммы

ActiveChart.Chartwizard Source:= _

Range(Cells(2, 1), Cells(n, 2)),

Gallery:=xlLine, Format:=4, PlotBy:=xlColumns,

CategoryLabels:=l, SeriesLabels:=0, HasLegend:=False,

Title:="3ависимость корня от параметра",

CategoryTitle:="Параметр",

ValueTitle:="KopeHb", ExtraTitle:="" End Sub

Самостоятельное задание

Разработать приложение с диалоговым окном уравнение с двумя параметрами (рис. У5.3), которое позволит:

  1. Находить при всех возможных комбинациях значений параметров а и b
  2. х3 - ах2 + b = 0.
  3. Cтроить график, показывающий зависимость корня от значений параметров а и b

Рис. У5.3. Диалоговое окно Уравнение с двумя параметрами


  • УРОК 6. ТЕМА: УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
    • ЦЕЛЬ УРОКА
    • ТЕОРИЯ
    • ПРАКТИКА
      • Пример управления размером и перемещением элемента управления
      • Перемещение элемента управления при помощи операции drag-and-drop
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 6

Тема: Управление размером и перемещением элементов управления

Цель урока

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

  • Управлять размерами диалогового окна
  • Задавать последовательности элементов управления в виде массива объектов
  • Определять текущий объем вклада
  • Задавать параметры счетчика

Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно и при помощи метода drag-and-drop по поверхности диалогового окна.

Теория

В первый свой рабочий день в банке молодой программист Нестор Щукин получил задание от менеджера составить приложение, вычисляющее чистый текущий объем инвестиций от вкладов банка. Допустим, что с помощью этого приложения необходимо найти чистый текущий объем инвестиции 10 000 руб. при 7% годовой ставке, при которой банк получает годовые доходы 2 000 руб., 4 000 руб. и 7 000 руб. в последующие три года после вложения денег в инвестиционный проект.

Прежде чем описывать, с какими мыслями тялся за выполнение своего первого задания Нестор Щукин, поговорим немного о том, что же такое чистый текущий объем инвестиции. Предположим, что банк осуществляет некоторый инвестиционный проект, который через k1 год приносит прибыль или требует дополнительных капиталовложений в объеме Pk1денег, через k-i года приносит прибыль или требует дополнительных капиталовложений в объеме Pk денег и т. д., через kn лет приносит прибыль или требует

дополнительных капиталовложений в объеме /V денег. Тогда чистый текущий объем инвестиции при i% годовой ставке равен:

Pk1/(1+i)k1 + ... + Pkn(d+i)kn,

где Рkn , которые соответствуют прибыли, входят в формулу со знаком плюс, а те, которые соответствуют дополнительным инвестициям - со знаком минус.

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

Практика

Для решения задачи нахождения чистого текущего объема инвестиций и управления размером диалогового окна с помощью редактора пользовательских форм cоздадим диалоговое окно Чистый текущий объем инвестиций (рис. У6.1). Отметим, что данное приложении предназначено для расчета до шести финансовых операций (инвестиций и прибыли).

При инициализации диалогового окна его отображение на экране имеет меньшую ширину (в нем только поля ввода для двух выплат), хотя при его конструировании в него помещается поля ввода для всех шести выплат. При помощи счетчика Число операций можно управлять шириной диалогового окна так, чтобы было достаточно места для размещения в нем того количества полей ввода данных, которое задается счетчиком (рис. У6.2).

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

Рис. У6.1. Диалоговое окно Чистый текущий объем инвестиций

Рис. У6.2. Диалоговое окно

Чистый текущий объем инвестиций со значением счетчика

Число операций равным 4

UserForm_Initialize

  1. Активизирует диалоговое окно.
  2. Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> — вычислить.
  3. Устанавливает максимальное и минимальное значения счетчика, а также его значение при инициализации диалогового окна.

Нажатие кнопки вычислить запускает на выполнение процедуры

CoramandButtonl_Click
  4. Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции. 5. Проверяет корректность ввода данных. 6. Вычисляет чистый текущий объем инвестиций.

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

CoramandButton2_Click

Закрывает диалоговое окно.

SpinButtonl Change

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

'

' Переменная уровня модуля

'

Dim n As Integer

'

' n - число операций

'

Private Sub CommandButtonl_Click()

'

' Процедура расчета чистого текущего объема инвестиций

'

Dim Операции(1 То 6) As Double

Dim Годы(1 То 6) As Byte

Dim Процент As Double

Dim i As Integer

Dim ТекущийОбъем As Double

' Операции - массив инвестиций и прибылей

' Годы - массив лет, когда совершались операции

' Процент - годовая процентная ставка

' ТекущийОбъем - объем чистого начального.вклада

' i - вспомогательная переменная

'

Dim ПолеВвода(1 То 6, 1 To 2) As Object

'

' Вспомогательный массив объектов, который будет

' использоваться при вводе данных из полей ввода

' Задание компонент массива объектов

'

Set ПолеВвода(1, 1) = TextBoxl

Set ПолеВвода (2, 1) = TextBox2

Set ПолеВвода(3, 1) = TextBox3

Set ПолеВвода(4, 1) = TextBox4

Set ПолеВвода(5, 1) = TextBox5

Set ПолеВвода(6, 1) = TextBox6

Set ПолеВвода(1, 2) = TextBoxl0

Set ПолеВвода(2, 2),= TextBoxl1

Set ПолеВвода(3, 2) '= TextBoxl2

Set ПолеВвода(4, 2) = TextBoxl3

Set ПолеВвода(5, 2) = TextBoxl4

Set ПолеВвода(6, 2) = TextBoxl5

'

' Проверка того, являются ли введенные в диалоговом окне значения числами

'

For i = 1 То n

If IsNumeric(ПолеВвода(i, 1).Text) = False Then

MsgBox "Ошибка в размере прибыли или инвестиции",

vblnformation, "Расчет инвестиции" ПолеВвода(i, l).SetFocus

Exit Sub

End If

Next i

For i = 1 To n

If IsNumeric(ПолеВвода(i, 2).Text) = False Then

MsgBox "Ошибка в годе", vblnformation, "Расчет инвестиции" ПолеВвода(i, 2).SetFocus Exit Sub End If Next i

If isNumeric(TextBoxS.Text) = False Then

MsgBox "Ошибка в процентной ставке", vblnformation,

"Расчет инвестиции" TextBoxS.SetFocus

Exit Sub

End If

' Ввод в массивы Операции и Годы данных из диалогового окна

'

For i = 1 То n

Операции(i) = CDbl(ПолеВвода(i, l).Text)

Годы(1) = CByte(ПолеВвода(i, 2).Text) Next i

'

' Ввод процентной ставки '

Процент = CDbl(TextBoxS.Text) / 100

' Расчет чистого текущего объема инвестиции

ТекущийОбъем = 0 For i = 1 То п

ТекущийОбъем = ТекущийОбъем + Операции(i) / (1 + Процент) ^ Годы(1)

Next i

' Вывод в диалоговом окне величины чистого текущего объема инвестиций

'

ТекущийОбъем = Format(ТекущийОбъем, "Fixed")

TextBox9.Text = CStr(ТекущийОбъем)

End Sub

Private Sub CommandButton2_Click()

'

' Процедура закрывает диалоговое окно

'

UserForml.Hide End Sub

'

Private Sub SpinButtonl_Change()

'

' Процедура изменения размера диалогового окна

' в зависимости от введенного числа операций

' Вывод числа операций со счетчика в поле ввода

'

TextBoxV.Text = CStr(SpinButtonl.Value)

'

' Присвоение значения переменной n (числа операций) из поля ввода

n = CInt(TextBox7.Text)

'

' Изменение размера диалогового окна

'

UserForml.Width = 120 + (n - 1) * 50

'

End Sub

'

Private Sub UserForm_Initialize()

'

' Процедура активизации диалогового окна Чистый текущий объем инвестиций

'

' Устанавливается первоначальное значение счетчика

SpinButtonl.Value = 2

' Запрет не программного ввода данных в поля Процентная ставка

' и Чистый текущий объем инвестиций

'

TextBox7.Enabled = False TextBox9.Enabled = False

' Назначение клавише <Enter> функции кнопки Вычислить

'

CommandButtonl.Default = True

' Назначение функции клавиши <Esc> кнопке Отмена

'

CommandButton2.Cancel = True

' Установка максимального и минимального

' допустимого значений счетчика, а также текста всплывающей подсказки

With SpinButton1

.Max = 6

.Min = 1

.ControlTipText = "Ввод числа операций"

End With

End Sub

Пример управления размером и перемещением элемента управления

Рассмотрим простой пример диалогового окна похождения колобка (рис. У6.3), в котором при нажатии на кнопку катись! Колобок перемещается по поверхности формы, а при нажатии на кнопку Расти \ он начинает увеличиваться в размерах. На рис. У6.4 показан вид Колобка после нескольких нажатий на кнопки катись! и Расти!. Приведенная ниже программа позволяет реализовать описанные выше действия Колобка.

Рис. У6.3. Диалоговое окно Похождения Колобка

Рис. У6.4. Вид Колобка после нескольких движений

Private Sub CommandButtonl_Click()

'

' Передвижение Колобка по поверхности формы

'

If Imagel.Top > 0 And Imagel.Left > 0 Then

Imagel.Move Imagel.Left - 5, Imagel.Top - 6

Else

Imagel.Visible = False

End If

End Sub

'

Private Sub CommandButton2_Click()

'

' Изменение размера Колобка

'

Imagel.Height = Imagel.Height + 3 Imagel. Width = Imagel.Width + 3

End Sub

Private Sub UserForm_Initialize()

'

' Инициализация диалогового окна Похождения Колобка

'

With Imagel

'

' Изображение колобка хранится в файле Dot.bmp

.Picture = LoadPicture("Dot.bmp")

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeZoom

.BorderStyle = fmBorderStyleNone

.Visible = True End With End Sub

Перемещение элемента управления при помощи операции drag-and-drop

Рассмотрим диалоговое окно новые похождения колобка (рис. У6.5), с которым связана ниже приведенная программа, дающая два простых примера программирования операций drag-and-drop.

Рис. У6.5. Диалоговое окно Новые похождения Колобка

  1. Если расположить указатель мыши на Колобке и нажать правую кнопку становится печальным Если далее перемещать указатель мыши при нажатой правой кнопке по поверхности диалогового окна, то колобок будет передвигаться вслед за указателем мыши. Настроение колобка запрограммировано в процедурах веселыйКолобок и печальныйколобок. Изменение настроения колобка при нажатии и отпускании правой клавиши мыши запрограммировано в процедурах Image1_MouseDown и Image1_MouseUp, а перемещение — в Imagel_MouseMove.
  2. Если расположить указатель мыши на надписи колобок и переместить указатель мыши при нажатой правой кнопке в область второй надписи, обведенной рамкой, а там уже отпустить правую клавишу мыши, то во вторую надпись будет скопирован текст колобок. Процедура Labeli_MouseMove копирует заголовок первой надписи в объект Dataobject, играющий роль буфера обмена, процедура Label2_BeforeDragOver контролирует операции drag-and-drop во время перемещения указателя мыши, a Label2_BeforeDropOrPaste в момент отпускания правой кнопки мыши.

'

' Определение переменной уровня модуля

Dim Kono6oкDataObject As DataObject

'

Private Sub imagel_MouseDown(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

'ПечальныйКолобок

End If

End Sub

Private Sub Imagel_MouseUp(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then ВеселыйКолобок

End If

End Sub

Private Sub Imagel_MouseMove(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

IfX^2+Y^2 = 0 Then A = 0 В = 0

Else

A = X / Sqr(X л 2 + Y л 2) В = Y / SqrtX л 2 + Y л 2)

End if With Imagel

.Top = Imagel.Top + В

.Left = Imagel.Left + A

End With

End If

End Sub

'

Private Sub Labell_MouseMove(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

Set КoлoбoкDataObject = New DataObject

Dim ТипПеремещения As Integer

Kono6oKDataObject.SetText Labell.Caption

ТипПеремещения = КoлoбoкDataObject.StartDrag

End If

End Sub

Private Sub Label2_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean,

ByVal Data As MSForms.DataObject,

ByVal X As Single, ByVal Y As Single,

ByVal DragState As Long,

ByVal Effect As MSForms.ReturnEffeet,

ByVal Shift As Integer)

Cancel = True

Effect = fmDropEffectCopy

End Sub

Private Sub Label2_BeforeDropOrPaste(ByVal Cancel

As MSForms.ReturnBoolean,

ByVal Action As Long,

ByVal Data As MSForms.DataObject,

ByVal X As Single,

ByVal Y As Single,

ByVal Effect As MSForms.ReturnEffeet,

ByVal Shift As Integer)

Cancel = True

Effect = fmDropEffectCopy

Label2. Caption = KолoбoкDataObject .GetText

End Sub

Private Sub UserForm_Initialize()

'

Labell.BorderStyle = fmBorderStyleSingle

Label2.BorderStyle = fmBorderStyleSingle

With Imagel

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeZoom

.BorderStyle = fmBorderStyleNone End With

'ВеселыйКолобок

End Sub

Sub ВесельйКолобок()

Imagel.Picture = LoadPicture("Dot_a.bmp")

End Sub

'

Sub ПечальныйКолобок()

Image1.. Picture = LoadPicture ("Dotl_a.bmp"

) End Sub

Самостоятельное задание

Разработать приложение с диалоговым окном сумма квадратов (рис. У6.6), которое позволит:

  1. При помощи счетчиков управлять шириной и высотой диалогового окна.
  2. Вычислять сумму квадратов элементов, введенных в поля ввода данных.

Рис. У6.6. Диалоговое окно Сумма квадратов


  • УРОК 7. ТЕМА: ЗАПОЛНЕНИЕ БАЗЫ ДАННЫХ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 7.

Тема: Заполнение базы данных

Цель урока

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

  • Последовательное заполнение плоской базы данных
  • Программирование примечаний
  • Программирование текстовых полей на рабочем листе
  • Использование переключателя и флажков
  • Создание пользовательского заголовка окна приложения
  • Как на рабочем листе программно закрепить область

Практика

Для заполнения базы данных на рабочем листе с помощью редактора пользовательских форм создадим диалоговое окно Регистрация туристов фирмы "Эх, прокачу!" (рис. У7.1).

Рис. У7.1. Диалоговое окно Регистрация туристов фирмы "Эх, прокачу!"

Рис. У7.2. База данных о туристах на рабочем листе

Рис. У7.3. Пояснительное текстовое поле, появляющееся при выборе переключателя О программе

При инициализации диалогового окна программа проверяет, есть ли заголовки у полей создаваемой базы данных о регистрации туристов. Если этих заголовков нет, то программа автоматически создает их, снабжая примечаниями, имеющими пояснительный текст о содержании полей (рис. У7.2). Выбор переключателя о программе приведет к отображению на экране текстового поля с пояснениями к данной программе. Снятие этого флажка удаляет данное поле (рис. У7.3). Обратите внимание, что у окна приложения пользовательское имя Регистрация. База данных туристов.

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Назначает клавише <Esc> функцию кнопки Отмена, а Клавише <Enter> - Вычислить.
  3. Назначает кнопкам вычислить, отмена и переключателю о программе всплывающие подсказки.
  4. Закрепляет первую строку так, чтобы она всегда отображалась на экране.
  5. Создает заголовки полей базы данных, если они еще не были созданы.
  6. Устанавливает начальное значение переключателя 0 программе.
  7. Заполняет раскрывающийся список.
  8. Устанавливает текст заголовка окна приложения.

Нажатие кнопки вычислить запускает на выполнение процедуру

CommandButton1_Click
  1. Определяет номер первой пустой строки в базе данных о регистрации туристов, куда будет введена новая запись.
  2. Считывает данные из диалогового окна.
  3. Вводит их в первую пустую строку.

Нажатие кнопки Отмена запускает на выполнение процедуру

CommandButton2_Click

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

SpinButtonl_Change

Вводит значение в поле продолжительность тура.

ToggleButtonl Click | Отображает текстовое поле в выбранном состоянии и удаляет его — в снятом состоянии.
ЗаголовокРабочегоЛиста | Создает заголовки полей базы данных о регистрации туристов. Эти заголовки отображаются с примечаниями.

Private Sub CommandButtonl_Click()

' Процедура считывания информации из диалогового окна

' и записи ее в базу данных на рабочем листе

'

'

' Смысл переменных однозначно определен их названиями

'

Dim Фамилия As String * 20

Dim Имя As String * 20

Dim Пол As String * 3

Dim ВыбранныйТур As String * 20

Dim Оплачено As String * 3

Dim Фото As String * 3

Dim Паспорт As String * 3

Dim Срок As String * 3

Dim НомерСтроки As Integer '

' НомерСтроки - номер первой пустой строки рабочего листа

'

НомерСтроки = Application.CountA(ActiveSheet.Columns(1)) + 1

'

' Считывание информации из диалогового окна в переменные

'

With UserForml

Фамилия = .TextBoxl.Text

Имя = .TextBox2.Text

Срок = .TextBox3.Text

If .OptionButtonl.Value = True Then

Пол = "Муж"

Else

Пол = "Жен"

End If

If .CheckBoxl.Value = True Then Оплачено = "Да"

Else

Оплачено = "Нет"

End If

If .CheckBox2.Value = True Then

Фото = "Да"

Else

Фото = "Нет"

End If

If .CheckBoxS.Value = True Then

Паспорт = "Да"

Else

Паспорт = "Нет"

End If

ВыбранныйТур = .ComboBoxl.List(.ComboBoxl.Listlndex, 0)

End With

'

' Ввод данных в строку с номером НомерСтроки рабочего листа

'

With ActiveSheet

.Cells(НомерСтроки, 1).Value = Фамилия

.Cells(НомерСтроки, 2).Value = Имя

.Cells(НомерСтроки, 3).Value = Пол

.Cells(НомерСтроки, 4).Value = ВыбранныйТур

.Cells(НомерСтроки, 5).Value = Оплачено

.Cells(НдмерСтроки, 6).Value = Фото

.Cells(НомерСтроки, 7).Value = Паспорт

.Cells(НомерСтроки, 8).Value = Срок

End With

End Sub

Private Sub CommandButton2_Click()

' Процедура закрытия диалогового окна

'

' Установка заголовка окна приложения по умолчанию

'

UserForm1.Hide Application.Caption = Empty

ActiveSheet.DrawingObjects.Delete

End Sub

'

Private Sub SpinButtonl_Change()

'

' Процедура ввода значения счетчика в поле ввода

With UserForml

.TextBox3.Text = CStr(.SpinButtonl.Value) End With End Sub

Private Sub TextBox3_Change()

'

' Процедура установки значения счетчика из поля ввода

'

With UserForml

.SpinButtonl.Value = CInt(.TextBoxS.Text)

End With

End Sub

Private Sub ToggleButtonl_Click()

' Процедура отображения или удаления поля с текстом

'

If ToggleButtonl.Value = True Then

ActiveSheet.DrawingObjects.Delete

ActiveSheet.Shapes.

AddTextbox(msoTextOrientationHorizontal,

11.25, 44.25, 106.5, 96#)

.Select Selection.Characters.Text = "" With Selection.Font

.Name = "Arial Cyr"

.FontStyle = "обычный"

.Size = 10

.Strikethrough = False

.Superscript = False

.Subscript = False

.OutlineFont = False

.Shadow = False

.Underline = xlUnderlineStyleNone

.Colorlndex = xlAutomatic End With

Selection.ShapeRange.Fill.ForeColor.SchemeColor = 13

Selection.ShapeRange.Fill.Visible = msoTrue

Selection.ShapeRange.Fill.Solid Selection.Characters.Text = _

"Программа составлена " & Chr(10) &

"Андреем Гарнаевым для регистрации " & Chr(10) &_

"клиентов" & Chr(10) & "туристической " & Chr(10) & "фирмы" With

Selection.Characters(Start:=1, Length:=86).Font

.Name = "Arial Cyr"

.FontStyle = "обычный"

.Size = 10

.Strikethrough = False

.Superscript = False

.Subscript = False

.OutlineFont = False

.Shadow = False

.Underline = xlUnderlineStyleNone

.Colorlndex = xlAutomatic

End With

End If

If ToggleButtonl.Value = False Then

ActiveSheet.DrawingObjects.Delete

End If

End Sub

'

Private Sub UserForm_Initialize()

'

' Процедура вызова диалогового окна

' и задание элементов раскрывающегося списка

'

ЗаголовокРабочегоЛиста

'

' Задание пользовательского заголовка окна приложения

Application.Caption = "Регистрация. База данных туристов"

'

' Закрытие строки формул окна Excel

Application.DisplayFormulaBar = False

'

' Задание элементов раскрывающегося списка

'

With CommandButtonl

.Default = True

.ControlTipText = "Ввод данных в базу данных"

End With

With CommandButton2

.Cancel = True

.ControlTipText = "Кнопка отмены"

End With

OptionButtonl.Value = True

With ToggleButtonl

.Value = False

.ControlTipText = "Информация о программе"

End With

With ComboBoxl

.List = Array("Лондон", "Париж", "Берлин")

.Listlndex = 0 End With

'

' Активизация диалогового окна

'

UserForml.Show

'

End Sub

'

Sub ЗаголовокРабочегоЛиста()

'

' Процедура создания заголовков полей базы данных

'

' Если заголовки существуют, то досрочный выход из процедуры

'

If Range("Al").Value = "Фамилия" Then

Range("A2").Select

Exit Sub

End If

' Если заголовки не существуют, то создаются заголовки полей

'

ActiveSheet.Cells.Clear

Range("Al:HI").Value = Array("Фамилия", "Имя", "Пол",

"Выбранный Тур", "Оплачено", "Фото", "Паспорт", "Срок")

Range("A:A").ColumnWidth =12 Range("D:D").ColumnWidth = 14.4

'

' Закрепляется первая строка с тем, чтобы она всегда

' отображалась на экране '

Range("2:2").Select

ActiveWindow.FreezePanes = True

Range("A2").Select

'

' К каждому заголовку поля базы данных

'

Range("Al").AddComment

Range("Al").Comment.Visible = False

Range("Al").Comment.Text Text:="Фамилия клиента"

Range("Bl").AddComment

Range("Bl").Comment.Visible = False

Range("Bl").Comment.Text Text:="Имя клиента"

Range("Cl").AddComment

Range("Cl").Comment.Visible = False

Range("Cl").Comment.Text Text:="Пол клиента"

Range("Dl").AddCorament

Range("Dl").Comment.Visible = False

Range("Dl").Comment.Text Text:="Направление" & Chr(10) &

"выбранного тура" Range("El")

.AddComment Range("El")

.Comment.Visible = False Range("El")

.Comment.Text Text:="Путевка оплачена?" & Chr(10) &

"(Да/Нет)"

Range("Fl").AddComment Range("Fl").Comment.Visible = False

Range("Fl").Comment.Text Text:="OoTo сданы" & Chr(lO) &

"(Да/Нет) "

Range("Gl").AddComment Range("Gl").Comment.Visible = False

Range("Gl").Comment.Text Text:="Наличие паспорта" & Chr(10) &

"(Да/Нет)"

Range("HI").AddComment Range("HI").Comment.Visible = False

Range("HI").Comment.Text Text^"Продолжительность" & Chr(10) &

"поездки"

End Sub

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

НомерСтроки = Application.CountA(ActiveSheet.Columns(1)) + 1,

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

Процедура заголовокрабочегоЛиста выглядит немножко устрашающе. При ее написании лучше всего воспользоваться MacroRecorder, который переведет производимые действия по созданию примечаний пользователем вручную на язык VBA. Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте примечания по следующему алгоритму. Кроме того, для того чтобы разобраться, как программируется закрепление области на рабочем листе, в этот алгоритм входит также и закрепление первой строки рабочего листа.

  1. Щелкните кнопку заголовка второй строки. Вторая строка выделится. Выберите команду Окно, Закрепить области (Window, Freeze Panes).
  2. Выделите ячейку A1 и нажмите кнопку Надпись (Text box) панели инструментов Рисование (Drawing). В появившееся текстовое поле введите текст Фамилия клиента.
  3. Выделите ячейку BI и нажмите кнопку Надпись (Text Box) панели инструментов Рисование (Drawing). В появившееся текстовое поле введите текст имя клиента и т. д. последовательно для ячеек от С1 до H1 .

Перечисленные выше действия будут переведены MacroRecorder в следующий макрос.

Sub Макрос1()

'

' Макрос1 Макрос

' Макрос записан 28.04.99 (Андрей)

'

Range("2:2").Select

ActiveWindow.FreezePanes = True

Range("Al").AddComment

Range("A1"}.Comment.Visible = False

Range ("Al"). Comment.Text Тех^="Фамилия клиента"

Range("Bl").AddComment

Range("Bl").Comment.Visible = False

Range("Bl").Comment.Text Text:="Имя клиента"

Range("Cl").AddComment

Range("Cl").Comment.Visible = False

Range("Cl").Comment.Text Text:="Пол клиента"

Range("Dl").AddComment

Range("Dl").Comment.Visible = False

Range("Dl").Comment.Text Text:="Направление" & Chr(10) &

"выбранного тура" Range("El").AddComment

Range("El").Comment.Visible = False

Range("El").Comment.Text Text:="Путевка оплачена?" & Chr(10) &

"(Да/Нет)"

Range("Fl").AddComnent

Range("Fl").Comment.Visible = False

Range("Fl").Comment.Text Text:="Фото сданы" & Chr(10) &

"(Да/Нет)"

Range("Gl").AddComment Range("Gl").Comment.Visible = False

Range("Gl").Comment.Text Text:="Наличие паспорта" & Chr(10) &

" (Да/Нет) "

Range("H1").AddComment Range("H1").Comment.Visible = False

Range("H1").Comment.Text Text:="Продолжительность" & Chr(10) &

"поездки"

End Sub

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

Аналогично, при написании фрагмента программы, связанного с созданием текстового поля, лучше всего воспользоваться MacroRecorder, который переведет производимые пользователем вручную действия по созданию текстового поля на язык VBA. Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте текстовое поле по алгоритму:

  1. Нажмите кнопку Надпись (Text box) панели Рисование (Drawing) и создайте на рабочем листе текстовое поле.
  2. Наберите в текстовом поле следующий текст:

    Программа составлена Андреем Гарнаевым для регистрации клиентов туристической фирмы.

  3. Выделите текстовое поле и смените цвет его заливки на желтый, нажав кнопку Цвет заливки (Fill Color) панели инструментов Рисование (Drawing).

Перечисленные выше действия будут переведены MacroRecorder в следующий макрос.

Sub Макрос4()

'

' Макрос4 Макрос

' Макрос записан 30.04.99 (Андрей)

'

'

ActiveSheet.Shapes.

AddTextbox(msoTextOrientationHorizontal, 9.75, 45#, _

108.75, 96#).Select

Selection.Characters.Text = _

"Программа составлена " & Chr(10) &

"Андреем Гарнаевым для регистрации " & Chr(10)

& "клиентов" & Chr(10) &

"туристической " & Chr(10) & "фирмы" With

Selection.Characters(Start:=1, Length:=86).Font

.Name = "Arial Cyr"

.FontStyle = "обычный"

.Size = 10

.Strikethrough = False

.Superscript = False

.Subscript = False

.OutlineFont = False

.Shadow = False

.Underline = xlUnderlineStyleNone,

.Colorlndex = xlAutomatic

End With

Selection.ShapeRange.Fill.ForeColor.SchemeColor = 13

Selection.ShapeRange.Fill.Visible = msoTrue Selection.ShapeRange.Fill.Solid

End Sub

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

Самостоятельное задание

Разработать приложение с диалоговым окном регистрация клиентов отеля "хромая кобыла" (рис. У7.4), в котором:

  • Счетчик управляет вводом продолжительности проживания
  • В раскрывающемся списке выводятся три типа номеров: одноместный, Двухместный, Люкс, стоимость проживания в которых равна 150, 100 и 250 руб. в сутки
  • Если постоялец заказывает завтраки в номер, то суточная оплата возрастает на 15 руб.
  • При нажатии на кнопку ок в поле Стоимость проживания выводится суммарная стоимость проживания клиента, и все данные из диалогового окна должны вводится в базу данных, создаваемую на рабочем листе

Рис. У7.4. Диалоговое окно Регистрация клиентов отеля "Хромая кобыла"


  • УРОК 8. ТЕМА: ПОСТРОЕНИЕ ПОВЕРХНОСТИ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 8.

Тема: Построение поверхности

Цель урока

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

  • Табулируются функции, зависящие от двух аргументов
  • Осуществляется программная проверка правильности ввода формулы в ячейку рабочего листа
  • Производится преобразование формулы с аргументами х и у в формулу рабочего листа
  • Выполняется программное построение поверхности
  • Записывается диаграмма в графический файл
  • Считывается графический файл в элемент управления image
  • Управлять углом зрения на поверхность
  • Управлять углом поворота поверхности вокруг оси z

Практика

В данном приложении строится поверхность по введенным в диалоговое окно построение поверхности (рис. У8.1) начальным, конечным значениям аргументов и их шагах изменения. Уравнение поверхности также вводится в программу из диалогового окна. Уравнение должно быть составлено в соответствии с правилами, по которым строятся функции рабочего листа, но в качестве аргументов в нем следует использовать х и у вместо ссылок на ячейки. Программа сама переведет эти аргументы в ссылки на ячейки. После табуляции введенной функции программой и построения поверхности на рабочем листе (рис. У8.2), эта поверхность также отображается в объекте управления image, расположенном в диалоговом окне построение поверхности (рис. У8.3). Управляя полосами прокрутки можно изменить ориентацию поверхности на рабочем листе.

Рис. У8.1. Диалоговое окно Построение поверхности

Рис. У8.2. Результат построения поверхности на рабочем листе

Рис. У8.3. Диалоговое окно Построение поверхности с рисунком построенной поверхности

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

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Назначает клавише <Esc> функцию кнопки Отмена, а клавише <Enter> — Построение.
  3. Устанавливает максимальные и минимальные допустимые значения для полос прокрутки, а также их первоначальные значения.
  4. Устанавливает, чтобы отображаемая картинка поверхности в диалоговом окне помещалась целиком и пропорционально в пределах элемента управления Image, а также чтобы левый верхний угол рисунка совпадал с левым верхним углом элемента управления Image.

Нажатие кнопки

Построение запускает на выполнение

процедуру

CornmandButton1_Click
  1. Проверяет, являются ли вводимые данные числами. В случае ошибки отображается соответствующее сообщение.
  2. Проверяет согласованность вводимых данных. В случае ошибки отображается соответствующее сообщение (рис. У8.4).
  3. Преобразует формулу, введенную в поле Уравнение поверхности, в формулу рабочего листа.
  4. Проверяет корректность введенной формулы. В случае ошибки отображается соответствующее сообщение (рис. У8.5).
  5. Используя метод DataSeriea, начиная с ячейки А2 строит вниз по столбцу арифметическую прогрессию, являющуюся результатом табуляции аргумента х уравнения поверхности с указанными шагами.
  6. Используя метод Dataseries, начиная с ячейки в 1 строит вправо по строке арифметическую прогрессию, являющуюся результатом табуляции аргумента у уравнения поверхности с указанными шагами.
  7. Заносит в ячейку В2 уравнение поверхности, введенное пользователем в диалоговом окне. Для корректности последующего табулирования значений функций важно в уравнении указать абсолютные ссылки на столбец А и строку в. Это обеспечивается вводом в уравнении поверхности вместо аргумента х ссылки $А2, а вместо аргумента у — ссылки в$1.
  8. Для табуляции функции протаскивается маркер заполнения ячейки В2, используя метод AutoFill и формулу поверхности, позволяющих распространить табуляцию на весь диапазон, где табулируется функция.
  9. Строит поверхности при помощи методаChartWizard.
  10. Изменяет ориентацию надписи оси z. и Сохраняет построенную поверхность в файле График-gif. 12. Отображает рисунок из файла График.gif в элементе управления image1.

Рис. У8.4. Пример сообщения о несогласованности данных

Рис. У8.5. Сообщение о некорректном вводе формулы

Нажатие кнопки отмена запускает на выполнение процедуру CommandButton2 Click | Закрывает диалоговое окно.
ScrollBarl Change | Перемещение ползунка горизонтальной полоски прокрутки вызывает вращение вокруг оси Z диаграммы за счет изменения величины свойства Rotation.
ScrollBar2 Change | Перемещение ползунка вертикальной полоски прокрутки вызывает изменение угла, под которым смотрят на диаграмму, за счет изменения величины свойства Elevation.
ВращениеГрафика | Программирует вращение поверхности за счет изменения свойств Rotation и Elevation.

'

' Описание переменных уровня модуля

'

Dim УголЗрения as Integer

Dim ВокругОси2 as Integer

Dim УголЗренияСоСчетчика as Integer

'

' УголЗренияСоСчетчика - величина, снимаемая с полосы прокрутки

' и определяющая угол зрения под которым смотрят на поверхность

' УголЗрения - угол зрения, под которым смотрят на поверхность,

' он равен УголЗренияСоСчетчика - 90 и лежит в

'диапазоне от -90 до 90

' ВокругОсиЕ - угол поворота вокруг оси z, лежит в

' диапазоне от 0 до 360

'

Private Sub CommandButtonl_Click()

'

' Процедура табуляции функции

' и построения поверхности

'

Dim х_нз As Double

Dim х_пз As Double

Dim х_шаг As Double

Dim у_нз As Double

Dim у_пз As Double

Dim у_шаг As Double

Dim УрПоверхности As String

'

' Переменная х:

' х_нз - начальное значение

' х_пз - предельное значение

' х_шаг - шаг изменения

' Переменная у:

' у_нз - начальное значение

' у_пз - предельное значение

' у_шаг - шаг изменения

' УрПоверхности - уравнение поверхности

'

Dim nx As Integer

Dim ny As Integer

'

' nx - число протабулированных значений аргумента х

' ny - число протабулированных значений аргумента у

'

Dim n As Integer

Dim i As Integer

'

' n ,i - вспомогательные целые переменные

Dim ПоляВвода(1 То 6) As Object

'

' Массив полей ввода

'

Set ПоляВвода(1) = TextBoxl

Set ПоляВвода(2) = TextBox2

Set ПоляВвода(3) = TextBox3

Set ПоляВвода(4) = TextBox4

Set ПоляВвода(5) = TextBox5

Set ПоляВвода(6) = TextBox6

'

' Проверка корректности ввода данных

'

For i = 1 To 6

If IsNumeric(ПоляВвода(i).Text) = False Then Select Case i

Case 1

MsgBox "Ошибка в начальном значении х", vblnformation, "Поверхность"

TextBox1.SetFocus

Exit Sub

Case 2

MsgBox "Ошибка в начальном значении у", vblnformation, "Поверхность"

TextBox2.SetFocus

Exit Sub

Case 3

MsgBox "Ошибка в шаге х", vblnformation, "Поверхность"

TextBox3.SetFocus

Exit Sub

Case 4

MsgBox "Ошибка в шаге у", vblnformation, "Поверхность"

TextBox4.SetFocus

Exit Sub

Case 5

MsgBox "Ошибка в конечном значении х", vblnformation, "Поверхность"

TextBox5.SetFocus

Exit Sub

Case 6

MsgBox "Ошибка в конечном значении у", vblnformation, "Поверхность"

TextBox6.SetFocus

Exit Sub

End Select

End If

Next i

'

' Считывание с диалогового окна

' значений переменных

'

х_нз = CDbl(TextBoxl.Text)

у_нз = CDbl(TextBox2.Text)

х__шаг = CDbl (TextBox3.Text)

у_шаг = CDbl(TextBox4.Text)

х_пз = CDbl(TextBox5.Text)

у_пз = CDbl(TextBox6.Text)

УрПоверхности = Trim(TextBoxV.Text)

'

' Проверка согласованности введенных данных

'

If х_нз >= х_пз Then

MsgBox "Начальное значение х слишком большое", vblnformation, "Поверхность"

TextBoxl.SetFocus

Exit Sub

End If

If х_нз + х_шаг >= х_пз Then

MsgBox "Шаг х великоват", vblnformation, "Поверхность"

TextBox3.SetFocus

Exit Sub

End If

If у_нз >= у_пз Then

MsgBox "Начальное значение у слишком большое", vblnformation, "Поверхность"

TextBox2.SetFocus

Exit Sub

End If

If у_нз + у_шаг >= у_пз Then

MsgBox "Шаг у великоват", vblnformation, "Поверхность"

TextBox4.SetFocus

Exit Sub

End If

'

'

' Переход на отладчик ошибок в случае их возникновения On Error GoTo Сообщение

' Замена в введенной формуле аргумента х на ссылку $А2,

' а аргумента у на ссылку В$1

'

i=1

Do

'

' Замена в введенной формуле аргумента х на ссылку $А2

'

If Mid(УрПоверхности, i, 1) = "х" Or Mid(УрПоверхности, i, 1) = "X" Then

n = Len(УрПоверхности)

If (1 < i) And (i < n) Then

УрПоверхности = Left(УрПоверхности, i - 1) & "$A2" & Right(УрПоверхности, n - i)

End If

If i = 1 Then УрПоверхности = "$A2" & Right(УрПоверхности, n - 1)

If i = n Then УрПоверхности = Left(УрПоверхности, n - 1) & "$A2"

End If

' Замена в введенной формуле аргумента у на ссылку В$1

If Mid(УрПоверхности, i, 1) = "y" Or Mid(УрПоверхности, i, 1) = "Y" Then n = Len(УрПоверхности)

If (1 < i) And (i < n) Then

УрПоверхности = Left(УрПоверхности, i - 1) & "B$l" & Right(УрПоверхности, n - i)

End If

If i = 1 Then УрПоверхности = "B$l" & Right(УрПоверхности, n - 1)

If i = n Then УрПоверхности = Left(УрПоверхности, n - 1) & "B$l"

End If

i = i + 1

Loop While i <= Len(УрПоверхности)

'

' Очистка на активном листе ранее введенных данных

'

ActiveSheet.Cells.Select Selection.Clear

' Заполнение диапазонов значениями аргументов

'

With ActiveSheet

'

' Ввод в ячейку А2 начального значения

'

.Range("A2").Value = х_нз

'

' Создание арифметической прогрессии по столбцу

' с указанными шагом и начальным значением

'

.Range("A2").DataSeries Rowcol:=xlColuims,

Type:=xlLinear, Step:=x__iuar, Stop:=x_ns, Trend:=False

'

' Ввод в ячейку В1 начального значения

'

.Range("Bl").Value = у_нз

'

' Создание арифметической прогрессии вдоль строки

' с указанными шагом и начальным значением

'

.Range("Bl").DataSeries Rowcol:=xlRows,

Type:=xlLinear, Step:=y_iuar, Stop:=y_ns, Trend:=Faise

End With

' Заполнение диапазона значениями функции

'

With ActiveSheet

'

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

'

nx = .Range("A1").CurrentRegion.Rows.Count

'

' Определение числа столбцов в диапазоне заполнения

ny = .Range("Al").CurrentRegion.Columns.Count

'

' Ввод уравнения поверхности в ячейку В2

'

.Range("В2").Formula = УрПоверхности

If IsError(Evaluate(УрПоверхности)) = True Then

MsgBox "Ошибка в формуле", vbExclamation, "Поверхность"

Exit Sub

End If

'

' Заполнение диапазона Range(Cells(2, 2), Cells(2, ny))

' начиная с ячейки В2, что эквивалентно протаскиванию маркера

' заполнения ячейки В2 на диапазон

Range(Cells(2, 2), Cells(2, ny))

'

.Range("B2").AutoFill

Destination:=Range(Cells(2, 2), Cells(2, ny)),

Type:=xlFillDefault

' Заполнение диапазона

Range(Cells(2, 2), Cells(nx, ny)),

' начиная с диапазона

Range(Cells(2, 2), Cells(2, ny)),

' что эквивалентно протаскиванию маркера

' заполнения диапазона

Range(Cells(2, 2), Cells(2, ny))

' на диапазон

Range(Cells(2, 2), Cells(nx, ny))

'

.Range(Cella(2, 2), Cells(2, ny)).AutoFill

Destination:=Range(Cells(2, 2),

Cells(nx, ny)),

Type:=xlFillDefault

End With

'

' Удаление с рабочего листа всех ранее построенных диаграмм

'

ActiveSheet.ChartObjects.Delete

'

' Выбор диапазона, по которому строится поверхность

ActiveSheet.Range(Cells(2, 2), Cells(nx, ny)).Select

'

' Задание и выбор области на рабочем листе, где

' будет построена поверхность

'

ActiveSheet.ChartObjects.Add(29.25, 19.5, 270.75, 187'.5).Select Application.CutCopyMode = False

' Построение поверхности

ActiveChart.ChartWizard

Source:=Range(Cells (1, 1), Cells(nx, ny) ),

Gallery:=x13DSurface, Format:=1,

PlotBy:=xlColumns,

CategoryLabels:=1,

SeriesLabels:=l,

HasLegend:=False,

Title:="Поверхность",

CategoryTitle:="x",

ValueTitle:="z",

ExtraTitle:="y" ActiveSheet.ChartObjects(1).Activate

ActiveChart.Axes(xlValue)

.AxisTitle.Select With Selection

.HorizontalAlignment = xlCenter

.VerticalAlignment = xlCenter

.Orientation = xlVertical

End With

'

ВращениеГрафика 20, 15

'

' Запись диаграммы в файл и

' загрузка картинки в Imagel

ActiveChart.Export FilterNаmе:="График.gif",

FilterName:="GIF"

UserForml.Image1.Picture = LoadPicture("График.gif") ActiveSheet.Range("Al").Select

'

Exit Sub Сообщение:

MsgBox "Ошибка: " & Err.Description, vbExclamation, "Поверхность"

TextBox7.SetFocus

Exit Sub End Sub

Private Sub CoramandButton2_Click()

'

' Процедура закрытия диалогового окна

UserForml. Hide

End Sub

Private Sub Label7_Click()

End Sub

'

Private Sub ScrollBarl_Change()

' Процедура вращения вокруг оси z

'

'

' Считывание данных с полос прокрутки

'

ВокругОсиZ = ScrollBarl.Value УголЗренияСоСчетчика = ScrollBar2.Value

УголЗрения = УголЗренияСоСчетчика - 90

' Вращение поверхности

'

ВращениеГрафика ВокругОсиг, УголЗрения

End Sub

'

Private Sub ScrollBar2_Change()

' Процедура изменения угла, под которым

' смотрят на диаграмму

' Считывание данных с полос прокрутки

'

ВокругОсиZ = CInt(ScrollBarl.Value)

УголЗренияСоСчетчика = CInt(ScrollBar2.Value)

'

УголЗрения = УголЗренияСоСчетчика - 90

'

' Вращение поверхности ВращениеГрафика ВокругОсиг, УголЗрения

End Sub

'

Sub ВращениеГрафика(ByVal ВокругОсиг, ByVal УголЗрения As Integer)

'

' Процедура вращения поверхности

'

If ActiveSheet.ChartObjects.Count >= 1 Then

ActiveSheet.ChartObjects(I).Activate

With ActiveChart

'

' Угол, под которым смотрят на диаграмму,

' допустимые значения от -90 до 90,

' по умолчанию 15

'

.Elevation = УголЗрения

'

' Вращение вокруг оси z, допустимые значения от 0 до 360,

' по умолчанию 20

'

.Rotation = ВокругОсиг End With

End If

'

End Sub

'

Private Sub UserForm_Initialize()

'

' Процедура инициализации диалогового окна

'

CommandButtonl.Default = True

CoiranandButton2.Cancel = True

ScrollBarl.ControlTipText = "Поворот вокруг оси Z"

ScrollBar2.ControlTipText = "Изменение угла зрения"

' Рисунок масштабируется с учетом относительных размеров так,

' чтобы он помещался в объекте Imagel

'

With Imagel

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeStretch

End With

'

'

' Установка максимальных и минимальных допустимых значений

' для полос прокрутки, а

' также их первоначальных значений

'

With ScrollBar2

.Min = 0

.Max = 180

.Value = 105

End With

With ScrollBarl

.Min = 0

.Max = 360

.Value =20

End With

UserForml.Show

'

End Sub

Самостоятельное задание

Разработать приложение с диалоговым окном объемный график (рис. У8.6), которое должно решать следующие задачи:

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

Рис. У8.6. Диалоговое окно Объемный график

Рис. У8.7. Диапазон с данными и результат построения объемного графика на рабочем листе

  2. Программа должна определить число строк диапазона, а также минимальное (1) и максимальное (число строк диапазона) значение счетчика.
  3. При помощи счетчика установить, какая из строк диапазона будет играть роль абсцисс.
  4. При нажатии кнопки ок должен строиться объемный график с выбранной осью абсцисс (рис. У8.7) на рабочем листе и, кроме того, отображаться в объекте image диалогового окна.
  5. С помощью полос прокрутки обеспечить управление ориентацией графика в пространстве.


  • УРОК 9. ТЕМА: ПЕРИОДИЧЕСКИЕ ВЫПЛАТЫ. ПОСТРОЕНИЕ ДИАГРАММ
    • ЦЕЛЬ УРОКА
    • ТЕОРИЯ
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 9.

Тема: Периодические выплаты. Построение диаграмм

Цель урока

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

  • Конструируя данное приложение, вы на практике освоите, как:
  • Производить расчет периодических выплат
  • Использовать финансовую функцию ППЛАТ ( РМТ )
  • Выводить результаты табулирования функции в элемент управления ListBox (СПИСОК)
  • Строить диаграмму, тип которой выбирается в группе переключателей
  • Отображать графический файл в элементе управления image (рисунок)
  • Осуществлять проверку наличия файла на диске

Теория

Функция ППЛАТ (РМТ) вычисляет величину постоянной периодической выплаты ренты (например, регулярных платежей по займу) при постоянной процентной ставке.

Синтаксис:

ППЛАТ(ставка; кпер; нз; бз; тип)

Аргументы:

ставка | Процентная ставка за период
кпер | Общее число периодов выплат
нз | Текущее значение, т. е. общая сумма, которую составят будущие платежи
бз | Будущая стоимость или баланс наличности, который нужно достичь после последней выплаты. Если аргумент бз опущен, то по умолчанию полагается равным 0 (будущая стоимость займа, например, равна 0)
тип | Допустимые значения: 0 или 1, обозначающие, когда должна производиться выплата. Если аргумент- тип равен 0 или опущен, то оплата в конце периода, если равен 1 , то в начале периода

Практика

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

Рис. У9.1. Диалоговое окно Периодических выплат

Кроме того, приложение строит диаграмму, показывающую зависимость величины выплат от процентной ставки. Тип диаграммы можно задать, выбирая переключатель из группы диаграмма диалогового окна Периодических выплат (рис. У9.1). Результат табуляции зависимости размера выплат от процентной ставки выводится в элемент управления ListBox диалогового окна и на рабочий лист (рис. У9.2).

Рис. У9.2. Отчет, создаваемый приложением на рабочем листе

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Назначает клавише <Esc> функцию кнопки Отмена, а клавише <Enter> — вычислить, а также задает тексты всплывающих подсказок для этих кнопок и кнопки Очистка.
  3. Устанавливает изначально переключатель гистограмма. Проверяет наличие на диске файла, отображаемого в элементе управления image при данном выборе переключателя. Если такого файла нет, то информирует об этом пользователя, но тем не менее программа продолжает свою работу без загрузки отсутствующего файла. Если файл есть, изображение, содержащееся в этом файле, выводится в элементе управления image.

Нажатие кнопки Вычислить запускает на выполнение процедуру

CommandButtonl_Click
  1. Проверяет, являются ли вводимые данные числами. В случае ошибки отображает соответствующее сообщение.
  2. Проверяет согласованность вводимых данных. В случае ошибки отображает соответствующее сообщение (рис. У9.3).
  3. Вводит на рабочий лист заголовки записей и их форматирует.
  4. Определяет число точек, в которых будут табулироваться процентные ставки.
  5. Последовательно находит размеры выплат для очередной процентной ставки, меняющейся от начального значения до конечного с указанным шагом. Результаты вычислений выводит на рабочем листе и в двумерный массив ЭлементыСписка, число строк которого равно числу процентных ставок. В первый его столбец выводятся процентные ставки, а во второй -величины соответствующих выплат.
  6. На основе массива ЭлементыСписка заполняется список, предварительно очищенный от ранее введенных в него элементов.
  7. В соответствии с установленным переключателем из группы диаграмма при помощи процедуры график строится выбранная диаграмма.

Рис. У9.3. Пример сообщения о несогласованности данных

OptionButton1_Click, OptionButton2_Click и OptionButton3_Click | Выбирает переключатель гистограмма, график или Круговая группы Диаграмма. Проверяет наличие на диске файла, отображаемого в элементе управления image при данном выборе переключателя. Если такого файла нет, то информирует об этом пользователя, и программа продолжает свою работу без загрузки отсутствующего файла. Если файл имеется, то изображение, содержащееся в этом файле, выводится в элементе управления Image .
График | Удаляет с рабочего листа все ранее построенные диаграммы. Строит диаграмму на рабочем листе. Аргументами процедуры являются ТипГрафика и его Формат.

Private Sub CommandButtonl_Click()

' Процедура вычисления выплат по ссуде

Dim p As Double

Dim i_нпc As Double

Dim i кпс As Double

Dim i_шar As Double

Dim k As Integer

Dim i As Integer

Dim n As Integer

Dim m As Integer

Dim A()As Double

Dim Проценты() As Double

Dim ПроцентыФормат() As Variant

Dim ЭлементыСписка() As Variant

Dim Area As Object

'

' i_нпс - начальная процентная ставка

' i_кnc - конечная процентная ставка

' i_inar - шаг процентной ставки

' р - ссуда

' k - число выплат

'А() - динамический массив значений выплат

' Проценты() - динамический массив значений процентных ставок

' ПроцентыФормат() - динамический массив значений процентных ставок,

' отформатированных по процентному формату

' ЭлементыСписка() - динамический массив, состоящий из двух столбцов:

' значений процентных ставок и выплат, выводимых в список

'

' Проверка: вводятся ли в поля диалогового окна числа

'

If IsNumeric(TextBoxl.Text) = False Then

MsgBox "Ошибка в ссуде", vbInformation, "Выплаты" TextBox1.SetFocus

Exit Sub

End If

If IsNumeric(TextBox2.Text) = False Then

MsgBox "Ошибка в числе выплат", vblnformation, "Выплаты"

TextBox2.SetFocus

Exit Sub

End If

If IsNumeric(TextBox3.Text) = False Then

MsgBox "Ошибка в начальной процентной ставке", vblnformation, "Выплаты"

TextBox3.SetFocus

Exit Sub

End If

If IsNumeric(TextBox4.Text) = False Then

MsgBox "Ошибка в конечной процентной ставке", vblnformation, "Выплаты"

TextBox4.SetFocus

Exit Sub

End If

If IsNumeric(TextBoxS.Text) = False Then

MsgBox "Ошибка в шаге процентной ставки", vblnformation, "Выплаты"

TextBox5.SetFocus

Exit Sub

End If

'

' Присвоение переменным значений, вводимых в диалоговом окне

'

р = CDbl(TextBoxl.Text)

k = CInt(TextBox2.Text)

i_нпс = CDbl(TextBox3.Text) / 100

i_Knc = CDbl(TextBox4.Text) / 100

i_шar = CDbl(TextBox5.Text) / 100

'

' Проверка согласованности вводимых процентных ставок.

' Несогласованность ввода отображается в сообщении

'

If i_кпс < i_нпс Then

MsgBox "Конечная процентная ставка меньше начальной",

vbExclamation, "График" TextBox3.SetFocus

Exit Sub End If If i_кпс < i_нпс + i_шar Then

MsgBox "Шаг слишком большой!" & Chr(13) &

"Табулируется только одно значение.", vbExclamation, "График" TextBox5.SetFocus

Exit Sub

End If

If i_шar <= 0 Then

MsgBox "Шаг должен быть положительным!",

vbExclamation, "График" TextBox5.SetFocus

Exit Sub

End If

'

' Очистка рабочего листа от результатов предыдущих вычислений '

ActiveSheet.Cells.Clear

' m - количество процентных ставок

'

m = (i_кпс - i_нпс) / i_шаг + 1

'

' Установка границ динамических массивов Проценты,

' ПроцентыФормат и А

ReDim А(1 Тo m)

ReDim Проценты(1 То m)

ReDim ПроцентыФормат(1 То m)

'

' Ввод заголовков записей на рабочий лист

With ActiveSheet

.Range("A:A").ColumnWidth =17.6

.Range("Al").Value = "Процентная ставка"

.Range("A2").Value = "Размер выплаты"

.Range("A3").Value = "Ссуда"

.Range("A4").Value = "Число выплат"

End With

' Форматирование заголовков записей

'

ActiveSheet. Range ("Al: A4 ")

.Select With Selection

.HorizontalAlignment = xlGeneral

.VerticalAlignment = x1Bottom

.WrapText = False

.Orientation = 30

.ShrinkToFit = False

.MergeCells = False

End With

With Selection.Interior

.CqlorIndex =36

.Pattern = xlSolid

.PatternColorlndex = xlAutomatic

End With

'

' Вывод данных на- рабочем листе

'

With ActiveSheet

For i = 1 To m

Проценты(i) = i_нпс + i_шar * (i - 1) A(i) = Application.Pmt(Проценты(i), k, -p) A(i) = Format(A(i), "##")

ПроцентыФормат(i) = Format (ПроцентыЦ) , "#.0%")

.Cells(1, i + 1}.Value = ПроцентыФормат(i)

.Cells(2, i + 1).Value = A(i)

Next i

.Range("B3").Value = p

.Range("B4").Value = k

End With

'

' Установка границ динамического массива ЭлементыСписка

' Используется для вывода значений процентных ставок

' и значений соответствующих выплат в список

'

ReDim ЭлементыСписка(i To m, 0 To 1)

'

' Поэлементное определение массива ЭлементыСписка

For i = 1 То m

ЭлементыСписка(i, 0) = ПроцентыФормат(i)

ЭлементыСписка(i, 1) = A(i)

Next i

' Заполнение списка с двумя колонками данных

'

With ListBoxl .Clear

.ColumnCount = 2

.List = ЭлементыСписка()

.Listlndex = 0

End With '

' Удаление всех графических объектов с активного рабочего листа

'

ActiveSheet.ChartObjects.Delete

'

' Определение выбранного переключателя,

' задающего тип диаграммы и

' построение выбранной диаграммы

'

If OptionButtonl.Value = True Then График xlColumn, 6

If OptionButton2.Value = True Then График xlLine, 10

If OptionButton3.Value = True Then График xlPie, 7

'

End Sub

'

Sub График(ТипГрафика As Integer, Формат As Integer)

'

' Процедура построения графика

' ТипГрафика - определяет тип диаграммы на втором шаге мастера диаграмм

' Формат - определяет вид диаграммы на третьем шаге мастера диаграмм

Dim Area As Object

Dim n As Integer

'

' Объектная переменная Area - диапазон, по которому строится диаграмма

Set Area = ActiveSheet.Cells(1, 2).CurrentRegion

'

' n - число столбцов диапазона Area

'

'

n = Area.Columns.Count

' (195, 30, 200, 190) - координаты области, где строится диаграмма

ActiveSheet.ChartObjects.Add(195, 30, 200, 190).Select

' Построение диаграммы

'

ActiveChart.ChartWizard Source:=

Range(Cells(1, 2), Cells(2, n)),

Gallery:=ТипГрафика, Format:=Формат,

PlotBy:=xlRows, CategoryLabels:=l,

SeriesLabels:=0, HasLegend:=False,

Title:="Диаграмма", CategoryTitle:="Cтaвкa",

ValueTitle:="Выплаты", ExtraTitle:=""

'

End Sub '

Private Sub CommandButton2_Click()

' Процедура закрытия диалогового окна

'

UserForml.Hide End Sub

Private Sub CommandButton3_Click()

' Процедура очистки рабочего листа

'

ActiveSheet.ChartObjects.Delete

'

' Очистка ячеек рабочего листа

ActiveSheet.Cells(1,1).CurrentRegion.Clear

End Sub '

Private Sub OptionButtonl_Click()

' Процедура загрузки файла в элемент управления Image

' при выборе переключателя Гистограмма

'

On Error

GoTo Сообщение1

Imagel.Picture = LoadPicture("VBA3_F1.BMP")

Exit Sub

'

' В случае отсутствия файла с рисунком отображается сообщение

'

Сообщение1:

If Err.Number = 52 Then

MsgBox "Нет графического файла VBA3_F1.BMP." & Chr'(13) &

"Работаем без картинки", vbCritical, "Выплаты"

End If

Resume Next

End Sub

Private Sub OptionButton2_Click()

'

' Процедура загрузки .файла в элемент управления Image

' при выборе переключателя График

On Error GoTo Сообщение2

'

Imagel.Picture = LoadPicture("VBA3_F2.BMP")

Exit Sub

'

' В случае отсутствия файла с рисунком отображается сообщение

'

Сообщение2:

If Err.Number = 52 Then

MsgBox "Нет графического файла VBA3_F2.BMP." & Chr(13) &

"Работаем без картинки", vbCritical, "Выплаты"

End If

Resume Next '

End Sub

'

Private Sub OptionButton3_Click()

' Процедура загрузки файла в элемент управления Image

' при выборе переключателя Круговая

On Error GoTo СообщениеЗ

'

Imagel.Picture = LoadPicture("VBA3_F3.BMP")

' В случае отсутствия файла с рисунком отображается сообщение

Exit Sub

Сообщение3:

If Err.Number = 52 Then

MsgBox "Нет графического файла VBA3_F3.BMP." & Chr(13) &

"Работаем без картинки", vbCritical, "Выплаты"

End If

Resume Next

'

End Sub

Private Sub UserForm_Initialize()

'

' Процедура инициализации и активизации диалогового окна

'

'

' Первоначальный выбор переключателя Гистограмма

'

OptionButtonl.Value = True

' Назначение клавише <Enter> функции кнопки Вычислить

'

With CommandButtonl

.Default = True

.ControlTipText = "Вьмисления и составление отчета на рабочем листе"

End With

With CommandButton2

.Cancel = True

.ControlTipText = "Кнопка отмены"

End with

CommandButton3.

.ControlTipText = "Очистка рабочего листа"

' '

On Error

GoTo Сообщение0

With Image1

' Установка такого же цвета границы элемента управления Image,

' как и его фон

'

.BorderColor = .BackColor '

' Загрузка рисунка соответствующего переключателю Гистограмма

'

.Picture = LoadPicture("VBA3_F1.BMP")

End With

'

UserForml.Show

Exit Sub '

' В случае отсутствия файла с рисунком, отображается сообщение

'

Сообщение0:

If Err.Number = 52 Then

MsgBox "Нет графического файла VBA3_F1.BMP." & Chr(13) &

"Работаем без картинки", vbCritical, "Выплаты"

End If

Resume Next

End Sub

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

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

  1. Выбрать команду Вставка, Диаграмма (Insert, Chart).
  2. В появившемся диалоговом окне первого шага мастера диаграмм при помощи списков Тип (Chart type) и Вид (Chart sub-type) отобразить требуемый рисунок диаграммы.
  3. Нажать клавишу <Print Screen>, тем самым копируя содержимое экрана в буфер обмена.
  4. Вызвать какой-нибудь графический редактор. Лучше всего тот, к которому вы привыкли и имеете опыт работы с ним. Если у вас нет никаких особых привязаностей к конкретному графическому редактору, вызовите, например, редактор Paint, который входит в стандартный комплект программ, поставляемых с Windows. Он, конечно, слабоват и обладает не ахти какими возможностями, но их с лихвой хватает для решаемой нами задачи. Для вызова редактора Paint выберите в Windows команду Пуск, Программы, Стандартные, Графический редактор Paint (Start, Programs, Accessories, Paint).
  5. Появится окно редактора Paint. Нажмите комбинацию клавиш <Ctrl>+<V>, что приведет к вставке в редактор Paint графического образа экрана, скопированного ранее в буфер обмена.
  6. Нас интересует картинка не всего экрана, а только часть, где изображен выбранный нами тип диаграммы. Этот тип надо выделить - нажмите кнопку Выделение (Selection), а потом при нажатой правой кнопке мыши выделите требуемый фрагмент.
  7. Нажмите комбинацию клавиш <Ctrl>+<C>. Выделенный фрагмент будет записан в буфер обмена.
  8. Выберите команду Файл, Создать (File, New). Так как, скорее всего, графическая копия всего экрана нам больше не потребуется, в появившемся диалоговом окне редактора Paint с информационном сообщением о том, надо ли сохранять файл, нажмите кнопку Нет (No).
  9. Появится пустое окно редактора Paint. Нажмите комбинацию клавиш <Ctrl>+<V>, что приведет к вставке в редактор Paint графического образа вырезанного фрагмента экрана, скопированного ранее в буфер обмена.
  10. Используя команду Рисунок, Атрибуты (Image, Attributes) или маркеры изменения размера рисунка, можно подобрать размеры рисунка так, чтобы они совпадали со вставленным в редактор фрагментом экрана.
  11. Выберите команду Файл, Сохранить как (File, Save as) для того, чтобы сохранить созданный графический файл на диске.

Самостоятельное задание

Построить приложение с диалоговым окном диаграмма (рис. У9.4). В этом приложении протабулировать следующие функции на заданном интервале с заданным шагом:

F(x) = х2Sin(л х)

G(x) = Sin2(л x) Cos(л x)

T(x) = (Sin(л x)+Cos(л x)) /(1 + Sin2(л x))

U(x) = Sin3(л x)Cos(л x)(1 + Sin2(л x))

Рис. У9.4. Диалоговое окно Диаграмма

При этом должны табулироваться не все функции, а только выбранные в списке выбираемые функции. Для отображения списка с флажками, которые позволят более наглядно выбирать несколько элементов из списка, воспользуйтесь свойством списка Liststyle. Результат табуляции следует вывести в список Аргумент и значения функций. Для того чтобы все табулируемые значения поместились в этот список по ширине, воспользуйтесь свойством ColumnWidths, которое устанавливает ширину каждой колонки списка. По результату табуляции программа должна построить диаграмму, выбранную из группы Диаграмма.


  • УРОК 10. ТЕМА: ЕЩЕ РАЗ О СОСТАВЛЕНИИ БАЗЫ ДАННЫХ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 10.

Тема: Еще раз о составлении базы данных

Цель урока

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

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

  • Конструирование пользовательского интерфейса
  • Создание приложения, работающего с несколькими диалоговыми окнами
  • Поиск информации в базе данных на рабочем листе
  • Редактирование записей в базе данных на рабочем листе
  • Удаление ненужных записей из базы данных на рабочем листе
  • Архивацию данных на рабочем листе
  • Программирование фильтрации данных
  • Программирование сортировки данных
  • Программирование создания сводных таблиц
  • Построение диаграмм по сводным таблицам
  • Добавление пользователем новых элементов в поле со списком во время выполнения программы

Практика

В этом уроке строится приложение с пользовательским интерфейсом по заполнению и обработке базы данных туристической фирмы "С нами не соскучишься". База данных состоит из двух рабочих листов: БазаДанных (рис. У 10.1) и Архив (рис. У10.2). Кроме того, при построении сводной таблицы по базе данных создается рабочий лист своднаяТаблица.

Рис. У10.1. Рабочий лист БазаДанных

Рис. У10.2. Рабочий лист Архив

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

Диалоговое окно | Назначение | Форма
Регистрация туристов фирмы "С нами не соскучишься" (рис. У10.3) | Для заполнения рабочего листа БазаДан-ных | UserForm1
Поиск (рис. У10.4) | Производит поиск клиента по фамилии. В фамилии клиента допустимо использовать символ <*> вместо группы любых символов, символ <?> вместо любого одного символа. В результате поиска, в случае отсутствия подходящих клиентов выдается соответствующее сообщение. Если подходящие клиенты найдены, в раскрывающемся списке выводится список их фамилий и имен. Выбрав требуемого клиента и нажав кнопку Редактировать, пользователь переходит к этапу редактирования информации о клиенте | UserForm3
Перерегистрация туристов фирмы "С нами не соскучишься" (рис. У1 0.5) | В него загружается информация о найденном клиенте. Допустимо любое редактирование информации с последующей заменой старой информации о клиенте на новую в базе данных. Также возможна запись информации в архив и ее удаление из базы данных. | UserForm2
Фильтрация (рис. У10.6) | В зависимости от выбранного переключателя отображает только оплаченные или только не оплаченные путевки. | UserForm4

Рис. У 10.3. Диалоговое окно Регистрация туристов фирмы "С нами не соскучишься"

Рис. У10.4. Диалоговое окно Поиск

Рис. У10.5. Диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься"

Рис. У10.6. Диалоговое окно Фильтрация

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

Кнопка | Назначение
Регистрация | Активизирует диалоговое окно Регистрация туристов фирмы "С нами не соскучишься"
Поиск и редактирование | Активизирует диалоговое окно Поиск
Фильтр и его отмена | Создает в заголовках полей базы данных раскрывающиеся списки со средствами фильтрации данных. Повторное нажатие на кнопку удаляет эти списки
Фильтрация оплаченных путевок | Активизирует диалоговое окно Фильтрация
Сортировка | Сортирует данные в алфавитном порядке по направлениям туров
Сводная -таблица | Создает на отдельном рабочем листе сводную таблицу, в которой подсчитывает суммарную продолжительность оплаченных и неоплаченных путевок по каждому из направлений туров
b | Сохраняет данные по принципу команды Сохранить (Save)
я | Сохраняет данные по принципу команды Сохранить как (Save as)

В пользовательском меню Файл имеются только три пункта: сохранить, сохранить как И Закрыть.

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

Модуль Модуль 1 | Описываются переменные уровня проекта.

Option Explicit

Public СписокНайденных () As String

Public Фамилия As String

'

' При поиске клиента по фамилии в соответствии с используемым в приложении

' алгоритмом на длину фамилии не налагается ограничений

'

Public Имя As String * 20

Public Пол As String * 3

Public ВыбранныйТур As String * 20

Public Оплачено As String * 3

Public Фото As String * 3

Public Паспорт As String * 3

Public Срок As String * 3

Public НомерСтроки As Integer

Public НайденнаяЗапись As Integer

Public Продолжительность As Integer

Модуль ThisWorkbook | Создается пользовательское меню и панели инструментов, а также заголовок окна пользовательского приложения. Устанавливается связь между кнопками пользовательской панели инструментов и процедурами модуля, которые инициализируют соответствующие диалоговые окна или выполняют указанные действия. Устанавливается режим работы, при котором весь пользовательский интерфейс прекращает свое существование при закрытии приложения. Процедура workbook_WindowActivate создает пользовательский интерфейс при загрузке книги. Процедура workbook windowDeactivate восстанавливает интерфейс, используемый в окне рабочей книги Excel по умолчанию.

Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)

'

' Процедура создания новой панели инструментов и новое меню при

' открытии рабочей книги

'

' При открытии рабочей книги панели инструментов Форматирование

' и Стандартная скрываются и отображается новый заголовок окна приложения

With Application

.Caption = "С нами не соскучишься"

.DisplayAlerts = False

.CoirmandBars ("Formatting") .Visible = False

.ContmandBars ("Standard") .Visible = False

End With

'

' Создание новой панели инструментов с именем

' Рабочая панель инструментов, которая будет

' удаляться при закрытии приложения

'

With Application.CommandBars.Add(Nаmе:="Рабочая панель инструментов", Position:=msoBarTop, MenuBar:=False, Temporary:=True)

.Visible = True

With .Controls

'

' Первая кнопка

'

With .Add(Type:=msoContro!Button, Id:=l)

.Caption = "Регистрация"

.TooltipText = "Регистрация клиентов"

.Style = msoButtonCaption

.OnAction = "Модуль1.UserForml_Initialize"

End With

'

' Вторая кнопка

'

With .Add(Typef=msoControlButton, Id:=l)

.Caption = "Поиск и редактирование"

.TooltipText = "Поиск и редактирование"

.Style = msoButtonCaption

.OnAction = "Модуль1.UserForm3_Initialize"

End With

'

' Третья кнопка

'

With .Add(Type:=msoControlButton, Id:=l)

.Caption = "Фильтр и его отмена"

.TooltipText = "Установка и снятие фильтра"

.Style = msoButtonCaption

.OnAction = "Модуль1.Автофильтр"

End With

'

' Четвертая кнопка

'

With .Add{Type:=msoControlButton, Id:=1)

.Caption = "Фильтрация оплаченных путевок"

.TooltipText = "Отображаются только оплаченные путевки"

.Style = msoButtonCaption

.OnAction = "Модуль1.UserForm4_Initialize"

End With

'

' Пятая кнопка

'

With .Add(Type:=msoControlButton, Id:=l)

.Caption = "Сортировка"

.TooltipText = "Сортировка данных"

.Style = msoButtonCaption

.OnAction = "Модуль1.Сортировка"

End With

End With

End With

'

' Вторая панель инструментов с именем Сводная таблица и файлы

'

With Application.CommandBars.Add(Name:="Сводная таблица и файлы", Position:=msoBarTop, MenuBar:=False, Temporary:=True)

.Visible = True

With .Controls

'

' Первая кнопка

'

With .Add(Type:=msoControlButton, Id:=l)

.Caption = "Сводная таблица"

.TooltipText = "Построение сводной таблицы"

.Style = msoButtonCaption

.OnAction = "Модуль1.СводнаяТаблица"

End With

'

' Вторая кнопка

'

With .Add(Type:=msoControlButton, Id:=3)

.TooltipText = "Сохранить"

.OnAction = "Модуль!.Запись"

End With

With .Add(Type:=msoControlButton, Id:=1175)

.TooltipText = "Сохранить как"

.OnAction = "Модуль1.СохранитьКак"

End With

End With

End With

With Application.CommandBars.Add(Name:="МоеМеню", MenuBar:=True, Temporary:=True)

.Visible = True

With .Controls

'

' Создание строки меню Файл

With .Add(Type:=msoControlPopup)

.Caption = "&Файл" With .Controls

With .Add(Type:=msoControlButton)

.Caption = "Сохранить"

.OnAction = "Модуль1.Запись"

End With

With .Add(Type:=msoControlButton)

.Caption = "Сохранить как"

.OnAction = "Модуль1.СохранитьКак"

End With

With .Add(Type:=msoControlButton)

.Caption = "Закрыть"

.OnAction = "Модуль1.Закрыть"

End With

End With

End With

End With

End With

End Sub

'

Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window)

'

' Процедура, отображающая панели инструментов Форматирование

' и Стандартная при закрытии приложения

' Кроме того, она устанавливает заголовок окна приложения, используемые

' по умолчанию

'

With Application

.CommandBars("Formatting").Visible = True

.CoiranandBars("Standard").Visible = True

.Caption = Empty

End With

End Sub

Ранее при описании модуль1 были указаны переменные уровня проекта, теперь рассмотрим несколько его процедур.

Модуль

Модуль1
  • Процедура UserForm1_Initialize инициализирует диалоговое окно Регистрация туристов фирмы "С нами не соскучишься". Также при помощи вызова процедуры заголовок-листа в ней создаются заголовки полей базы данньгх на рабочем листе, в случае их отсутствия.
  • Процедура UserForm3_Initialize активизирует диалоговое окно Поиск.
  • Процедура userForm4_Initialize активизирует диалоговое окно Фильтрация.
  • Процедура сортировка упорядочивает данные по двум критериям: первоначальный критерий направление тура, второстепенный — оплата
  • Процедура Своднаятаблица создает рабочий лист Сводная-таблица со сводной таблицей (рис. У10.7). Столбцы сводной таблицы основаны на поле оплачено; строки — на поле направление тура, а результаты сводной таблицы подводятся суммированием по полю Продолжительность базы данных. На основе сводной таблицы строится диаграмма. При этом используется свойство TableRangel объекта PivotTable,
    возвращающее диапазон с данными сводной таблицы, что позволяет избежать необходимости явного описания диапазона, по которому строится диаграмма.
  • Процедура сохранитьКак активизирует встроенное диалоговое окно Сохранение документа.
  • Процедура закрыть закрывает приложение.

Рис. У10.7. Рабочий лист СводнаяТаблица

Public Sub UserForml_Initialize()

'

' Процедура активизации диалогового окна Регистрация туристов

' и задание элементов раскрывающегося списка

'

'

' Проверка наличия заголовка базы данных.

' Построение заголовка базы данных в случае его отсутствия

If Sheets("БазаДанных").Range("Al").Value <> "Фамилия" Then ЗаголовокЛиста

End If

'

' Задание элементов раскрывающегося списка

'

With UserForml

.CommandButtonl.Default = True

.CommandButton2.Cancel = True

.ComboBoxl.List = Array("Лондон", "Париж", "Берлин")

.ComboBoxl.Listlndex = 0

.OptionButtonl.Value = True

.SpinButtonl.Value = 1

.CheckBoxl.Value = False

.CheckBox2.Value = False

.CheckBox3.Value = False

End With

'

' Активизация диалогового окна

'

UserForml.Show

'

End Sub

Public Sub ЗаголовокЛиста()

With Sheets("БазаДанных")

.Range("Al").Value = "Фамилия"

.Range("Bl").Value = "Имя"

.Range("Cl").Value = "Пол"

.Range("Dl").Value = "Направление тура"

.Range("El").Value = "Оплачено"

.Range("Fl").Value = "Фото сданы"

.Range("Gl").Value = "Паспорт сдан"

.Range("HI").Value = "Продолжительность"

.Range("A:A").ColumnWidth = 9.43

.Range ("B:C") .ColuimWidth = 8.43

.Range("D:D").ColumnWidth = 13.43

.Range'("E:E") .ColumnWidth = 10.14

.Range("F:F").ColumnWidth = 9

.Range("G:G").ColumnWidth = 8.43

.Range("H:H").ColumnWidth = 19.14

End With

'

Sheets("БазаДанных").Rows("1:1")

.Select With Selection

.Font.Bold = True

.HorizontalAlignment = xlGeneral

.VerticalAlignment = xlTop

.WrapText = True With .Interior

.Colorlndex = 36

.Pattern = xlSolid

End With

End With

Sheets("БазаДанных").Rows("2:2")

.Select ActiveWindow.FreezePanes = True

End Sub

'

Public Sub Запись ()

ActiveWorkbook.Save

End Sub '

Private Sub UserForm3_Initialize()

'

' Процедура активизации диалогового окна Поиск

'

UserFormS.Show End Sub

Private Sub Автофильтр()

' Процедура вызова команды Автофильтр

'

Sheets("БазаДанных").Range("A1:H1").Select Selection.AutoFilter

End Sub

Private Sub UserForm4_Initialize()

'

' Процедура активизации диалогового окна фильтрации

'

With UserForm4

.OptionButtonl.Value = True

.Show End With End Sub

'

Private Sub Сортировка()

'

' Процедура сортировки данных

' Первоначальный критерий сортировки - направление тура,

' второстепенный - произведение оплаты

Dim n Аs Integer '

' n - вспомогательная переменная '

Sheets("БазаДанных").Range("A2").Select

n = Selection. CurrentRegion. Rows. Count '

' Определение числа записей в базе данных

'

Worksheets("БазаДанных").Range(Cells(2, 1),

Cells(n + 1, 8))

.Sort keyl—Worksheets("БазаДанных")

.Range("D2"), orderl:=xlAscending,

key2:=Worksheets("БазаДанных").Range("E2")," _

order2:=xlDescending

'

' Сортировка по турам в возрастающем,

' а по оплате - в убывающем порядке

'

End Sub

Private Sub СводнаяТаблица ()

'

' Процедура построения сводной таблицы

'

Dim n As Integer

'

'

Dim Списки, Назначение As String

Dim Лист As Object

Dim ИмяКниги As String

ИмяКниги = ActiveWorkbook.Name

'

' Исключаем расширение из имени книги '

For i = 1 То Len(ИмяКниги)

If Mid(ИмяКниги, i, 1) = "." Then

ИмяКниги = Mid(ИмяКниги, 1, i - 1)

Exit For

End If

Next i

ИмяКниги = Trim(ИмяКниги)

' Удаляются ранее созданные рабочие листы с именем .СводнаяТаблица

For Each Лист In Worksheets

If Лист.Name = "СводнаяТаблица" Then Sheets("СводнаяТаблица").Delete

End If

Next Лист

' Создается новый рабочий лист с именем СводнаяТаблица

'

Worksheets.Add

ActiveSheet.Name = "СводнаяТаблица"

n = Worksheets("БазаДанных").Range("A2")

.CurrentRegion.Rows.Count

'

'

' Определение диапазона, по которому будет строиться

' сводная таблица (Списки) и

где она будет расположена (Назначение).

' Эти диапазоны записываются в виде строковых выражений

Списки = "БазаДанных!R1C1:R" & CStr(n) & "С8"

Назначение = "[" & ИмяКниги & "]СводнаяТаблица!R1C1"

'

' Создание сводной таблицы '

ActiveSheet.PivotTableWizard

SourceType:=xlDatabase,

SourceData:=Cписки,

TableDestination:=Hазвание, ТаblеNаmе:="Отчет"

ActiveSheet.PivotTables("Отчет").AddFields

RowFields:="Направление тура", ColumnFields:="Оплачено"

With ActiveSheet.PivotTables("Отчет")

.PivotFields("Продолжительность")

.Orientation = xlDataField

.Name = "Сумма по полю Продолжительность"

.Function = xlSum End With

'

' Построение диаграммы по сводной таблице

'

Dim СводнаяТаблица As PivotTable

Dim Диапазон As Range

Set СводнаяТаблица = ActiveSheet.PivotTables("Отчет")

With ActiveSheet.PivotTables("Отчет")

'

' He отображаются итоги по строкам и столбцам

'

.RowGrand = False .ColumnGrand = False

End With

'

' Определение диапазона из сводной таблицы,

' по которому строится диаграмма

'

Set Диапазон = ActiveSheet.PivotTables("Отчет").TableRangel

'

' Построение диаграммы

'

Charts.Add

ActiveChart.ChartType = xlColumnClustered

ActiveChart.SetSourceData Source:=Диапазон,

PlotBy:=xlColumns

ActiveChart.Location Where:=xlLocationAsObject,

Name:="СводнаяТаблица"

With ActiveChart

.HasTitle = False

.Axes(xlCategory, xlPrimary).HasTitle = False

.Axes(xlValue, xlPrimary).HasTitle = True

.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = _

"Продолжительность оплаченных/неоплаченных поездок"

End With

'

End Sub

'

Sub СохранитьКак()

'

' Процедура активизирует встроенное окно Сохранение документа

'

Application.Dialogs(xlDialogSaveAs).Show

End Sub

'

Sub Закрыть()

'

' Процедура закрытия приложения

'

Application,Quit

End Sub

Модуль

UserForml

Программа считывает информацию с диалогового окна Регистрация туристов фирмы "С нами не соскучишься" (рис. У 10.3) и обеспечивает ввод набранных в нем данных в рабочий лист БазаДанных.

  • Нажатие кнопки ок активизирует процедуру CommandButton1_Click по считыванию информации с диалогового окна и заполнению базы данных.
  • Счетчик активизирует процедуру SpinButton1_Change, которая вводит значения счетчика в поле продолжительность тура.
  • Процедура TextBox3_Change синхронизирует вводимые данные в поле продолжительность тура со значением счетчика.
  • Нажатие кнопки Отмена активизирует процедуру CommandButton2_Сlick, которая закрывает диалоговоеокно Регистрация туристов фирмы "С нами не соскучишься" .

Private Sub CommandButtonl_Click()

' В переменную НомерСтроки вводится номер первой пустой строки

' рабочего листа БазаДанных

НомерСтроки = Application.CountA(Sheets("БазаДанных").Range("A:A")) + I

'

' Считывание информации в переменные из диалогового окна

With UserForml

Фамилия = .TextBoxl.Text Имя = .TextBox2.Text

Продолжительность = .TextBox3.Text

If .OptionButtonl.Value = True Then

Пол = "Муж"

Else

Пол = "Жен"

End If

If ..CheckBoxl.Value = True Then

Оплачено = "Да"

Else

Оплачено = "Нет"

End If

If .CheckBox2.Value = True Then

Фото'= "Да"

Else

Фото = "Нет"

End If

If .CheckBoxS = xlOn Then

Паспорт = "Да"

Else

Паспорт = "Нет"

End If

ВыбранныйТур = .ComboBoxl.Text

End With

'

' Запись данных на рабочий лист БазаДанных

'

With Sheets("БазаДанных")

.Cells(НомерСтроки, 1).Value = Фамилия

.Cells(НомерСтроки, 2).Value = Имя

.Cells(НомерСтроки, 3).Value = Пол

.Cells(НомерСтроки, 4).Value = ВыбранныйТур

.Cells(НомерСтроки, 5).Value = Оплачено

.Cells(НомерСтроки, 6).Value = Фото

.Cells(НомерСтроки, 7).Value = Паспорт

.Cells(НомерСтроки, 8).Value = Продолжительность

End With

End Sub

'

Private Sub CommandButton2_Click()

'

' Процедура закрытия диалогового окна UserForml.Hide

End Sub

Private Sub SpinButtonl_Change()

'

' Процедура .ввода числа со счетчика в поле ввода

'

With UserForml

.TextBoxS.Text = CStr(.SpinButtonl.Value)

End With

End Sub

Private Sub TextBox3_Change()

'

' Процедура установки значения счетчика из поля ввода

With UserForml

.SpinButtonl.Value = CInt(.TextBox3.Text)

End With

'

End Sub

Модуль

UserForm3

Программа ищет по фамилии, введенной в поле Фамилия диалогового окна поиск (рис. У10.4), подходящих клиентов в базе данных. Если такие имеются, то список вариантов найденных клиентов в базе данных с указанием фамилий, имен и номеров записей, отображается в раскрывающемся списке Найденные варианты. В противном случае выдается сообщение о неудачном поиске (рис. У10.8).

  • Нажатие кнопки поиск активизирует процедуру CommandButton1_Click, которая производит поиск клиентов и отображает список найденных вариантов.
  • Нажатие кнопки Редактировать активизирует процедуру CommandButton2_Click, которая закрывает диалоговое окно поиск и активизирует диалоговое окно перерегистрация туристов фирмы "С нами не соскучишься" (рис. У10.5), заполняя его информацией о выбранном клиенте.
  • Нажатие кнопки отмена активизирует процедуру CommandButton3_Click, которая закрывает диалоговое окно Поиск.

Рис. У10.8. Сообщение о неудачном поиске клиента

Private Sub CommandButtonl_Click()

' Процедура поиска клиента

'

'

Dim i As Integer

Dim j As Integer

Dim n As Integer

Dim Строка As Integer

'

' i ,j и n - вспомогательные переменные

' В переменной i перебираются номера строк из базы данных,

' начиная со второй и заканчивая последней непустой строкой,

' номер которой определен в переменной Строка.

' Переменная j выполняет роль счетчика,

' учитывающего текущее количество отобранных вариантов.

' Если отобранных вариантов нет, то j присваивается 0.

' n присваивается конечному значению счетчика j

Dim Тест As String

'

' Тест - вспомогательная переменная, в которую вводится очередная

' проверяемая фамилия

'

Dim СписокНайденных() As String

Строка = Application.CountA(Sheets("БазаДанных").Columns(1)}

Фамилия = UserForm3.TextBoxl.Text

i = 2

j = 0

Do While i <= Строка

Тест = Sheets("БазаДанных").Cells (i, 1).Text

If IsNumeric(Application.Search(Фамилия, Тест)) = True Then

j = j + 1

End If

i = i + 1

Loop

If j = 0 Then

MsgBox "Вышла промашка. А клиента таково и в помине нет.",

vbExclamation, "Поиск" НайденнаяЗапись = 0

Exit Sub

End If

n = j

ReDim СписокНайденных(1 To n, 0 To 2) As String

' Двумерный динамический массив СписокНайденных используется для заполнения

' раскрывающегося списка с возможными вариантами клиентов.

' Первый и второй столбцы массива содержат фамилию и имя клиента,

' а третий - номера строки из рабочего листа БазаДанных,

' в которой записана информация о клиенте

'

'

i = 2

j = 0

Do While i <= Строка

Тест = Sheets("БазаДанных").Cells(i, 1).Text

If IsNumeric(Application.Search(Фамилия, Тест)) = True Then

j = j + 1

СписокНайденных(j, 0} = Тест

СписокНайденных(j, 1) = Sheets("БазаДанных").Cells(i, 2).Text

СписокНайденных(j , 2) = CStr(i)

End If

i = i + 1

Loop

'

' Заполнение раскрывающегося списка

'

With UserForm3.ComboBoxl

.Clear

.ColumnHeads = True

.ColumnCount = 3

.ColumnWidths = "60;60;10"

.List = СписокНайденных()

.Listlndex = 0

End With

' Ввод в переменную НайденнаяЗапись номера строки с

' первым клиентом, выведенным в раскрывающийся список

'

НайденнаяЗапись = CInt(СписокНайденных(1, 2))

End Sub

Private Sub CommandButton2_Click()

'

' Процедура закрытия диалогового окна Поиск,

' открытия диалогового окна Перерегистрация туристов

' и заполнением его информацией о найденном туристе

'

' Закрывается диалоговое окно Поиск

UserForm3.Hide

'

Dim n As Integer

'

' n - вспомогательная переменная, используемая для

' ввода из базы данных в раскрывающийся список

' направления тура найденного клиента

' (считывается из раскрывающегося списка

' номер строки выбранного клиента)

НайденнаяЗапись = UserForm3.ComboBoxl. List(UserForm3.ComboBoxl.Listlndex, 2)

' Если клиент не найден, то процедура информирует об этом,

' напоминая, что перед редактированием должен быть найден клиент

'

If НайденнаяЗапись = 0 Then

MsgBox "Сначала надо найти клиента", vblnformation, "Редактирование"

Exit Sub

End If

' Ввод из базы данных в диалоговое окно Редактирование

' информации о найденном клиенте

'

With UserForm2

.TextBoxl:Text = Sheets("БазаДанных")

.Cells(НайденнаяЗапись, 1)

.Value .TextBox2.Text = Sheets("БазаДанных")

.Cells(НайденнаяЗапись, 2).Value

.TextBox3.Text = Sheets("БазаДанных")

.Cells(НайденнаяЗапись, 8).Value

If Sheets("БазаДанных").Cells(НайденнаяЗапись, 3)

.Value = "Муж" Then

.OptionButtonl.Value = True

.OptionButton2.Value = False Else

.OptionButtonl.Value = False

.OptionButton2.Value = True End If If Sheets("БазаДанных")

.Cells(НайденнаяЗапись, 5)

.Value = "Да" Then

.CheckBoxl.Value = True Else

.CheckBoxl.Value = False

End If

If Sheets("БазаДанных").Cells(НайденнаяЗапись, 6)

.Value = "Да" Then

.CheckBox2.Value = True Else

.CheckBox2.Value = False

End If

If Sheets("БазаДанных").Cells(НайденнаяЗапись, 7)

.Value = "Да" Then

.CheckBox3.Value = True

Else

.CheckBox3.Value - False

End If

.ComboBoxl.List = Array("Афины", "Берлин", "Лондон")

ВыбранныйТур = Cells(НайденнаяЗапись, 4)

.Value Select Case ВыбранныйТур Case Is = "Афины"

n = 0 Case Is = "Берлин"

n = 1 Case Is = "Лондон"

n = 2

End Select

.ComboBoxl.Listlndex = n .Show

End With

'

End Sub '

Private Sub CortroandButton3_Click ()

'

' Процедура закрытия диалогового окна

'

UserForm3.Hide

End Sub

Модуль

UserForm2
  • Нажатие кнопки Запись в архив активизирует процедуру CommandButton1_Click, которая из диалогового окнаПеререгистрация туристов фирмы "С нами не соскучишься" (рис. У10.5) вводит данные на рабочий лист Архив.
  • Нажатие кнопки отмена активизирует процедуру ConmandButton2_Click, закрывающую диалоговое окно.
  • Нажатие кнопки Удалить активизирует процедуру CommandButton3_Click, которая удаляет запись из базы данных.
  • Нажатие кнопки Ввести изменения активизирует процедуру commandButton4 click, которая вводит внесенные : изменения в запись базы данных.

Private Sub CommandButtonl_Click()

'

' Процедура записи на рабочий лист Архив

Dim Строка As Integer '

' Строка - вспомогательная переменная, которой присваивается

' номер первой пустой строки рабочего листа Архив

' Копирование строки из рабочего листа БазаДанных в буфер обмена

'

Sheets("БазаДанных"}.Rows(НайденнаяЗапись).Сору

'

' Вставка в рабочий лист Архив содержания буфера обмена

'

With Sheets("Архив")

Строка-= Application.CountA(.Columns(1)) + 1

.Paste Destination:=.Rows(Строка)

End With

End Sub

Private Sub CommandButton2_Click()

' Закрытие диалогового окна Редактирование

UserForm2.Hide ' Обнуляется номер найденной записи

НайденнаяЗапись = 0

End Sub

Private Sub CommandButton3_Click()

'

' Процедура удаления строки из рабочего листа БазаДанных

НайденнаяЗапись = Sheets("БазаДанных").Cells(1, 20).Value

' Удаление записи

'

Sheets("БазаДанных").Rows(НайденнаяЗапись).Select

Selection.Delete

'

' Закрытие диалогового окна Редактирование

'

UserForm2.Hide '

' Обнуление переменной с номером строки

НайденнаяЗапись = 0

Sheets("БазаДанных").Cells(1, 20).Value = Empty

End Sub

Private Sub CommandButton4_Click()

'

' Процедура записи в базу данных измененной информации

'

' Считывание информации из диалогового окна "Редактирование"

' в переменные

With UserForm2

'

Фамилия = .TextBoxl.Text

Имя = .TextBox2.Text

Продолжительность = CInt(.TextBox3.Text)

If .OptionButtonl.Value = True Then

Пол = "Муж" Else

Пол = "Жен"

End If

If .CheckBoxl.Value = True Then

Оплачено = "Да" Else

Оплачено = "Нет"

End If

If .CheckBox2.Value = True Then

Фото = "Да"

Else

Фото = "Нет"

End If

If .CheckBoxS.Value = True Then

Паспорт = "Да"

Else

Паспорт = "Нет"

End If

ВыбранныйТур = .ComboBoxl.Text

End With

НайденнаяЗапись = Sheets("БазаДанных") .Cells (1, 20).Value '

' Запись редактируемой информации о клиенте в базу данных

With Sheetst"БазаДанных")

.Cells(НайденнаяЗапись, 1)

.Value = Фамилия

.Cells(НайденнаяЗапись, 2)

.Value = Имя

.Cells(НайденнаяЗапись, 3)

.Value = Пол

.Cells(НайденнаяЗапись, 4)

.Value = ВыбранныйТур

.Cells(НайденнаяЗапись, 5)

.Value = Оплачено

.Cells(НайденнаяЗапись, 6)

.Value = Фото

.Cells(НайденнаяЗапись, 7)

.Value = Паспорт

.Cells(НайденнаяЗапись, 8)

.Value = Продолжительность

End With

End Sub

Private Sub SpinButtonl_Change()

TextBox3.Text = CStr(SpinButtonl.Value)

End Sub

Модуль

UserForm4
  • Нажатие кнопки Фильтрация диалогового окна Фильтрация (рис. У10.6) активизирует процедуру CommandButton1_Click, которая производит фильтрацию данных из базы данных в зависимости от выбранного критерия фильтрации в группе Путевка .
  • Нажатие кнопки Отмена активизирует процедуру CommandButton2_Сlick, которая закрывает диалоговое окно Фильтрация.

Private Sub CommandButtonl_Click()

' Процедура фильтрации по критерию

Dim Flag As String

' Flag устанавливает критерий фильтрации по третьему столбцу

'

Sheets("БазаДанных").Rows(1).Select Selection.AutoFilter

With UserForm4

If .OptionButtonl.Value = True Then Flag = "Да"

If .OptionButton2.Value = True Then Flag = "Нет"

End With

'

' Считывание критерия из диалогового окна для фильтрации

Sheets("БазаДанных").Rows(l).Select Selection.AutoFilter

Selection.AutoFilter Field:=5, Criteria1:=Flag

'

' Фильтрация по критерию

'

End Sub

'

Private Sub CommandButton2_Click()

'

' Закрытие диалогового окна Фильтрация

'

UserForm4.Hide End Sub

Самостоятельное задание

Построить приложение, учитывающее движение товара на складе магазина "Все, чего душа пожелает". В диалоговом окне приема товара на склад (рис. У10.9) предусмотреть ввод наименования товара, цену, количество, дату приема и единицу измерения товара. Поступающие товары должны записываться в базу данных рабочего листа Склад.

Рис. У10.9. Диалоговое окно Все, чего душа пожелает. Прием товара.

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

Рис. У10.10. Автоматическое расширение элементов раскрывающегося списка

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

Следующая процедура является примером того, как можно автоматически добавлять в раскрывающийся список новые элементы. В диапазон A1:А2 рабочего листа, на основе которого строится раскрывающийся список, введем кг и штук (рис. У10.10). При вводе в поле раскрывающегося списка нового элемента, отличного от предыдущих, и нажатии кнопки CommandButton1, этот элемент программно вводится в ячейку АЗ. Теперь раскрывающийся список автоматически будет строиться по диапазону A1 : АЗ и т. д.

Private Sub CommandButtonl_Click()

Dim Диапазон As String

'

' Диапазон, на основе которого строится поле со списком

'

Dim n, i As Integer

'

' n - число элементов в диапазоне

'

Dim Новый As String

'

' Новый - .элемент, вводимый в поле со списком

n = Application.CountAfRange("A:A"))

Новый = ComboBoxl.Text

'

' Проверка, совпадает ли элемент, вводимый в поле со списком,

' с каким-либо элементом списка. Если не совпадает, то

' он добавляется в конец диапазона, по которому строится список

'

If ComboBoxl.MatchFound = False Then

Cells(n + 1, .1).Value = Новый

Диапазон = "A1:A" & CStr(n + 1)

ComboBox1.RowSource = Диапазон

End If

End Sub

'

Private Sub UserForm_Initialize()

Dim Диапазон As String

Dim n As Integer

n = Application.CountA(Range("A:A"))

Диапазон = "A1:A" & CStr(n)

ComboBoxl.RowSource = Диапазон

UserForml.Show

End Sub


  • УРОК 11. ТЕМА: ИГРА В КРЕСТИКИ И НОЛИКИ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 11.

Тема: Игра в крестики и нолики

Цель урока

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

Конструируя данное приложение, вы на практике освоите следующие операции:

  • Удаление рисунка из элемента управления
  • Выполнение учета количества щелчков по элементу управления
  • Управление видимостью границ элемента управления
  • Создание игрового поля

Практика

В редакторе форм создадим диалоговое окно крестики нолики

(рис. У11.1). Поле игры будут образовывать девять элементов управления Caption (надпись). Для видимости границ элементов управления Caption установите свойство BorderStyle равным fmBorderStyleSingle.

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

Рис. У11.1. Диалоговое окно Крестики — нолики в редакторе форм

Итак, в нашей игре первый ход за пользователем. Ход осуществляется двойным щелчком по игровому полю. Если игровое поле пусто, то в нем отображается крестик. Компьютер мгновенно отвечает на ход игрока, постановкой нолика в другое игровое поле и т. д. О результате игры компьютер информирует пользователя. При желании сыграть еще одну игру с компьютером, нажмите кнопку переиграть, которая очистит игровые поля. На рис. У11.2 приведен вид партии в крестики—нолики после второго шага игры.

Рис. У11.2. Пример партии игры в крестики—нолики после второго шага игры

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

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

Стратегия компьютера в игре крестики—нолики очень проста:

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

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Очищает все надписи от рисунков и текста, обнуляет все переменные.

Нажатие кнопки Переиграть запускает на выполнение процедуру

CommandButtonl_Click

Очищает все надписи от рисунков и текста, обнуляет все переменные.

Нажатие кнопки выход запускает на

выполнение процедуру

CoramandButton2_Click

Закрывает диалоговое окно.

От процедуры

Labell_DblClick

до

Label9 DblClick

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

Если нет, то компьютер делает свой ответный ход. Проверяет, привел ли ход компьютера к его победе, если да, то выдается соответствующее сообщение (рис. У11.3) и игра завершается.

Strategy 1 и Strategy | Генерируют первый и последующие ходы соответственно.
Проверка | Проверяет, нет ли в игре победителей.
НачальноеСостояние | Очищает все надписи от рисунков и текста, обнуляет все переменные.
Состояние | В массиве Статус отмечаются расставленные в ячейках игрового — 10, а пусто — 0. Процедура Состояние находит суммы элементов массива на диагоналях, в строках и столбцах.
Диагональ! | Определяет в зависимости от состояние, надо ли компьютеру ходить по главной диагонали и, если надо, то в какую ячейку.
Диагональ 2 | Определяет в зависимости от состояние, надо ли компьютеру ходить по второй диагонали и, если надо, то в какую ячейку.
Бок, Верх | Определяет в зависимости от Состояние, надо ли компьютеру ходить и, если надо, то в какую ячейку.

Рис. У11.3. Пример сообщения о результате игры

' Переменные уровня модуля

'

Dim Поле (1 То 3, 1 То 3) As Ob j ect

Dim Статус(1 To 3, 1 To 3) As Integer

Dim k As Integer

Dim i As Integer

Dim j As Integer

Dim Su(0 To 4, 0 To 4} As Integer

'

Private Sub CommandButtonl_Click()

' Процедура переигрывания

'НачальноеСостояние

End Sub

'

Private Sub CoirniandButton2_Click()

'

' Закрытие диалогового окна

'

UserForml.Hide

End Sub

Private Sub Labell_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(1, 1) = 0 Then

Поле(1, 1).Picture = LoadPicture("cross.bmp")

Статус(1, 1) = 1

k = k + 1

Проверка Inf

If Inf = True Then Exit Sub

Strategy

Проверка Inf

If Inf = True Then Exit Sub

End If

End Sub

'

Private Sub Label2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(1, 2) = 0 Then

Поле(1, 2).Picture = LoadPicture("cross.bmp")

Статус(1, 2) = 1

k = k + 1

Проверка Inf

If Inf = True Then Exit Sub

Strategy

Проверка Inf

If Inf = True Then Exit Sub

End If

End Sub

'

Private Sub Label3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(1, 3) = 0 Then

Поле(1, 3).Picture = LoadPicture("cross.bmp")

Статус(1, 3) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub End If End Sub

Private Sub Label4_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(2, 1) = 0 Then

Поле(2, 1).Picture = LoadPicture("cross.bmp")

Статус(2, 1) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub End If

End Sub

'

Private Sub

Label5_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(2, 2) = 0 Then

Поле(2, 2).Picture = LoadPicture("cross.bmp")

Статус(2, 2) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub

End If

End Sub

'

Private Sub

Label6_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(2, 3) = 0 Then

Поле(2, 3).Picture = LoadPicture("cross.bmp")

Статус(2, 3) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub

End If

End Sub

Private Sub Label7_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(3, 1) = 0 Then

Поле(3, 1).Picture = LoadPicture("cross.bmp")

Статус(3, 1) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub

End If

End Sub

'

Private Sub Label8_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(3, 2) = 0 Then

Поле(3, 2).Picture = LoadPicture("cross.bmp")

Статус(3, 2) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub End If End Sub

Private Sub Label9_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim Inf As Boolean

If Статус(3, 3) = 0 Then

Поле(3, 3).Picture = LoadPicture("cross.bmp")

Статус(3, 3) = 1

k = k + 1

'Проверка Inf

If Inf = True Then Exit Sub

Strategy

'Проверка Inf

If Inf = True Then Exit Sub

End If

End Sub

'

Sub UserFona Initialize 0

Set Поле(1, 1) = Label1

Set Поле(1, 2) = Label2

Set Поле(1, 3) = Label3

Set Поле(2, 1) = Label4

Set Поле(2, 2) = Label5

Set Поле(2, 3) = Label6

Set Поле(3, 1) = Label7

Set Поле(3, 2) = Label8

Set Поле(3, 3) = Label9

' НачальноеСостояние

End Sub

'

Sub Strategy()

Dim flag As Boolean

'

' Стратегия первого хода

If k = 1 Then

Strategy_1

Exit Sub

End If

'

If k = 2 And Su(0, 0) = 12 And Статус(2, 2) = 1 Then

Поле(1, 3).Picture = LoadPicture("ou.bmp")

Статус(1, 3) = 10

Exit Sub End If

'

If k = 2 And Статус(2, 2) = 10 And (Su(0, 0) = 12 Or Su{0, 4) = 12) Then

Поле(1, 2).Picture = LoadPicture("ou.bmp")

Статус(1, 2) = 10

Exit Sub End If

'

If k = 2 And Статус (2, 2) = 10 And Su(0, 0) = 11 And __

(Статус(3, 2) = 1 Or Статус(2, 1) = 1) Then

Поле(3, 1).Picture = LoadPicture("ou.bmp")

Статус(3, 1) = 10

Exit Sub End If

'

'Состояние

'

Диагональ1 20, 10,.flag

If flag = True Then Exit Sub

Диагональ2 20, 10, flag

If flag = True Then Exit Sub

'

For j = 1 To 3

Бок 20, 10, j, flag

If flag = .True Then Exit Sub Next j

'

For i = 1 To 3

Верх 20, 10, i, flag

If flag = True Then Exit Sub

Next i '

Диагональ1 2, 10, flag

If flag = True Then Exit Sub

'

Диагональ2 2, 10, flag

If flag = True Then Exit Sub

'

For j = 1 To 3

Бок 2, 10, j, flag

If flag = True Then Exit Sub

Next j '

For i =-1 To 3

Верх 2, 10, i, flag

If flag = True Then Exit Sub

Next i

Диагональ1 10, 10, flag

If flag = True Then Exit Sub

'

Диагональ2 10, 10, flag

If flag = True Then Exit Sub

'

For j = 1 To 3

Бок 10, 10, j, flag

If flag = True Then Exit Sub

Next j

'

For i = 1 To 3

Верх 10, 10, i, flag

If flag = True Then Exit Sub

Next i

For i = 1 To 3 For j = 1 To 3

If Статус(i, j) = 0 Then

Поле(i, j).Picture = LoadPicture("ou.bmp") Статус(i, j) = 10

Exit Sub

End If

Next j

Next i

'

End Sub

Sub Strategy_l()

'

If Статус(2, 2) = 0 Then

Поле(2, 2).Picture = LoadPicture("ou.bmp")

Статус(2, 2) = 10 Else

Поле(1, 1).Picture = LoadPicture("ou.bmp")

Статус(1, 1) = 10 End If

End Sub '

Sub Проверка(ByRef Inf As Boolean)

' Процедура проверяет, не выиграл ли кто-то

' Если аргумент Inf равен True, то выигравший есть

' Если аргумент Inf равен False, то пока выигравшего нет

'

Inf = False

Состояние

'

If Su(0, 0) = 3 Or Su(0, 0) = 30 Then

Сообщение Su(0, 0)

Inf = True

Exit Sub End If

'

If Su(0, 4) = 3 Or Su(0, 4) = 30 Then Сообщение Su(0, 4)

Inf = True

Exit Sub

End If

'

For j = 1 To 3

If Su(0, j) =3 Or Su(0, j) = 30 Then Сообщение Su(0, j)

Inf = .True

Exit Sub End If

Next j '

For i = 1 To 3

If Su(i, 0) = 3 Or Su(i, 0) = 30 Then Сообщение Su(i, 0)

Inf = True

Exit Sub

End If

Next i

'

' Проверка, не завершилась ли игра

'

For i = 1 То 3

For j = 1 То 3

If Статус(i, j) = 0 Then Exit Sub

Next j

Next i

MsgBox "Пока фифти-фифти", vbExclamation, "Крестики-Нолики"

Inf = True

'

End Sub

'

Sub Сообщение(Inf As Integer)

' Возможные сообщения о победителе

' Если Inf=3, то поздравления принимает игрок

' Если Inf=30, то поздравления принимает компьютер

If Inf = 3 Then

MsgBox "Поздравляю с выигрышем", vbExclamation, "Крестики-Нолики"

Exit Sub

End If

If Inf = 30 Then

MsgBox "Компьютер пока сильнее", vbExclamation, "Крестики-Нолики"

Exit Sub End If

End Sub '

Sub НачальноеСостояние()

'

' Обнуление данных и очистка картинок

'

For i = 1 То 3

For j = 1 То 3

Поле(i, j).Caption = ""

Поле(i, j).Picture = LoadPicture("")

Поле(i, j ) .BorderStyle = fmBorderStyleSingle

Статус(i, j) = 0 Next j

Next i

k = 0

For i = 0 To 4

For j = 0 To 4

Su(i, j) = 0

Next j

Next i

End Sub

'

Sub Состояние()

'

Su(0, 0) = 0

For i = 1 To 3

Su(0, 0) = Su(0, 0) + Статус(1, i)

Next i

'

Su(0, 4) =0

For i = 1 To 3

Su(0, 4) = Su(0, 4) + Статус(1, 4 - i)

Next i

For j = 1 To 3

Su(0, j) = 0

For i = 1 To 3

Su(0, j) = Su(0, j) + Статус(i, j)

Next i

Next j

'

For i = 1 To 3

Su(i, 0) = 0

For j = 1 To 3

Su(i, 0) = Su(i, 0) + Статус(i, j) Next j

Next i

'

End Sub

Sub Диагональ1(ByRef p, ByRef q, ByRef flag As Boolean)

flag = False

If Su(0, 0) = p Then

For i = 1 To 3

' If Статус(i, i) = 0 Then

Поле(1, i).Picture = LoadPicture("ou.bmp")

Статус(i, i) = q flag = True

Exit Sub

End If

Next i

End If

End Sub '

Sub Диагональ2(ByRef p, ByRef q, ByRef flag As Boolean)

flag = False If Su(0, 4) = p Then

For i = 1 To 3

If Статус(i, 4 - i) = 0 Then

Поле(i, 4 - i).Picture = LoadPicture("ou.bmp")

Статус(i, 4 - i) = q

flag = True Exit Sub

End If Next i End If End Sub

Sub Бок(ByRef p, ByRef q, ByRef j, ByRef flag As Boolean)

flag =. False

If Su(0, j) = p Then

For i = 1 To 3

If Статус(i, j) = 0 Then

Поле(i, j).Picture = LoadPicture ("ou.bmp")

Статус(i, j) = q

flag = True

Exit Sub

End If

Next i

End If

End Sub '

Sub Верх(ByRef p, ByRef q, ByRef i, ByRef flag As Boolean)

flag = False

If Su(i, 0) = p Then

For j = 1 To 3

If Статус (i, j) = 0 Then

Поле(1, j).Picture = LoadPicture("ou.bmp")

Статус(i, j) = q

flag = True

Exit Sub

End If

Next j

End If

End Sub

Самостоятельное задание

Разработать программу игры крестики—нолики, в которой в зависимости от установок параметров игры первый ход может делать либо компьютер, либр игрок (рис. У11.4). Игрок также может выбрать, что он ставит в игровые поля: крестики или нолики. Программа ведет учет числа побед как игрока, так и компьютера. Программа также подсчитывает число ничейных партий.

Рис. У11.4. Диалоговое окно Крестики — Нолики


  • УРОК 12. ТЕМА: ЛИНИЯ ТРЕНДА
    • ЦЕЛЬ УРОКА
    • ТЕОРИЯ
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 12.

Тема: Линия тренда

Цель урока

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

Конструируя данное приложение, вы освоите на практике:

  • Построение многостраничных диалоговых окон
  • Построение линии тренда
  • Применение метода offset для вывода данных на рабочем листе
  • Считывание данных из каждой конкретной ячейки диапазона

Теория

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

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

На основе своих наблюдений Сосулькин заметил, что объем продажи мороженого зависит, кроме прочих факторов, от температуры на улице. Объемы продаж эскимо "За ухо не оторвешь" за первые шесть дней торговли приведены в табл. 31.1. Температура в эти шесть дней возрастала.

Таблица 31.1. Температура и объемы продажи

Температура Продажа, шт. | 23 46 | 24 49 | 25 50 | 26 52 | 28 52 | 30 55

Сосулькин решил определить на основе этих данных, каков ожидаемый объем продажи мороженого в зависимости от температуры, чтобы зная прогноз погоды составить соответствующий запас. Из курса математики он вспомнил, что для этих целей служит уравнение тренда, а критерием адекватности модели является коэффициент корреляции. Сосулькин также вспомнил, что уравнение тренда можно построить на рабочем листе на основе диаграммы. Коэффициенты m и b линейного тренда у = mx + b можно также определить с помощью функций рабочего листа НАКЛОН (SLOPE) и ОТРЕЗОК (INTERCEPT), a коэффициент корреляции функцией КОРРЕЛ (CORREL).

Функция НАКЛОН определяет коэффициент наклона линейного тренда, а функция ОТРЕЗОК определяет точку пересечения линии линейного тренда с осью ординат.

Синтаксис:

НАКЛОН(известные_значения_у; известные_значения_х) ОТРЕЗОК(известные_значения_х; известные_значения_у) КОРРЕЛ(известные_значения_х; известные_значения_у)

Аргументы:

известные значения у | Массив известных значений зависимой наблюдаемой величины
известные значения х | Массив известных значений независимой наблюдаемой величины. Если аргумент известные значения х опущен, то предполагается, что этот массив {1; 2; 3; ...} такого же размера, как и известные значения у

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

Таблица 31.2. Температура и объемы продажи

 | 46 | 48 | 49 | 50 | 52 | 52 | 55
23 | 7 | 3 |  |  |  |  |
24 |  |  |  |  |  |  |
25 |  |  |  |  |  |  |
26 |  |  |  |  |  |  |
27 |  |  | 3 |  |  |  |
28 |  | 2 |  | 1 |  | 1 |
29 |  |  | 1 | 2 | 1 | 2 |
30 |  |  |  |  | 1 | 3 | 2

Отличием второй задачи от первой является то, что таблица данных состоит не из двух строк, в которые введены значения зависимой и независимой переменных, что, как вы уже знаете, в первой задаче позволило найти решение как графически, так и при помощи функций рабочего листа НАКЛОН, ОТРЕЗОК и КОРРЕЛ, Теодор решил, что это несущественное различие. Достаточно только написать программу, которая преобразует вторую таблицу к виду первой таблицы, а по полученной таблице программа сможет найти и уравнение тренда, и коэффициент корреляции, как и в первом случае.

Практика

В редакторе форм создадим диалоговое окно линейная регрессия (рис. У12.1). Это окно состоит из двух вкладок тренд и параметры (рис. У12.2).

Рис. У12.1. Вкладка Тренд диалогового окна Линейная регрессия

Рис. У12.2. Вкладка Параметры диалогового окна Линейная регрессия

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. В начальном состоянии выбран переключатель Без повторений, что обеспечивает скрытие надписи повторения соответствующим полем.

Нажатие кнопки ок запускает на выполнение процедуру

CommandButtonl Click

При выборе переключателя с повторениями производит расчет по процедуре трендсповто-рениями (вторая задача), а при выборе переключателя Без повторений - по процедуре Обыч-ныйтренд (первая задача).

Нажатие кнопки выход запускает на выполнение процедуру

CommandButton2 Click

Закрывает диалоговое окно.

OptionButton1_Click

и

OptionButton2_Click

Обеспечивает скрытие и отображение в диалоговом окне надписи повторения и соответствующего поля.

ОбычныйТренд
  1. В поля Независимая величина (в данном Случае Температура) и Зависимая величина (объем продаж) вводит ссылки на диапазоны, по которым строится линия тренда. Исходя из рис. У 12.3 В Поле Независимая величина вводится ссылка на диапазон А2:А7, а в поле Зависимая величина — В2 : В7 .
  2. Проверяет, располагаются ли данные только в столбцах, либо только в строках. Также проверяет, располагаются ли данные в столбцах с или D (эти два столбца зарезервированы программой для вывода результатов расчета). Если располагаются, то отображается соответствующее сообщение.
  3. На рабочий лист вводятся функции рабочего листа НАКЛОН, ОТРЕЗОК и КОРРЕЛ, по которым вычисляются параметры линии тренда и коэффициент корреляции.
  4. При помощи процедуры диаграмма строится диаграмма и линия тренда.

Рис. У 12.3. Результат решения первой задачи

ТрендСПовторениями

В поля Независимая величина (в данном случае температура) и зависимая величина (объем продаж) вводит ссылки на диапазоны, по которым строится линия тренда. Исходя из рис. У 12. 4 в поле Независимая величина вводится ссылка на диапазон А2:А9, в поле Зависимая величина — В1:Н1, 3 в поле Повторения — В2:Н9

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

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

Диаграмма

Строит диаграмму и линию тренда по диапазону, заданному в аргументе диапазон.

Рис. У12.4. Результат решения второй задачи

'

Option Explicit

' Переменные уровня модуля

Dim Независимая As String

Dim Зависимая As String

Dim Повторения As String

Dim НезависимаяЗависимая As Object

Dim Корреляция As Double

Dim m As Double

Dim b As Double

'

'

Private Sub CommandButtonl_Click()

' При выборе переключателя С повторениями

' производится расчет по процедуре ТрендСПовторениями,

' а при выборе переключателя.Без повторений

' производится расчет по процедуре ОбьиныйТренд

'

If OptionButtonl.Value = True Then ОбычныйТренд

End If

'

If OptionButton2.Value = True Then

ТрендСПовторениями

End If

'

End Sub

Private Sub CommandButton2_Click()

'

' Закрытие диалогового окна

'

UserForm1.Hide

End Sub

'

Private Sub OptionButtonl_Click()

'

' Обеспечивается скрытие надписи Повторения и RefEdit3

' при выборе переключателя Без повторений

'

RefEdit3.Visible = False

Label3.Visible = False

End Sub

Private Sub OptionButton2_Click()

'

' Обеспечивается видимость надписи Повторения и RefEdit3

' при выборе переключателя С повторениями

RefEdit3.Visible = True

Label3.Visible = True

End Sub

'

Private Sub UserForm_Initialize()

'

' Активизация диалогового окна

'

Caption = "Линейная регрессия" MultiPagel.Value = 0

CommandButton2.Cancel = True RefEddt3.Visible = False

Label3.Visible = False OptionButtonl.Value = True

UserForml.Show

End Sub

'

Sub ОбычныйТренд()

'

' Процедура расчета обычного тренда

'

' Ввод диапазонов данных

'

Независимая = RefEdit1.Value

Зависимая = RefEdit2.Value

' Проверка, располагаются ли данные в столбцах С или D.

' Если располагаются, то отображается соответствующее сообщение

If InStr(Range(Независимая).Address, "С") > 0 Or _ InStr(Range(Независимая).Address, "D") > 0 Then

MsgBox "Независимая переменная не может располагаться в" & Chr(13) & "столбцах С и D", vblnformation, "Линейная регрессия"

RefEditl.SetFocus

Exit Sub

End If

If InStr(Range(Зависимая).Address, "C") > 0 Or _ InStr(Range(Зависимая).Address, "D") > 0 Then

MsgBox "Зависимая переменная не может располагаться в" & Chr(13) & "столбцах С и D",

vblnformation, "Линейная регрессия" RefEdit2.SetFocus

Exit Sub

End If

'

' Проверка, располагаются ли данные только в столбцах,

' либо только в строках

'

If Range(Зависимая).Rows.Count > 1 And

Range(Зависимая).Columns.Count > 1 Then

MsgBox "Зависимая переменная должна располагаться " & Chr(13) & "либо в строке, либо в столбце", vblnformation, "Линейная регрессия" RefEdit2.SetFocus

Exit Sub

End If

'

If Range(Независимая).Rows.Count > 1 And _ Range(Независимая).Columns.Count > 1 Then

MsgBox "Независимая переменная должна располагаться" & Chr(13) & "либо в строке, либо в столбце",' vblnformation, "Линейная регрессия" RefEditl.SetFocus

Exit Sub

End If '

If (Range(Независимая).Rows.Count > 1 And _

Range(Зависимая).Columns.Count > 1) Or

(Range(Независимая).Columns.Count > 1 And _

Range(Зависимая).Rows.Count > 1) Then

MsgBox "Независимая и Зависимая переменные должны располагаться " & Chr(13) & "либо в строках, либо в столбцах", vblnformation, "Линейная регрессия"

RefEditl.SetFocus

Exit Sub

End If

'

' Ввод на рабочий лист заголовков

'

Range("Cl").Value = "Отрезок=" Range("C2").Value = "Наклон="

Range("C3").Value = "R=" '

' Расчет коэффициентов линии тренда ' и коэффициента корреляции

Range("D1'") .FormulaLocal = "=OTPE30K(" & Зависимая & ";" & Независимая & ")"

Range("D2").FormulaLocal = "=НАКЛОН(" & Зависимая & ";" & Независимая & ")"

Range("D3") .FormulaLocal = "=KOPPEЛ(" & Зависимая & ";" & Независимая & ")" '

b = Range("Dl").Value m = Range("D2").Value Корреляция = Range("D3").Value

'

' Вывод данных в диалоговое окно

'

TextBoxl.Text = CStr(b) TextBox2.Text = CStr(m)

TextBox3.Text = CStr(Корреляция)

'

' Построение диаграммы по двум диапазонам: Независимая и Зависимая

'

Set НезависимаяЗависимая = _

Application.Union(Range(Независимая) , Range(Зависимая)) Диаграмма НезависимаяЗависимая

End Sub

'

Sub ТрендСПовторениями()

'

Dim ИмяЛиста As String

Dim Ячейка As Object

Dimx(), y(), Nxy(), Nx(), Ny() As Double

Dim i, j, k, p, N_x, N_y, Nобщая As Integer '

Независимая = RefEditl.Value '

If Range(Независимая).Columns.Count > 1 Then

MsgBox "Данные для независимой переменной" & Chr(13) & "должны располагаться в одном столбце", vblnformation, "Линейная регрессия"

Exit Sub

End If

'

For Each Ячейка In Range(Независимая).Cells

If IsNumeric(Ячейка.Value) = False Then

MsgBox "В ячейках данных для независимой" & Chr(13) & _

"переменной должны быть только числа", vblnformation, "Линейная регрессия"

Exit Sub

End If

Next Ячейка

'

Зависимая = RefEdit2.Value

'

If Range(Зависимая).Rows.Count > 1 Then

MsgBox "Данные для независимой переменной" & Chr(13) & "должны располагаться в одной строке", vblnformation, "Линейная регрессия"

Exit Sub

End If '

For Each Ячейка In Range(Зависимая).Cells

If IsNumeric(Ячейка.Value) = False Then

MsgBox "В ячейках данных для зависимой" & Chr(13) & "переменной должны быть только числа", vblnformation, "Линейная регрессия"

Exit Sub

End If

Next Ячейка

Повторения = RefEdit3.Value

'

'

N_x = Range(Повторения).Rows.Count

N_y = Range(Повторения).Columns.Count

'

' N_x - число различных реализаций независимой переменной

' N у - число различных реализаций зависимой переменной

If Range(Независимая).Columns.Count = N_x And _

Range(Зависимая).Rows.Count = N_y Then

MsgBox "Размеры таблицы повторений должны быть" & Chr(13) & "согласованы с диапазонами данных наблюдаемых величин ", vblnformation, "Линейная регрессия"

Exit Sub

End If

For Each Ячейка In Range(Повторения).Cells

If IsNumeric(Ячейка.Value) - False Then

MsgBox "В ячейках данных таблицы повторений" & Chr(13) & "переменной должны быть только числа", vblnformation, "Линейная регрессия"

Exit Sub

End If

Next Ячейка

ReDim Nxy(1 To N_x, 1 To N_y) , Nx(l To N_x) , Ny(l To N_y) ,

x(l To N_x), y(1 To N_y) '

For i = 1 To N_x

For j = 1 To N_y

Nxy(i, j) = Range(Повторения).Cells(i, j).Value

Next j

Next i '

For i = 1 To N_x

Nx(i) =0

For j = 1 To N_y

Nx(i) = Nx(i) + Nxy(i, j)

Next j

Range(Повторения).Cells(i, N_y).Select

Selection.Offset(0, 1).Value = Nx(i)

Next i

' Nx(i) - число повторений i-го значения независимой переменной '

Nобщая = 0

For i = 1 То N_x

Ыобщая = Ыобщая + Nx(i)

Next i

'

' Ыобщая - число наблюдений

For j = 1 То N_y

Ny(j) = 0

For i = 1 To N_x

Ny(j) = Ny(j) + Nxy(i, j)

Next i

Range(Повторения).Cells(N_x, j).Select

Selection.Offset(1, 0).Value = Ny(j)

Next j

'

' Ny(j) - число повторений i-го значения зависимой переменной

'

Range(Повторения).Cells(N_x, N_y).Select

Selection. Offset (1, 1) .Value = Nобщая

'

' x(i) - i-e значение независимой переменной

'

For i = 1 To N_x

x(i) = Range(Независимая).Cells(i).Value

Next i

'

' y(i) - i-e значение зависимой переменной

For i = 1 To N_y

y(i) = Range(Зависимая).Cells(i).Value

Next i

' Записывание значений зависимой и независимой переменной ' в два столбца с учетом повторений

'

Р = 1

For i = 1 То N_x

For j = 1 То N_y

If Nxy(i, j) <> 0 Then

For k = 1 To Nxy(i, j)

Cells(p, 100).Value = x(i)

Cells(p, 101).Value = y(j) P = p + 1

Next k

End If

Next j

Next i

'

Независимая = "R1C100:R" & CStr(p - 1) & "C100" Зависимая.= "R1C101:R" & CStr(p - 1) & "C101"

'

'

' Расчет коэффициентов линии тренда

' и коэффициента корреляции

'

Cells (1, 102).FormulaLocal =

"=ОТРЕЗОК(" & Зависимая & ";" & Независимая & ")" Cells (2, 102).FormulaLocal =

"=НАКЛОН(" & Зависимая & ";" & Независимая & ")" Cells(3, 102).FormulaLocal =

"=КОРРЕЛ(" & Зависимая & ";" & Независимая & ")" '

b = Cells(1, 102).Value

m = Cells(2, 102).Value Корреляция = Cells(3, 102).Value

'

TextBoxl.Text = CStr(b)

TextBox2.Text = CStr(m) TextBox3.Text = CStr(Корреляция)

'

' Построение диаграммы Диаграмма Range(Cells(1, 100), Cells(p - 1, 101))

'

End Sub

Sub Диаграмма(Диапазон As Object)

'

' Построение диаграммы по диапазону

'

ActiveSheet.ChartObjects.Delete

ActiveSheet.ChartObjects.Add(150, 49.25, 259.5, 169.5).Select

Application.CutCopyMode = False

ActiveChart.ChartWizard Source:=Диапазон, Gallery:=xlXYScatter, Format:=1,

PlotBy:=xlColumns, CategoryLabels:=l, SeriesLabels:=0, HasLegend:=False,

Title:="", CategoryTitle:="",

ValueTitle:="", ExtraTitle:=""

'

' Добавление в диаграмму линии тренда

'

ActiveSheet.ChartObjects(1).Activate

ActiveChart.SeriesCollection(1).Select

ActiveChart.SeriesCollection(1)

.Trendlines.Add(Type:=xlLinear,

Forward:=0, Backward:=0, DisplayEquation:=True,

DisplayRSquared:=True).Select

'

End Sub

Самостоятельное задание

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


  • УРОК 13. ТЕМА: СОСТАВЛЕНИЕ РАСПИСАНИЯ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
    • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 13.

Тема: Составление расписания

Цель урока

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

Конструируя данное приложение, вы узнаете на практике, что такое:

  • Передача информации между элементами управления при обработке события Click
  • Управление видимостью рисунков
  • Управление цветом элементов управления

Практика

Трус, Балбес и Бывалый построили небольшой магазинчик "Придорожный лопух, 24 часа" у деревне Неелово на трассе Москва—Санкт-Петербург. Работу в магазинчике они разбили на две смены по 12 часов. В начале очередной недели они вместе составляют график своего дежурства на неделю, в котором подсчитывается число рабочих смен каждого компаньона. Через месяц они решили автоматизировать процесс создания расписания. С этой целью они разработали приложение, процесс создания которого обсуждается ниже.

В редакторе форм создадим диалоговое окно магазин придорожный лопух, 24 часа (рис. У13.1).

Кроме этого, в любом графическом редакторе, например Paint, создадим файл ball.bmp с изображением красного шара и фоном рисунка того же цвета, что и цвет диалогового окна.

Расписание составляется очень просто:

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

Рис. У13.1. Диалоговое окно Магазин Придорожный лопух, 24 часа

  2. Для более наглядного представления надписи, соответствующие сменам с О до 12 часов, имеют белый цвет фона, а надписи, соответствующие сменам с 12 до 24 часов, — желтый цвет фона.

Рис. У13.2. Заполнение диалогового окна

Магазин Придорожный лопух, 24 часа

  3. Ввод имени дежурного в смену производится перемещением указателя на надпись соответствующей смены и щелчком кнопкой мыши. Программа автоматически вставляет имя дежурного в надпись смены (рис. У13.2).
  4. Удалить имя дежурного из смены можно, указав на пустую надпись в группе компаньон и выполнив щелчок, а затем переместив указатель на надпись смены, из которой требуется удалить имя дежурного, и также щелкнув кнопкой мыши.
  5. Подсчет числа рабочих смен каждого из компаньонов производится нажатием на кнопку ок.

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. Очищает все надписи и задает свойства элементов управления Image .
  3. Устанавливает тип границы и цвет фона надписей.

Нажатие кнопки ок запускает на выполнение процедуру

CommandButtonl Click

Производит расчет числа рабочих смен компаньонов.

Нажатие кнопки Отмена запускает на выполнение процедуру

CommandButton2 Click

Закрывает диалоговое окно.

От Labell Click до Label4_Click

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

От Labels Click до Label18 Click

Вводит имя кандидата в дежурные в надпись соответствующей смены.

' Переменные уровня модуля

Dim Имя As String

Dim Надписи(1 То 2, 1 То 7) As Object

Private Sub CommandButtonl_Click()

Dim Смены_1, Смены_2, Смены_3 As Integer

Смены_1 = 0

Смены_2 = 0

Смены_3 = 0

For i = 1 То 2

For j = 1 То 7

If Надписи(i, j).Caption = Label1.Caption Then Смены_1 = Смены_1 + 1

If Надписи(i, j).Caption = Label2.Caption Then Смены_2 = Смены_2 + 1

If Надписи(i, j).Caption = Label3.Caption Then Смены_3 = Смены_3 + 1

Next j

Next i

TextBoxl.Text = CStr(Смены_1)

TextBox2.Text = CStr(Смены_2)

TextBoxS.Text = CStr(Смены_3)

End Sub

'

Private Sub CommandButton2_Click()

UserForml.Hide End Sub

' Процедуры считывания имени дежурного из группы Компаньоны

'

Private Sub Labell_Click ()

Имя = Label1.Caption Действие True, False, False

End Sub

'

Private Sub Label2_Click() Имя = Label2.Caption Действие False, True, False

End Sub

'

Private Sub Label3_Click()

Имя = Labels.Caption

Действие False, False, True

End Sub

'

Private Sub Label4_Click()

Имя = Label4.Caption Действие False, False, False

End Sub

'

' Процедуры ввода имени дежурного

'

Private Sub Label5_Click() Labels.Caption = Имя

End Sub

'

Private Sub Label6_Click0 Label6.Caption = Имя

End Sub

Private Sub Label7_Click() Label7.Caption = Имя

End Sub

Private Sub Label8_Click() Labels.Caption = Имя

End Sub

Private Sub Label9_Click() Label9.Caption = Имя

End Sub

Private Sub Labell0_Click() Labell0.Caption = Имя

End Sub

Private Sub Labelll_Click() Labelll.Caption = Имя

End Sub '

Private Sub Labell2_Click() Labell2.Caption = Имя

End Sub '

Private Sub Labell3__Click ()

Labell3.Caption = Имя

End Sub

'

Private Sub Labell4_Click() Labell4.Caption = Имя

End Sub

'

Private Sub Labell5_Click() Label15.Caption = Имя

End Sub

'

Private Sub Labell6_Click() Labell6.Caption = Имя

End Sub

'

Private Sub Labell7_Click() Labell7 .Caption = Имя

End Sub

Private Sub Labell8_Click() LabellS.Caption = Имя

End Sub

'

Private Sub UserForm_Initialize()

'

' Инициализация диалогового окна

Dim i, j As Integer

Set Надписи(1, 1) = Label5

Set Надписи(2, 1} = Label6

Set Надписи(1, 2) = Label7

Set Надписи(2, 2) = Label8

Set Надписи(1, 3) = Label9

Set Надписи(2, 3) = Labell0

Set Надписи(1, 4) = Label11

Set Надписи(2, 4) = Labell2

Set Надписи(1, 5) = Label13

Set Надписи(2, 5) = Label14

Set Надписи(1, 6) = Labell5

Set Надписи(2, 6) = Labell6

Set Надписи(1, 7) = Labell7

Set Надписи(2, 7) = Label18

'

With Label4

.Caption = ""

.BorderStyle = fmBorderStyleSingle

End With

With Imagel

.Picture = LoadPicture("ball.bmp")

.BorderStyle = fmBorderStyleNone

.PictureSizeMode = fmPictureSizeModeZoom

.PictureAlignment = fmPictureAlignmentTopLeft

.Visible = False

End With

'

With Image2

.Picture = LoadPicture("ball.bmp")

.BorderStyle = fmBorderStyleNone

.PictureSizeMode = fmPictureSizeModeZoom

.PictureAlignment = fmPictureAlignmentTopLeft

.Visible = False

End With

'

With Image3

.Picture = LoadPicture("ball.bmp")

.BorderStyle = fmBorderStyleNone

.PictureSizeMode = fmPictureSizeModeZoom

.PictureAlignment = fmPictureAlignmentTopLeft

.Visible = False

End With

'

For i = 1 To 2 For j = 1 To 7

With Надписи(i, j)

.Caption = ""

.BorderStyle = fmBorderStyleNone Select Case i Case 1

.BackColor = vbWhite Case 2

.BackColor = vbYellow End Select

End With

Next j

Next i

'

End Sub

Sub Действие(Flagl, Flag2, Flag3 As Boolean)

'

' Процедура, устанавливающая отображение или скрытие рисунков

'

Imagel.Visible = Flagl

Image2.Visible = Flag2

Image3.Visible = Flag3

End Sub

Самостоятельное задание

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


  • УРОК 14. ТЕМА: РАБОТА С ФАЙЛАМИ
    • ЦЕЛЬ УРОКА
    • ПРАКТИКА
      • Файл последовательного доступа
      • Файл произвольного доступа
      • Создание заставки приложения

Урок 14.

Тема: Работа с файлами

Цель урока

В данном уроке рассматриваются примеры работы с файлами последовательного и прямого доступа.

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

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

Практика

Файл последовательного доступа

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

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

Итак, в редакторе форм создадим диалоговое окно Файл последовательного доступа (рис. У 14.1).

Рис. У14.1. Диалоговое окно Файл последовательного доступа

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

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Отображает переключатель Подсказка и скрывает поле и кнопку Сохранить изменения?.
  3. Устанавливает свойства поля, кнопки, а также задает заголовок диалогового окна.

ToggleButton1_Click

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

Нажатие кнопки

Сохранить изменения?

запускает на выполнение процедуру

CommandButton1_Click

Записывает содержимое поля в файл.

Открытие

и

Запись

Процедуры считывают содержимое файла в поле и записывают содержимое поля в файл соответственно.

'

' Переменные уровня модуля

'

Option Explicit

Dim ИмяФайла As String

Dim Номер As Integer

'

Private Sub CommandButtonl_Click()

'

' По нажатию кнопки содержимое поля записывается в файл

Запись

End Sub

'

Private Sub ToggleButtonl_Click()

'

' При установке переключателя отображается поле,

' в которое выводится текст из файла, и кнопка для

' записи изменений в поле в файл.

' При снятии переключателя поле и кнопка скрываются

'

Номер = FreeFile

ИмяФайла = "c:\my_doc\book_ex\help.txt"

'

If ToggleButtonl.Value = True

Then TextBoxl.Visible = True

CommandButtonl.Visible = True

Открытие

End If

If ToggleButtonl.Value = False

Then CommandButtonl.Visible = False

TextBoxl.Visible = False

End If '

End Sub '

Private Sub UserForm_Initialize()

' Инициализация диалогового окна

'

With TextBoxl

.MultiLine = True

.ScrollBars = fmScrollBarsBoth

.Visible = False End With

ToggleButtonl.TripleState = False

With CommandButtonl

.Wordwrap = True

.Visible = False End With

UserForm2.Caption = "Файл последовательного доступа"

End Sub

Sub Запись()

' Запись файла

' Открывается файл последовательного доступа для записи информации

Open ИмяФайла For Output As Номер

' Содержание поля выводится в файл

'

Print #Номер, TextBoxl.Text

'

' Закрытие файла

'

Close Номер

'

End Sub

Sub Открытие()

'

' Считывание из файла в поле

' Открывается файл последовательного доступа для считывания информации

Open ИмяФайла For Input As Номер

' Содержание файла выводится в поле

'

TextBoxl.Text = Input(LOF(Номер), Номер)

'

' Закрытие файла '

Close Номер End Sub

Файл произвольного доступа

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

Рис. У14.2. Диалоговое окно для работы с файлом произвольного доступа

Приведенная ниже программа реализует простейшую базу данных с помощью файла произвольного доступа. Данный файл предназначен для хранения информации о студентах: фамилии, имени и группе. Диалоговое окно информация о студентах позволяет перемещаться от записи к записи, редактировать существующие и создавать новые записи. Переход от записи к записи производится при помощи счетчика. Отметим, что заголовок диалогового окна является переменным: при создании нового файла или записи в заголовок выводится информация о студентах, а при выводе информации о текущем студенте — его имя и фамилия. При активизации диалогового окна доступными для пользователя являются только поле со списком и кнопка открытие файла. В поле со списком отображаются все файлы текущей папки с расширением dat. Пользователь может выбрать файл из этого списка или ввести в поле имя нового файла. После ввода имени файла поле со списком и кнопка Открытие файла становятся недоступными для пользователя, а все остальные элементы управления, наоборот, становятся доступными. На стандартном листе модуля описан пользовательский тип студенттуре, который используется в модуле UserForm1 для объявления переменной данного типа. Эта переменная задает структуру в файле произвольного доступа. Имя открываемого или вновь создаваемого файла вводится в переменную ИмяФайла. Свободный номер для файла получается при помощи функции FreeFile и записывается в переменную Номер.

Итак, в редакторе форм создадим диалоговое окно для работы с файлом произвольного доступа (рис. У14.2).

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

UserForm Initialize
  1. Активизирует диалоговое окно.
  2. При помощи процедуры Управление задает режим доступа к элементам управления. Пользователю доступны только поле и кнопка Открытие файла .
  3. Задает первоначальный заголовок диалогового окна и надписи с номером текущей записи. 4. Выводит рисунки (стрелки) на поверхность двух кнопок.

Нажатие кнопки Открытие файла запускает на выполнение процедуру

CommandButton4_Click
  1. Открывает или создает файл по имени, которое введено в поле со списком Открытие файла .
  2. Считывает первую запись из файла в диалоговое окно при помощи процедуры Показать Запись .
  3. При помощи процедуры Управление задает режим доступа к элементам управления: пользователю теперь недоступны поле со списком и кнопка Открытие файла, а все остальные элементы управления, наоборот, становятся доступными.
  4. В надписи с номером текущей записи выводится также общее число записей открытого файла.

SpinButton1
  1. Устанавливает границы изменения счетчика. Отметим, что верхняя граница значения счетчика — число записей, может изменяться по ходу программы.
  2. Выводит текущее значение счетчика в пол Номер записи .
  3. Считывает текущую запись из файла в диалоговое окно при помощи процедуры показать Запись .

Нажатие кнопки Новая запись запускает на выполнение процедуру CommandButtonl_Click | Создает новую запись в конце файла.
Нажатие кнопки Записать изменения запускает на выполнение процедуру CommandButton2_Click | Считывает из диалогового окна в текущую запись файла информацию при помощи процедуры ЗаписатьЗапись .
Нажатие кнопки Закрыть запускает на выполнение процедуру CommandButton3 Click | Закрывает открытый файл и диалоговое окно.
Нажатие кнопки запускает на выполнение процедуру CommandButton5 Click | Осуществляет переход на последнюю запись.
Нажатие кнопки запускает на выполнение процедуру CommandButton6 Click | Осуществляет переход на первую запись.
Показать Запись | Выводит в поля диалогового окна запись с номером, указанным в переменной текущаяЗапись .
Записать Запись | Записывает в файл из полей диалогового окна запись с номером, указанным в переменной текущаяЗапись .

На листе стандартного модуля наберите описание пользовательского типа:

Option Explicit

Public Type СтудентТуре

Фамилия As String * 30

Имя As String * 30

Группа As String * 11

End Type

На листе модуля userForm1 наберите следующую программу:

Option Explicit

'

' Переменные уровня модуля

'

Dim Студент Аs СтудентТуре

Dim ДлинаФайла As Long

Dim ДлинаЗаписи As Long

Dim ИмяФайла As String

Dim ТекущаяЗапись As Long

Dim ПоследняяЗапись As Long

Dim Номер As Integer

'

Sub ПоказатьЗапись()

Get #Номер, ТекущаяЗапись, Студент

With Студент

TextBoxl.Text = Trim(.Фамилия)

TextBox2.Text = Trim(.Имя)

TextBoxB.Text = Trim(.Группа)

TextBox4.Text = ТекущаяЗапись

UserFormi.Caption = TextBoxl.Text & " " & TextBox2.Text

End With

End Sub

'

Sub ЗаписатьЗапись()

With Студент

.Фамилия = TextBoxl.Text

.Имя = TextBox2.Text

.Группа = TextBox3.Text

End With

Put Шомер, ТекущаяЗапись, Студент End Sub

'

Private Sub CommandButtonl_Click{}

'

' Кнопка Новая запись '

UserForml.Caption = "Информация о студентах"

'ЗаписатьЗапись

ПоследняяЗапись = ПоследняяЗапись + 1

With Студент

.Фамилия = ""

.Имя = ""

.Группа = "" End With

I'

TextBoxl.Text => ""

TextBox2.Text = ""

TextBox3.Text = ""

TextBox4.Text = CStr{ПоследняяЗапись}

'

Put #Номер, ПоследняяЗапись, Студент

'

ТекущаяЗапись = ПоследняяЗапись

'

End Sub

Private Sub CommandButton2_Click ()

'

' Кнопка Записать изменения '

Записать Запись

End Sub '

Private Sub CommandButton3_Click()

'

' Кнопка Закрыть '

Close #Номер UserForml.Hide

End Sub

Private Sub CommandButton4_Click()

' Открытие файла

'

Dim Начало As Boolean

Управление СЗаписями:=Тгие,

СФайлом:=False ИмяФайла = Trim(ComboBoxl.Text)

ДлинаЗаписи = Len(Студент) '

Номер = FreeFile

Open ИмяФайла

For Random As Номер Len = ДлинаЗаписи '

ТекущаяЗапись = 1

ПоследняяЗапись = FileLen(ИмяФайла) / ДлинаЗаписи

Начало = True

If ПоследняяЗапись = 0 Then

UserForml.Caption = "Информация о студентах"

ПоследняяЗапись = 1

Начало = False

End If

'

ПоказатьЗапись

If Начало = False Then

UserForml.Caption = "Информация о студентах"

End If

TextBoxl.SetFocus

Label4.Caption = "Номер записи из " & ПоследняяЗапись

'

End Sub

'

Private Sub CommandButton5_Click()

' Переход на последнюю запись

'

ТекущаяЗапись = ПоследняяЗапись

SpinButtonl.Value = ПоследняяЗапись Показать Запись

End Sub

'

Private Sub CommandButton6_Click()

'

' Переход на первую запись

'

SpinButtonl.Value = 1

ТекущаяЗапись = 1 ПоказатьЗапись

End Sub

'

Private Sub SpinButtonl_Change()

'

SpinButtonl.Min = 1

SpinButtonl.Max = ПоследняяЗапись

ТекущаяЗапись = SpinButtonl.Value

ПоказатьЗапись

'

End Sub

'

Private Sub UserForeinitialize ()

'

Dim ИмяПапки As String

Dim ИмяФайла As String

Dim ДлинаПути As Integer

Dim i As Integer

Управление СЗаписями:=False, СФайлом:=Тгие

UserForml.Caption = "Информация о студентах"

With CommandButtonS

.Picture = LoadPicture("vbal7f.bmp")

.PicturePosition = fmPicturePositionCenter

End With

With CommandButton6

.Picture = LoadPicture("vbal7b.bmp")

.PicturePosition = fmPicturePositionCenter

End With

Label4.Caption = "Номер записи"

ComboBoxl.Clear

ИмяПапки = CurDir

ДлинаПути = Len(ИмяПапки}

With Application.FileSearch

.FileName = "*.dat"

.SearchSubFolders = False

If .Execute(SortBy:=msoSortByFileName,

sortorder:=msoSortOrderAscending) > 0 Then

For i = 1 To .FoundFiles.Count

ИмяФайла = Right(.FoundFiles(i), Len{.FoundFiles(i))

ДлинаПути - 1) ComboBoxl.Addltem ИмяФайла

Next i

End If

ComboBoxl.Listlndex = 0

End With

End Sub

'

Sub Управление(СЗаписями As Boolean, СФайлом As Boolean)

'

Dim ЭлементУправления As Object

For Each ЭлементУправления In Controls

ЭлементУправления.Enabled = СЗаписями Next ЭлементУправления CommandButton4.Enabled = СФайлом

ComboBox1.Enabled = СФайлом

End Sub

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

Sub СчитываниеФайлаВМассив ()

Dim i As Integer

Dim Студенты() As СтудентТуре

Dim Студент As СтудентТуре

ДлинаЗаписи = Len(Студент)

ПоследняяЗапись = FileLen("Student.dat") / ДлинаЗаписи + 1

ReDim Студенты(1 To ПоследняяЗапись)

Open "Student.dat" For Random As #1 Len = ДлинаЗаписи

i = 1

Do Until EOF(l)

Get #1, i, Студенты(i)

' Вывод записи на рабочий лист

Cells (i, 1) .Value = Студенты(i) .Фамилия

Cells (i, 2).Value = Студенты(i).Имя

Cells(i, 3).Value = Студенты(i).Группа

i = i + 1 Loop Close #1

End Sub

Создание заставки приложения

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

Рис. У14.3. Пример заставки приложения

При многократном использовании приложения появление подобной заставки может начать действовать на пользователя, как красная тряпка на быка, поэтому, чтобы не злоупотреблять терпением и временем пользователя в подобных случаях, необходимо предусмотреть режим отказа от вывода заставки при активизации документа. Естественно, программа должна хранить где-то информацию о режиме работы: с заставкой или без нее. Эту и подобную информацию об установках режимов работы приложения обычно хранят в создаваемых дополнительно ini-файлах.

Рассмотрим простейший пример создания заставки приложения (рис. У14.3).

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

'

' Переменные уровня приложения '

Туре ФАЙЛ_INI

Информация As String * 30 Код As Boolean

End Type '

Public Заставка As ФАЙЛ_INI

'

Sub ПоказатьЗаставку() '

With UserForml

.Picture = LoadPicture("c:\my_doc\book_ex\bhv.bmp")

.PictureAlignment = fmPictureAlignmentCenter

.PictureSizeMode = fmPictureSizeModeZoom

.Caption = "Пример заставки"

.BorderColor = vbBlue

.BorderStyle = fmBorderStyleSingle

.CheckBoxl.BackColor = vbWhite .Show

End With

'

End Sub

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

Private Sub UserFormJIerminate()

Open "Файл.INI" For Random As #1

Len = Len(Заставка)

With Заставка

.Информация = "Отображать заставку:"

If CheckBoxl.Value = False Then .Код = False

End If

If CheckBoxl.Value = True Then .Код = True

End If End With

Put #1, 1, Заставка Close #1

End Sub

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

Private Sub Workbook_Open()

Open "Файл.INI"

For Random As #1

Len = Len(Заставка)

Get #1, 1, Заставка

Close #1

If Заставка.Код = False Then ПоказатьЗаставку

End Sub


  • ГЛАВА 3. МЕТОДЫ ОБЪЕКТА RANGE, ИСПОЛЬЗУЮЩИЕ КОМАНДЫ EXCEL
    • МЕТОД DATASERIES
    • МЕТОД AUTOFILL
    • МЕТОД AUTOFILTER
    • МЕТОД ADVANCEDFILTER
    • МЕТОД CONSOLIDATE
    • МЕТОД FIND
    • МЕТОД GOALSEEK
    • МЕТОД SORT
    • МЕТОД SUBTOTAL

Глава 3.

Методы объекта Range, использующие команды Excel

В данном разделе рассматриваются методы, использующие встроенные в Excel команды. Эти методы позволяют эффективно работать с диапазоном: заполнять его элементами по образцу, сортировать, фильтровать и консолидировать данные, строить итоговую таблицу и создавать сценарии, решать нелинейное уравнение с одной неизвестной.

Метод DataSeries

Метод DataSeries (прогрессия) создает профессии. Вручную метод DataSeries выполняется с помощью команды Правка, Заполнить, Прогрессия (Edit, Fill, Series).

Синтаксис:

Объект.DataSeries(rowcol, type, date, step, stop, trend)

Аргументы:

Объект

Диапазон с начальными данными прогрессии. Метод DataSeries позволяет одновременно строить несколько однотипных профессий с одинаковым шагом, но различными начальными элементами

rowcol

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

  • xlRows (по строкам)
  • xlCcoluims (по столбцам)

type

Определяет тип прогрессии. Допустимые значения:

  • xlLinear (линейная)
  • xlCrowth (геометрическая)
  • xlChronological (даты)
  • xlAutoFill (автозаполнение)

date

Определяет тип последовательности дат, если параметр type принимает значение xlChronological. Допустимые значения:

  • xlDay (ДНИ)
  • xlweekday (дни недели)
  • xlMonth (месяцы)
  • xlYear (годы)

step

Шаг изменения прогрессии. По умолчанию 1

stop

Предельное значение прогрессии. По умолчанию строится прогрессия во всем выделенном диапазоне

trend

Допустимые значения: True (создается арифметическая или геометрическая прогрессия) или False (создается список)

Приведем соответствие между аргументами метода DataSeries и построением последовательности на рабочем листе командой Правка, Заполнить, Прогрессия (Edit, Fill, Series) на примере построения геометрической профессии.

Шаг 1 | О В ячейку AI вводим первый член прогрессии, например 1. В методе DataSeries за начальное значение прогрессии отвечает объект, к которому применяется метод. В данном случае метод DataSeries надо применить к диапазону Range ("A1") . О Выберите команду Правка, Заполнить, Прогрессия (Edit, Fill, Series), которая приведет к появлению диалогового окна Прогрессия (Series) (рис. 3.1).

Рис. 3.1. Диалоговое окно Прогрессия

Шаг 2 | В диалоговом окне Прогрессия (Series) в группе Расположение (Series in) выберите, например, переключатель по строкам (Rows), т. к. будем строить геометрическую профессию в первой строке. В группе Тип (Туре) выберите переключатель геометрическая (Growth) В поле Шаг введите например, 1.2, а в поле Предельное значение (Stop value) - 3, т. е. геометрическая прогрессия будет строиться с шагом 1.2 до тех пор, пока ее члены не достигнут значения 3. Нажатие кнопки ОК приводит к построению требуемой профессии (рис. 3.2). В методе DataSeries за расположение профессии отвечает аргумент rowcoi. В данном случае ему надо присвоить значение xiRows. За тип прогрессии отвечает аргумент type, которому присвоим значение xiGrowth. За шаг и предельное значение отвечают аргументы step и stop, которым присвоим 1.2 и з соответственно. Таким образом, имеем: Range ( "А1" ). DataSeries Rowcol : =xlRows , Type : =xlGrowth, Step:=1.2, Stop:=3

Рис. З.2. Результат построения геометрической прогрессии

Метод AutoFill

Метод AutoFill (автозаполнение) автоматически заполняет ячейки диапазона элементами последовательности. Метод AutoFill отличается от метода DataSeries тем, что явно указывается диапазон, в котором будет располагаться прогрессия. Вручную этот метод эквивалентен расположению указателя мыши на маркере заполнения выделенного диапазона (в который введены значения, порождающие создаваемую последовательность) и протаскивании маркера заполнения вдоль диапазона, в котором будет располагаться создаваемая последовательность.

Синтаксис:

Объект.AutoFill(destination, type)

Аргументы:

Объект | Диапазон, с которого начинается заполнение
destination | Диапазон, который заполняется
type | Допустимые значения: xiFiilDefauit, xlFillSeries, xlFillCopy, xlFillFormats, xlFillValues, xlFillDays, xlFillWeekdays, xlFillMonths, xlFillYears, xlLinearTrend, xlGrowthTrend. По умолчанию xlFillDefault

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

Шаг 1 | В ячейку AI введите первый член профессии, например 5. В ячейку А2 введите второй член профессии, например 7. Выделите диапазон А1:А2, содержащий два первых члена арифметической профессии. Расположите указатель мыши над маркером заполнения выделенного диапазона так, чтобы он превратился в черный крест (рис. 3.3).

Рис. 3.3. Выделение двух первых членов прогрессии

Шаг 2 | При нажатой левой кнопке мыши, протащите маркер заполнения вниз по столбцу так, чтобы создать требуемую последовательность. В данном случае протащим маркер заполнения так, чтобы создать последовательность в диапазоне А1:А5 (рис. 3.4). Тот же результат получается, если аргументу Destination метода AutoFill присваивается Range ("Ai:A5"), аргументу туре присваивается xiFiiiDefauit, а метод применяется к диапазону Range ("A1:A2") . Таким образом, имеем: Range ( "Al :A2") .AutoFill Destination: =Range ( "Al : A5" ),_ Type : =xlFillDef ault

Рис. З.4. Построенная прогрессия

Метод AutoFilter

Метод AutoFilter (автофильтр) представляет собой простой способ запроса и фильтрации данных на рабочем листе. Если AutoFilter активизирован, то каждый заголовок поля выделенного диапазона данных превращается в поле с раскрывающимся списком. Выбирая запрос на вывод данных в поле с раскрывающимся списком, вы осуществляете вывод только тех записей, которые удовлетворяют указанным условиям. Поле с раскрывающимся списком содержит следующие типы условий: Все (АИ), Первые десять (Тор 10), Условие (Custom), конкретный элемент данных, Пустые (Blanks) и Непустые (NohBlanks). Вручную метод запускается посредством выбора команды Данные, Фильтр, Автофильтр (Data, Filter, AutoFilter).

При применении метода AutoFilter допустимы два синтаксиса.

Синтаксис 1:

Объект.AutoFilter

В этом случае метод AutoFilter выбирает или отменяет команду Данные, Фильтр, Автофильтр (Data, Filter, AutoFilter), примененную к диапазону, заданному в аргументе объект.

Синтаксис 2:

Объект.AutoFilter(field, criterial, operator, criteria2)

В этом случае метод AutoFilter выполняет команду Данные, Фильтр, Автофильтр (Data, Filter, AutoFilter) по критериям, указанным в аргументе.

Аргументы:

Объект | Диапазон
field | Целое, указывающее поле, в котором производится фильтрация данных
criterial И criteria2 | Задают два возможных условия фильтрации поля. Допускается использование строковой постоянной, например 101, и знаков отношений >, < ,>=, <=, =, <>
operator | Допустимые значения: П xiAnd (логическое объединение первого и второго критериев) П xior (логическое сложение первого и второго критериев) П xiTopioitems (для показа первых десяти элементов поля)

При работе с фильтрами полезны метод ShowAllData и свойства FilterMode и AutoFilterMode.

Метод ShowAllData | Показывает все отфильтрованные и неотфильтрованные строки рабочего листа
Свойства FilterMode | Допустимые значения: True (если на рабочем листе имеются отфильтрованные данные со скрытыми строками), False (в противном случае)
Свойство AutoFilterMode | Допустимые значения: True (если на рабочем листе выведены раскрывающиеся списки метода AutoFilter), False (в противном случае)

Приведем соответствие между аргументами метода AutoFilter и выполнением команды Данные, Фильтр, Автофильтр (Data, Filter, AutoFilter) при фильтрации базы данных регистрации туристов.

Шаг 1 | Выделяем диапазон A1 = E1, содержащий заголовки полей базы данных. Выберем команду Данные, Фильтр, Автофильтр (Data, Filter, AutoFilter). В результате в заголовках полей появятся раскрывающиеся списки (рис. 3.5). В этих раскрывающихся списках предлагаются варианты допустимой фильтрации. В методе AutoFilter за диапазон с названиями полей отвечает объект, к которому применяется метод. В данном случае метод AutoFilter надо Применить к диапазону Range ("A1: E1") .

Рис. 3.5. Раскрывающиеся списки метода AutoFilter

Шаг 2(а) | Отфильтруем в базе данных, например, только данные о клиентах, направляющихся в афины (рис. 3.6). С этой целью в раскрывающемся списке поля Направление тура выберем Афины. В результате на рабочем листе будут выведены только записи, соответствующие турам в Афины. В методе AutoFilter за выбор поля, в котором производится фильтрация, отвечает аргумент Field. В данном Случае для выбора поля Направление тура аргументу Field надо присвоить значение 4. За критерии, покоторым производится фильтрация, отвечают аргументы criteria1 и criteria2. В данном случае фильтрация производилась по одному критерию — АФИНЫ, поэтому только аргументу criterial надо присвоить значение АФИНЫ. Таким образом, имеем: Range ( "Al : El " ) . Select Selection. AutoFilte r Selection. AutoFilter Field:=4, Criteria1 : ="Афины"

Рис. 3.6. Фильтрация списка по критерию Афины

Рис. 3.7. Диалоговое окно Пользовательский автофильтр

Шаг 2(b) | При фильтрации по условию появляется диалоговое окно Пользовательский автофильтр (Custom AutoFilter), позволяющее отфильтровать записи по двум критериям в одном поле (рис. 3.7). Например, отфильтруем все туры в Афины и Берлин. В методе AutoFilter это соответствует присвоению аргументам Сriterial и criteria2 значений Афины и Берлин соответственно, а аргументу operator — значения хlor, т. к. будут отображаться либо туры в Афины, либо в Берлин . Таким образом, имеем: Range ("A1:E1") .Select Select ion. AutoFilter Selection. AutoFilter Field:=4, Criterial : ="=Афины" , Operator : =xlOr , Criteria2 :="=Берлин"

Метод AdvancedFilter

Метод AdvancedFilter (расширенный фильтр) является более мощным и универсальным средством фильтрации, чем метод AutoFilter. Он позволяет использовать фильтрацию по большему числу критериев, причем допустимо применение критериев, включающих формулы. Кроме того, метод AdvancedFilter позволяет фильтровать список с выводом результата фильтрации как непосредственно на том месте, где он расположен, так и в новое специфицированное место. Вручную метод запускается посредством выбора команды Данные, Фильтр, Расширенный фильтр (Data, Filter, Advanced Filter).

Синтаксис:

Объект.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)

Аргументы:

Action | Допустимые значения:: xiFilterinPiace (фильтровать список на месте) и xiFiiterCopy (скопировать результат на новое место)
CriteriaRange | Ссылка на диапазон с критериями
CopyToRange | Если параметр Action принимает значение xiFiiter-сору, то он указывает диапазон, куда будет копироваться результат фильтрации
Unique | Допустимые значения True (отбирается только один вариант записи из многократно встречающихся в списке) и False (отбираются все встречающиеся записи)

Приведем соответствие между аргументами метода Advanced Filter и выполнением команды Данные, Фильтр, Расширенный фильтр (Data, Filter, Advanced Filter) при фильтрации базы данных регистрации туристов.

Шаг 1

Выделяем диапазон AI : G13, содержащий фильтруемую базу данных. (рис. 3.8). Прежде чем выбирать команду Данные, Фильтр, Расширенный фильтр (Data, Filter, Advanced Filter), необходимовыполнить предварительные построения по созданию диапазона критериев. Верхняя строка диапазона критериев должна содержать заголовки полей фильтруемых данных. При этом нет необходимости включать все заголовки и сохранять их порядок. В диапазон критериев также должны входить строки с условиями фильтрации. Все условия в диапазоне критериев, записанные под заголовком поля, относятся к этому полю. При применении расширенного фильтра допустима запись нескольких условий в строке диапазона критериев. Условия, расположенные в одной строке, рассматриваются как условия, объединенные логической операцией и (And) , а расположенные в нескольких — логической операцией или (Or) В данном случае под диапазон критериев отведем диапазон A16:G17. В базе данных выберем записи обо всех мужчинах, которые едут в Лондон. С этой целью в ячейку С17 диапазона критериев введем значение муж, а в ячейку D17— Лондон.

Рис. 3.8. Фильтруемый список

Шаг 2

Выберем команду Данные, Фильтр, Расширенный фильтр (Data, Filter, Advanced Filter). Появится диалоговое окно Расширенный фильтр (Advanced Filter) (рис. 3.9).

  • Переключатели группы Обработка (Action) определяют, где будут располагаться отфильтрованные данные. В рассматриваемом случае не будем фильтровать список на месте, а скопируем результат фильтрации в другое место. Поэтому выберем переключатель скопировать результат в другое место (Copy to Another Location). У метода AdvancedFilter за выбор местоположения результата фильтрации отвечает аргумент Action. При данном выборе переключателя аргументу Action присваивается значение xlFilterCopy.

  • В поле Исходный диапазон (List Range) вводится ссылка на диапазон с фильтруемыми данными — AI : G13. П В поле Диапазон условий (Criteria Range) вводится ссылка на диапазон с критериями — A16:G17. У метода AdvancedFilter определение диапазона с критериями осуществляется с помощью аргумента criteriaRange. Поэтому ему присваивается диапазон Range ("A16:G17") .

  • В поле Поместить результат в диапазон (Copy to) дается ссылка на диапазон назначения. В данном случае A19:G19. Переменной в методе AdvancedFiiter, отвечающей за диапазон назначения, является CopyToRange. Поэтому ей надо присвоить диапазон Range ("A19:G19").

  • Флажок Только уникальные записи (Unique Records Only) определяет, будут ли отображаться все отфильтрованные записи или только по одной из всех одинаковых записей, удовлетворяющих критерию. В данном случае снимем флажок Только уникальные записи (Unique Records Only). Поэтому переменной unique присваиваем значение False. Подытожим все присвоения значений аргументов:

Range ( "A1 : G13" ) .AdvancedFiiter

Action :=xlFilterCopy,

CriteriaRange : =Range ("A16:G17" ) ,

CopyToRange : =Range ( " Al 9 : Gl 9 " ) , Unique : =False

Рис. З.9. Диалоговое окно Расширенный фильтр

ШагЗ | Нажатие кнопки OK приводит к фильтрации данных по указанному критерию.

Метод Consolidate

Метод consolidate (консолидация) применяется для объединения данных из нескольких диапазонов в одну итоговую таблицу, которые могут находиться на различных рабочих листах. Этот метод позволяет подвести итоги и обобщить однородные данные, размещенные в нескольких диапазонах. Вручную метод consolidate выполняется с помощью команды Данные, Консолидация (Data, Consolidate).

Синтаксис:

Объект.Consolidate(Sources, Function, TopRow, LeftColumn, CreateLinks)

Аргументы:

Объект

Диацазон, где будет построена итоговая таблица

Sources

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

Function

Функция, на основе которой строится итоговая таблица. Допустимые значения:

  • xlAverage (среднее)
  • xlcount (количество значений)
  • xlCountNums (количество чисел)
  • xlMax (максимум)
  • xlMin (минимум)
  • xlProduct (произведение)
  • xlstDev (несмещенная дисперсия)
  • xlstDevP (смещенная дисперсия)
  • xlSum (сумма) О xlvar (несмещенное отклонение)
  • xlVarp (смещенное отклонение)

TopRow

Допустимые значения: True (консолидация основывается на заголовках столбцов, консолидируемых диапазонов) и False (в противном случае)

LeftColumn

Допустимые значения: True (консолидация основывается на заголовках строк, консолидируемых диапазонов) и False (в противном случае)

  • Если консолидация происходит по расположению, то можно снять флажки подписи верхней строки (Top Row) и значения левого столбца (Left Column). Эти флажки должны быть установлены, если консолидация происходит согласно заголовкам строк и столбцов. В данном случае установим эти два флажка.
  • Флажок Создавать связи с исходными данными (Create Links to Source Data) позволяет установить связь между исходными данными и итоговым диапазоном так, что результаты будут обновляться при изменении данных. В данном случае сбросим этот флажок.

Рис. 3.10. Диалоговое окно диапазонов

Рис. 3.11. Диалоговое окно Консолидация

ШагЗ | Нажатие кнопки ОК приводит к построению итоговой таблицы (рис. 3.12). В методе Consolidate за исходные диапазоны отвечает аргумент Sources, за способ консолидации данных — аргумент Function, за установку флажков подписи верхней строки (Top Row), значения левого столбца (Left Column) и Создавать связи с исходными данными (Create Links to Source Data) — аргументы TopRow, LeftColumn и CreateLinks. Подытожим все присвоения значений аргументов для рассмотренного примера: Range ( "Al : D4 " ) . Consolidate_ Sources :=Ar r ay (" ' [Книга1] 1998 ' ! R1C1 : R4C4", " ' [Книга2] 1999' !R1C1:R4C4") , Function :=xlSum, TopRow: =True, Left Column :=True, CreateLinks :=False

Рис. 3.12. Результат консолидации

Метод Find

Метод Find (найти) используется для поиска ячейки, содержащей специфицированную информацию. Если метод Find не находит подходящей ячейки, он возвращает значение Nothing. Вручную метод Find вызывается командой Правка, Найти (Edit, Find).

Синтаксис:

Объект.Find(what, after, lookln, lookAt, searchOrder, searchDirection, matchCase, matchByte)

Аргументы:

Объект

Диапазон, где производится поиск

what

Элемент, который ищется

after

Первая ячейка, после которой производится поиск. Если аргумент опущен, то поиск производится во всем диапазоне

lookln

Область поиска. Допустимые значения:

  • xlFormulas (формулы)
  • xlValues (значения)
  • xlNotes (примечания)

LookAt

Допустимые значения:

  • xlwhoie (ячейки целиком)
  • xlPart (ячейки частично)

searchDirection

Направление поиска. Допустимые значения:

  • xlNext (к концу диапазона)
  • xl Previous (к началу)

searchOrder

Допустимые значения:

  • xlByRows (искать по строчкам)
  • xlByCoiumns (искать по столбцам)

Как отмечалось выше, вручную метод Find вызывается командой Правка, Найти (Edit, Find), а значения его аргументов соответствуют заполнению диалогового окна Найти (Find), отображаемого на экране посредством выбора команды Правка, Найти (Edit, Find) (рис. 3.13).

Рис. 3.13. Диалоговое окно Найти Методы FindNext и FindPrevious используются для повторения поиска.

Метод GoalSeek

Метод GoalSeek (подбор параметра) подбирает значение параметра (неизвестной величины), являющееся решением уравнения с одной переменной. Предполагается, что уравнение приведено к виду: правая часть является постоянной, не зависящей от параметра, который входит только в левую часть уравнения. Вручную метод GoalSeek выполняется с помощью команды Сервис, Подбор параметра (Tools, Goal Seek). Метод GoalSeek вычисляет корень, используя метод последовательных приближений, результат выполнения которого, вообще говоря, зависит от начального приближения. Поэтому для корректности нахождения корня надо позаботиться о корректном указании этого начального приближения.

Синтаксис:

Объект.GoalSeek(Goal, ChangingCell)

Аргументы:

Объект | Ячейка, в которую введена формула, являющаяся правой частью решаемого уравнения. В этой формуле роль параметра (неизвестной величины) играет ссылка на ячейку, указанную в аргументе ChangingCell
Goal | Значение левой части решаемого уравнения, не содержащей параметра
ChangingCell | Ссылка на ячейку, отведенную под параметр (неизвестную величину). Значение, введенное в данную ячейку до активизации метода Goaiseek, рассматривается как начальное приближение к искомому корню

Точность, с которой находится корень и предельно допустимое число итераций, используемых для нахождения корня, устанавливается свойствами MaxChange и Maxlterations объекта Application. Например, определение корня с точностью до 0,0001 максимум за 1000 итераций устанавливается инструкцией:

With Application

.Maxlterations = 1000

.MaxChange = 0.0001

End With

Вручную эти величины устанавливаются на вкладке Вычисления (Calculation) диалогового окна Параметры (Options), вызываемого командой Сервис, Параметры (Tools, Options).

Приведем соответствие между аргументами метода Goaiseek и нахождения корня уравнения х2 = 3 на рабочем листе вручную при помощи команды Сервис, Подбор параметра (Tools, Goal Seek).

Шаг 1
  • Ячейку AI отведем под неизвестную. Команда Подбор параметра (Goal Seek) находит корень уравнения методом последовательных приближений, результат которого зависит от начального приближения к корню. Команда Подбор параметра (Goal Seek) воспринимает значение, первоначально введенное в ячейку AI, за начальное приближение. Будем считать, что начальное приближение к корню равно 0. Введем 0 в ячейку A1. В методе Goaiseek аргумент ChangingCell отвечает за ссылку на ячейку, отведенную под неизвестную. В данномслучае аргументу ChangingCell Присваиваем Range ("A1") .
  • Ячейку А2 отведем под левую часть уравнения. При решении уравнения с помощью команды Подбор параметра (Goal Seek) уравнение надо преобразовать к такому виду, чтобы в правой его части содержалась только постоянная, не зависящая от неизвестной, которая должна входить только в его правую часть. В данном случае в ячейку А2 введем формулу =А1Л2 (рис. 3.14). В методе Goaiseek диапазон, к которому применяется метод, отвечает за ссылку на ячейку, отведенную под левую часть уравнения, содержащую неизвестную. В данном случае метод GoalSeek применяется к диапазону Range ("A2") .

Рис. 3.14. Ввод данных на рабочем листе при решении нелинейного уравнения

Шаг 2

Выберите команду Сервис, Подбор параметра (Tools, Goal Seek). В появившемся диалоговом окне Подбор параметра (Goal Seek) (рис. 3.15)

  • В поле Установить в ячейке (Set cell) введите ссылку на ячейку А2
  • В поле Изменяя значение ячейки (By changing cell) — ссылку на ячейку A1
  • В поле значение введите 3. В поле Значение (То value) вводится величина правой части уравнения. В методе Goaiseek аргумент Goal отвечает за правую часть уравнения. В данном случае присвоим аргументу Goal значение 3. Таким образом, имеем":

Range ("A2") .GoalSeek Goal:=3,

ChangingCell := Range ("A1")

Рис. 3.15. Диалоговое окно Подбор параметра

Шаг3 | Нажатие кнопки OK вызовет выполнение команды Подбор параметра (GoalSeek), результат расчета которой будет помещен в ячейки A1 (значение корня, в данном случае 1.731856) и А2 (значение левой части уравнения при найденном значении корня, в данном случае оно равно 2 .999325) (рис. 3.16). В силу того, что решение находится приближенно с указанной точностью, в ячейке А2 получилось 2.999325, а не ровно 3. Увеличивая точность, можно найти лучшее приближение к корню.

Рис. 3.16. Результат вычислений команды Подбор параметра

Метод Sort

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

Синтаксис:

Объект.Sort(keyl, orderl, key2, order2, key3, order3, header, orderCus-tom,
matchCase, orientation)

Аргументы:

Объект

Диапазон, который будет сортироваться

keyl

Ссылка на первое упорядочиваемое поле

orderl

Задает порядок упорядочивания. Допустимые значения:

  • xlAscending (возрастающий порядок)
  • xlDescending (убывающий порядок)

key2

Ссылка на второе упорядочиваемое поле

order2

Задает порядок упорядочивания. Допустимые значения:

  • xlAscending (возрастающий порядок)
  • xlDescending (убывающий порядок)

key3

Ссылка на второе упорядочиваемое поле

order3

Задает порядок упорядочивания. Допустимые значения:

  • xlAscending (возрастающий порядок),
  • xlDescending (убывающий Порядок)

header

Допустимые значения:

  • xlYes (первая строка диапазона содержит заголовок, который не сортируется)
  • xiNo (первая строка диапазона не содержит заголовок, по умолчанию считается данное значение)
  • xlGuess (Excel решает, имеется ли заголовок)

orderCustom | Пользовательский порядок сортировки. По умолчанию используется Normal
matchCase | Допустимые значения: True (учитываются регистры) и False (регистры не учитываются)
orientation | Допустимые значения: О xlTopToBottom (сортировка осуществляется сверху вниз, т. е. по строкам), П xlLeftToRight (слева направо, т. е. по столбцам)

Например, диапазон А1:С20 рабочего листа лист! сортируется следующей командой в порядке возрастания так, что первоначальная сортировка происходит по первому столбцу этого диапазона, а второстепенная — по второму.

Worksheets("Лист").Range("Al:C20").Sort keyl:=Worksheets("Sheetl").Range("Al"), key2:=Worksheets("Sheetl").Range("Bl")

Приведем соответствие между аргументами метода Sort и сортировкой данных на рабочем листе вручную при помощи команды Данные, Сортировка (Data, Sort).

Шаг 1 | Выделяем диапазон A1:G13, содержащий записи базы данных о туристах, которые должны быть отсортированы (рис. 3.17). В методе Sort за диапазон с записями, подлежащими сортировке, отвечает объект, к которому применяется метод. В данном случае метод sort надо применить к диапазону Range ("A1 :G13") .

Рис. 3.17. Сортируемые списки

Шаг 2

Выберем команду Данные, Сортировка (Data, Sort). В результате появится диалоговое окно Сортировка диапазона (Sort) (рис. 3.18).

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

  • Выбор в списках Сортировать по (Sort by), Затем по (Then by) и впоследнюю очередь по (Then by) определяют поля, используемые для фильтрации списка.
  • Переключатели по возрастанию (Ascending) и по убыванию (Descending), расположенные рядом с каждым раскрывающимся списком, определяют порядок сортировки.
  • Записи для идентификации полей, выводимые в раскрывающихся списках, определяются группой Идентифицировать поля по (My list has). Если в этой группе выбран переключатель подписям (первая строка диапазона) (Header row), то в раскрывающихся списках выводятся тексты из первых строк диапазонов. Если выбран переключатель обозначениям столбцов листа (No header row), то выводятся названия столбцов. Например, отсортируем базу данных о туристах в порядке возрастания полей, выбранных в качестве критериев сортировки, установив первоначальным критерием поле направление тура, вторичным — оплачено. Сортировку по третьему критерию производить не будем. Так как был выбран диапазон A1 : G13, содержащий названия полей, то для идентификации полей выберем в группе Идентифицировать поля по (My list has) переключатель подписям (первая строка диапазона) (Header row). В методе Sort за выбор поля, по которому производится первоначальная сортировка, отвечает аргумент key1. В данном случае для выбора поля направление тура аргументу key1 надо присвоить значение Range ("D2") . Порядок сортировки по первому критерию устанавливается аргументом Orderi. В данном случае сортируем по возрастанию, поэтому аргументу Order1присваиваем xlAscending. Вторичная сортировка происходит по полю Оплачено по возрастанию, поэтому аргументам key2 и Order2 присваиваем Range ("E2") и xiAscending соответственно. Переменной, отвечающей за идентификацию полей, является Header. В данном случае в группе Идентифицировать поля по (My list has) выбран переключатель подписям (первая строка диапазона) (Header row), поэтому переменной Header присвоим значение xiYes. Таким образом, имеем:
Range ( "Al : G13 " ) . Sort Key1i : =Range ("02") , Order1 : =xlAscending, Key2:=Range("E2") , Order2:=xlAscending, Header:= xlYes

ШагЗ

Нажатие кнопки OK приведет к сортировке записей по указанным критериям (рис. 3.19).

Рис. 3.18. Диалоговое окно Сортировка диапазона

Рис. 3.19. Результат сортировки

Метод Subtotal

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

Синтаксис:

Объект.Subtotal(GroupBy, Function, TotalList, Replace, PageBreaks, SummaryBelowData)

Аргументы:

Объект

Диапазон, для которого подводятся промежуточные итоги

GroupBy

Номер поля, по которому вычисляются промежуточные итоги

Function

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

  • xlAverage (среднее)
  • xlcount (количество значений)
  • xlCountNums (количество чисел)
  • xlMax (максимум)
  • xlWin (минимум)
  • xlProduct (произведение)
  • xlStoev (несмещенное отклонение)
  • xlStoevp (смещенное отклонение)
  • xlSum (сумма)
  • xlVar (несмещенная дисперсия)
  • xlVarP (смещенная дисперсия)

TotalList

Массив целых чисел с номерами полей, по которым вычисляются промежуточные итоги,

Replace

Допустимые значения: True (существующие промежуточные итоги будут замещены) и False (в противном случае)

PageBreaks

Допустимые значения: True (после каждой группы будет вставлено по символу разрыва страницы) и False (в противном случае)

SummaryBelowData

Определяет местоположение для вывода промежуточных итогов. Допустимые значения: П xlSummaryAbove (промежуточные итоги будут выведены над данными) П и xlSummaryBeiow (промежуточные итоги будут выведены под данными)

Основным методом, связанным с Subtotal, ывляется метод RemoveSubtotal, удаляющий промежуточные итоги с рабочего листа. Метод RemoveSubtotal применяется к объекту Range.

Приведем соответствие между аргументами метода subtotal и подведением промежуточных итогов на рабочем листе вручную при помощи команды Данные, Промежуточные итоги (Data, Subtotal) на примере подсчета продаж компьютеров по месяцам и нахождения средних объемов продаж (рис. 3.20).

Рис. 3.20. Отчет о продажах компьютеров

Шаг 1 | Выделим ячейки списка, в данном случае диапазон A1:C16. Выберем команду Данные, Промежуточные итоги (Data, Subtotal). На экране отобразится диалоговое окно Промежуточные итоги (Subtotal) (рис. 3.21).

Рис. 3.21. Диалоговое окно Промежуточные итоги

Рис. 3.22. Результат выполнения команды Промежуточные итоги

Шаг 2

В диалоговом окне Промежуточные итоги (Subtotal):

  • Раскрывающийся список При каждом изменении в (Ateach change) устанавливает, по какому столбцу группируются данные. В данном случае выберем компьютер.
  • Раскрывающийся список Операция (Use function) устанавливает операцию, выполняемую над данными. Выберем Сумма (Sum).
  • Список Добавить итоги по (Add subtotal to) устанавливает данные, которые участвуют в расчетах. В данном случае выберем Количество.
  • Флажок Заменить текущие итоги (Replace current subtotals) определяет, надо ли заменить старые промежуточные итоги на вновь созданные. Сбросим этот флажок.
  • Флажок Конец страницы между группами (Page break between groups) определяет, надо ли вставлять символ конца страницы после каждой группы, для которой подводятся промежуточные итоги. Сбросим этот флажок.
  • Флажок Итоги под данными (Summary below data) определяет расположение промежуточных итогов под или над данными, по которым подводятся итоги. Расположим их под данными и поэтому установим флажок Итоги под данными (Summary below data).

ШагЗ

Нажмем кнопку ОК в диалоговом окне Промежуточные итоги (Subtotal), что приведет к созданию промежуточных итогов на рабочем листе по выделенному диапазону данных (рис. 3.22).

На VBA тот же результат достигается применением следующих инструкций:

Range("Al:C16")

.Select Selection. Subtotal GroupBy:=l, Function : =xlSum, TotalList:=Array (3) , Replace :=False, PageBreaks:=False, SuramaryBelowData : =True

Шаг 4

Добавим показатель средней реализации компьютеров по месяцам к уже найденным объемам их реализации. С этой целью выделим ячейки списка с данными и уже подведенными ранее итогами, в данном случае диапазон AI :С20. Выберем команду Данные, Промежуточные итоги (Data, Subtotal). На экране отобразится диалоговое окно Промежуточные итоги (Subtotal). В этом диалоговом окне:

  • В раскрывающемся списке При каждом изменении в (At each change) выберем компьютер.
  • В раскрывающемся списке Операция (Use function) выберем Среднее (Average).
  • В списке Добавить итоги по (Add subtotal) установим флажок Количество.
  • Сбросим флажок Заменить текущие итоги (Replace current subtotals).
  • Сбросим флажок Конец страницы между группами (Page break between groups).
  • Установим флажок Итоги под данными (Summary below data).

Шаг 5

Нажмем кнопку OK в диалоговом окне Промежуточные итоги (Subtotal), что приведет к добавлению показателя средней реализации компьютеров по месяцам к уже существующим промежуточным итогам на рабочем листе (рис. 3.23). На VBA тот же результат достигается применением следующих инструкций:

Range ("A1:C20") .Select Selection. Subtotal GroupBy:=l, Function: =xlAverage, TotalList:=Array (3) , Replace : =False, PageBreaks : =False, SummaryBelowData : =True

Шаг 6

Вместе с промежуточными итогами метод Subtotal создает структуру, которая позволяет управлять отображением детализации таблицы. Управляющими элементами структуры являются кнопки, отображаемые на левой стороне рабочего листа с номерами уровней иерархии, и кнопки, помеченные знаками <+> и <— >. Нажатие на кнопку <+> или <— > позволяет отобразить или скрыть детализацию данного элемента структуры, а на кнопки с номером уровня — детализацию целого уровня. Отобразим, например, только промежуточные итоги без их детализации. Для этого надо нажать сначала кнопку 2, а затем 3 (рис. 3.24). На VBA тот же результат достигается применением следующих инструкций:

ActiveSheet . Outline . ShowLevels RowLevels : =2 ActiveSheet . Outline . ShowLevels RowLevels : =3

Здесь свойство Outline рабочего листа возвращает объект Outline (структура), а свойство ShowLevels объекта outline устанавливает отображаемый уровень детализации.

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

Шаг7 | Для удаления промежуточных итогов следует выделить данные с этими итогами, выполнив команду Данные, Промежуточные итоги (Data, Subtotal) и нажать кнопку Убрать все (Remove All) в появившемся диалоговом окне Промежуточные итоги (Subtotal). На VBA тот же результат в данном примере достигается применением следующих инструкций Range ("A1:C24") .Select Selection . RemoveSubtotal

Рис. 3.24. Вывод промежуточных итогов без детализации


  • ГЛАВА 4. СЦЕНАРИИ И ОПРЕДЕЛЕНИЕ СТРУКТУРЫ ДАННЫХ
    • ОБЪЕКТ SCENARIO
    • ОБЪЕКТ OUTLINE

Глава 4.

Сценарии и определение структуры данных

Объект Scenario

Объект scenario (сценарий) позволяет хранить несколько значений в одной ячейке. Каждое уникальное значение в ячейке или каждая уникальная группа значений для группы ячеек называется сценарием. Семейство scenarios (сценарии) содержит все сценарии рабочего листа. Вручную сценарии создаются с помощью команды Сервис, Сценарии (Tools, Scenarios).

Рассмотрим методы объекта Scenario.

Add

Добавляет новый сценарий.

Синтаксис:

Add (Name, ChangingCells, Values, Comment, Locked, Hidden)

Аргументы:

  • Name — имя сценария
  • ChangingCells — диапазон, отводимый под изменяемые ячейки сценария
  • values — массив значений, вводимых в изменяемые ячейки
  • Comment — текстовая строка комментариев
  • Locked — допустимые значения: True (заблокировано изменение сценария) и False (в противном случае)
  • Hidden — допустимые значения: True (сценарий скрыт) и False (в противном случае)

Show

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

ChangeScenario

Изменяет группу изменяемых ячеек.

Синтаксис:

ChangeScenario (ChangingCells, Values)

  • ChangingCells — группа ячеек, которая будет играть роль новой группы изменяемых ячеек
  • values — массив с новыми значениями изменяемых ячеек

Delete

Удаляет сценарий

Рассмотрим наиболее часто используемые свойства объекта scenario.

ChangingCells | Возвращает диапазон изменяемых ячеек. Например, Scenarios (1) .ChangingCells . Select
Value | Возвращает массив текущих значений изменяемых ячеек. Например, Scenarios (I) .Values = Worksheets ( "Sheetl") .Range ("C5:T5") или Scenarios (1) .Values = Array (1, 3, 5, 7, 11, 13, 17, 19)

Приведем соответствие между аргументами методов Add и show семейства scenarios и созданием сценариев вручную при помощи команды Сервис, Сценарии (Tools, Scenarios) на примере создания расчета суммарных затрат (рис. 4.1) при двух вариантах (сценариях) стоимостей комплектующих и расходных материалов (табл. 4.1).

Рис. 4.1. Расчет суммарных затрат

Таблица 4.1. Два варианта стоимостей

Вариант | Комплектующие | Расходные материалы
1 2 | 1000 800 | 200 300

Суммарные затраты вычисляются в ячейке В5 по формуле:

=СУММ(В3:В4)

Шаг 1 | Выберите команду Сервис, Сценарии (Tools, Scenarios). Появится диалоговое окно Диспетчер сценариев (Scenario Manager) (рис. 4.2). Нажмите кнопку Добавить (Add).

Рис. 4.2. Диалоговое окно Диспетчер сценариев

Шаг 2

В появившемся диалоговом окне Добавление сценария (Add Scenario) (рис. 4.3):

  • В поле Название сценария (Scenario Name) вводится имя создаваемого сценария. Введите, например, вариант 1 .
  • В поле Изменяемые ячейки (Changing Cells) вводятся ссылки на ячейки, в которые будут заноситься значения, соответствующие данному сценарию. Введите ссылки на диапазон ячеек $В$3:$В$4.
  • Нажмите кнопку ОК.

ШагЗ

В появившемся диалоговом окне Значения ячеек сценария

(Scenario Values) в поля, помеченные именами изменяемых ячеек, . вводятся соответствующие значения (рис. 4.4). В данном случае в поле $в$з введите юоо, а в поле $в$4 введите 200. Нажатие кнопки Добавить (Add) приведет к появлению диалогового окна Добавление сценария (Add Scenario), в котором следует ввести параметры второго сценария и т. д. После создания требуемого количества сценариев нажмите кнопку ОК, которая приведет к завершению создания сценариев.

Рис. 4.3. Диалоговое окно Добавление сценария

Рис. 4.4. Диалоговое окно Значения ячеек сценария

Шаг 4

В появившемся диалоговом окне Диспетчер сценариев (Scenario Manager) выбором в списке Сценарии (Scenarios) соответствующего сценария и нажатием на кнопку Вывести (Show) производится ввод соответствующих этому сценарию значений в изменяемые ячейки (рис. 4.5).Приведенное выше создание вручную сценариев программируется следующими инструкциями:

ActiveSheet . Scenarios . Add Name := "Вариант 1", ChangingCells:=Range ("B3:B4") , Values:=Array("1000", "200") , Comment :="Автор: Андрей Гарнаев, 28.03.99", Locked:=True, Hidden:=False ActiveSheet. Scenarios. Add Name : ="Вариант 2", ChangingCells:=Range("B3:B4") , Values :=Array ("800", "300"), Comment :="Автор: Андрей Гарнаев, 28.03.99", Locked :=True, Hidden :=False Отображение сценариев на рабочем листе осуществляется следующими двумя инструкциями:

ActiveSheet . Scenarios ( "Вариант 1" ) . Show ActiveSheet . Scenarios ( "Вариант 2 " ) . Show

Рис. 4.5. Диалоговое окно Диспетчер сценариев после создания двух сценариев

Объект Outline

В общем случае структура — это такой режим работы, который позволяет разбить данные на определенные уровни детализации, а также просматривать только заголовки и подзаголовки документа. Структура наиболее полезна при создании итоговых отчетов, где не требуется чрезмерная детализация. Структуру невозможно создавать на основе произвольной таблицы данных. Ее построение основывается на таблицах с иерархической структурой данных. Объект Outline (структура) по своей иерархии вкладывается в семейство рабочих листов worksheets. Свойство outline рабочего листа возвращает объект Outline. Вручную на рабочем листе структура создается с помощью команды Данные, Группа и структура, Создание структуры (Data, Group and Outline, Auto Outline).

Приведем основные свойства объекта outline.

AutomaticStyles | Допустимые значения: True (структура строится на основе автоматических стилей) и False (в противном случае)
SummaryColumn | Возвращает местоположение итоговых столбцов. Допустимые значения: xiLef t (итоговые столбцы располагаются слева от столбцов, по которым подводятся итоги) и xiRight (итоговые столбцы располагаются слева)
SummaryRow | Возвращает местоположение итоговых строк. Допустимые значения: xiAbove (итоговые строки располагаются выше строк, по которым подводятся итоги) и xiBelow (итоговые строки располагаются ниже)

Обсудим наиболее часто используемые методы объекта outline.

ShowLevels

Отображает указанное число уровней структуры по строкам и столбцам.

Синтаксис:

ShowLevels (RowLevels, ColumnLevels)

Аргументы:

  • RowLevels - устанавливает число отображаемых уровней структуры по строкам
  • ColumnLevels - устанавливает число отображаемых уровней структуры по столбцам

ClearOutline

Удаляет структуру

Приведем соответствие между построением структуры вручную и аргументами методов и свойств объекта outline на примере организации отчета о продаже в виде структуры с двумя уровнями по столбцам и строкам (рис. 4.6). В строках Итого отчета и столбцах 1-й кв. и 2-й кв. вычисляется итоговая информация по продаже компьютеров.

Рис. 4.6. Отчет о продажах

Шаг 1

Выберите команду Данные, Группа и структура, Настройка (Data, Group and Outline, Settings). На экране отобразится диалоговое окно Структура документа (Outline) (рис. 4.7):

  • Флажки в строках под детальными (Summary Rows Below Details) и в столбцах справа от детальных (Summary Columns to Right of Details) устанавливают расположение итоговых данных относительно детальных. В данном случае установите оба флажка.
  • Флажок Автоматические стили (Automatic Styles) устанавливает, будут ли ячейки при создании структуры отформатированы стандартными стилями. В данном случае установите этот флажок.
  • Нажмите кнопку Создать (Create). Описанные выше действия соответствуют следующим двум инструкциям:

ActiveSheet .Outline . AutomaticStyles = True Selection . AutoOutline

Шаг 2

Теперь таблица отструктурирована (рис. 4.8). При выводе структуры по левому и верхнему краю рабочего листа отображаются кнопки, помеченные символами "+" и "-", которые управляют отображением и скрытием уровней детализации структуры, а также номеров уровней. Щелчок на кнопке со знаком плюс приводит к отображению детализации, а на кнопке со знаком минус — к скрытию детализации. Щелчком на кнопке с номером уровня детализации также можно управлять отображением и скрытием всего уровня.Нажмите кнопки со знаком минус — с тем, чтобы скрыть детализацию отчетной таблицы (рис. 4.9). Описанные выше действия соответствуют следующей единственной инструкции:

ActiveSheet. Outline. ShowLevels RowLevels:=l, ColumnLevels : =1

Рис. 4.7. Диалоговое окно Структура документа

Рис. 4.8. Структурированная таблица с детализацией

ШагЗ

Если структуризация листа не требуется, то ее можно отменить, выбрав команду Данные, Группа и структура, Удалить структуру (Data, Group and Outline, Clear Outline). Тот же результат достигается следующей инструкцией:

Selection. ClearOutline

Рис. 4.9. Структурированная таблица без детализации


  • ГЛАВА 5. ДИАГРАММЫ
    • ОБЪЕКТЫ CHART и CHARTOBJECT
    • СВОЙСТВА ОБЪЕКТА CHART
    • МЕТОДЫ ОБЪЕКТА CHART
    • ЛИНИЯ ТРЕНДА

Глава 5.

Диаграммы

Объекты Chart и ChartObject

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

В Excel различаются два вида диаграмм: внедренная на рабочий лист и созданная на специальном листе для диаграмм. Итак, семейство sheets (листы) включает в себя семейства: worksheets (рабочие листы) и charts (листы диаграмм). Объектами семейства charts являются листы диаграмм, но это семейство не включает в себя диаграммы, непосредственно встроенные в рабочие листы. Такие диаграммы принадлежат семейству chartobjects. Таким образом, объект ChartObject встроен В Объект Worksheet, a Chart — В workbook. Иерархия этих объектов показана на рис. 5.1. Свойства и методы этих объектов в основном аналогичны.

Рис. 5.1. Иерархия объектов Chart и ChartObject

Свойства объекта Chart

Перечислим основные свойства объекта chart и семейства charts.

ChartArea | Возвращает объект ChartArea — область на листе, отведенная под диаграмму. В следующем примере устанавливается цвет элементов объекта ChartArea. With Charts { "Диаграмма") .ChartArea . Interior . Colorlndex = 3 . Border . Colorlndex = 5 End With
PlotArea | Возвращает объект PlotArea — часть области ChartArea, отведенная непосредственно под диаграмму. В следующем примере устанавливается Цвет объекта PlotArea: Charts (1) . PlotArea . Interior . Colorlndex = 8
ChartTitle | Возвращает объект ChartTitle, являющийся заголовком диаграммы. В следующем примере задается заголовок диаграммы отчет : With Charts ( "Отчет") .HasTitle = True . ChartTitle . Text = "Продажи за май" End With
ChartType | Возвращает тип диаграммы: xlArea, xlBar,xlColumn, xlLine, xlPie, xlRadar, xlXYScatter, xlCombination, xl3DArea, xlSDBar, xl3DColumn, xl3DLine, xl3DPie, xlSDSurface, xlDoughnut
Legend | Возвращает объект Legend. Используется для изменения легенды. Например: ChartObjects (1).Chart. Legend. Font .Bold = True
Rotation | Возвращает угол поворота 3-мерной диаграммы вокруг z-оси. Допустимыми являются значения от 0° до 360°. По умолчанию принимается угол, равный 20°
Elevation | Возвращает угол возвышения для обзора трехмерной диаграммы. Допустимыми являются значения от —90° до 90°. По умолчанию принимается угол, равный 15°

PlotBy

Допустимые значения: xlCoiumns (столбцы используются как ряды данных при построении диаграммы), xlRows (строки используются как ряды данных при построении диаграммы)

PlotVisibleOnly

Допустимые значения: True (диаграмма строится только по видимым ячейкам), False (в противном случае)

Floor, Corners, Walls

Возвращают соответственно объекты Floor, Corners, walls, используемые при построении трехмерных диаграмм. При отображении таких диаграмм для создания иллюзии трехмерности диаграмма отображается на фоне открытого куба, основание которого задается объектом Floor, углы — Corners, а две боковые стенки — wails. В следующем примере устанавливаются цвета объектов Floor и walls и выбирается объект corners:

With Charts (1) .. Floor . Interior . Colorlndex = 5 .Walls. Border. Colorlndex = 3 /Corners . Select End With

AutoScaling

Допустимые значения: True (трехмерная диаграмма автоматически масштабируется так, чтобы по размеру совпадать с двумерной), False (диаграмма не масштабируется)

DepthPercent, Height Per cent

Применяется только к трехмерным диаграммам. Возвращает глубину и высоту диаграммы в процентах к ее ширине

DisplayBlasnksAs

Допустимые значения:

  • xlNotPiotted (при построении диаграммы пустые ячейки игнорируются)
  • xlInterpoiated (значения в пустых ячейках интерполируются)
  • xlZero (значения в пустых ячейках считаются равными нулю)

Protect Contents, ProtectData, ProtectDrawingObjects, Protect Formatting, ProtectGoalSeek, Protect ionMode, ProtectionSelection,

Возвращает True, если указанный элемент диаграммы имеет защиту, и False — в противном случае

HasAxis, HasDAtaTable, HasLegend, HasTitle

Возвращает True, если указанный элемент имеется на диаграмме, и False — в противном случае

Методы объекта Chart

В данном разделе перечислены основные методы объекта chart.

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

Синтаксис:

Chartwizard(Source, Gallery, Format, PlotBy,

CategoryLabels, SeriesLabels, HasLegend, Title,

CategoryTitle, ValueTitle, ExtraTitle)

Аргументы:

Source

Диапазон, по которому строится диаграмма

Gallery

Тип диаграммы.

Допустимые значения:

xiArea,

xlBar, xlColumn, xlLine, xlPie, xlRadar, xlXYScatter, xlCombination, xl3DArea, xl3DBar, xl3DColumn, xl3DLine, xl3DPie,

xl3DSurface, xlDoughnut или xl Default Auto Format

Format

Формат для данного типа диаграммы. Каждый тип имеет до десяти форматов

PlotBy

Допустимые значения: XIROWS (строки) и xlColumns (столбцы)

CategoryLabels

Указывает число строк (столбцов) с метками категорий (т. е. данных, отводимых под ось абсцисс)

SeriesLabels

Указывает число строк (столбцов) с метками рядов (т. е. данных, отводимых под заголовки)

HasLegend

Допустимые значения: True (отображать легенду) и False (не отображать легенду)

Title | Название диаграммы
CategoryTitle | Название оси абцисс
ValueTitle | Название оси ординат
ExtraTitle | Название z-оси для трехмерных диаграмм

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

Axes

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

Axes (Type, Group)

Аргументы:

  • Tуре — определяет тип оси. Допустимые значения:
    xlCategory, xlSeries И xlValue
  • Group — допустимые значения: xi Primary и
    xlSecondary

Пример:

With Charts (1) .Axes (xlCategory) .HasTitle = True . AxisTitle. Caption = "Доход" End With

SeriesCol lection

Возвращает семейство объектов series или объект этого семейства.

Синтаксис (для одного объекта из семейства):

SeriesCollection ( Index)

Синтаксис (для семейства объектов):

SeriesCollection

  • Index — имя или номер элемента

Пример:

Charts (1) . SeriesCollection (1) .HasDataLabels = True

SetSourceData

Устанавливает источник данных диаграммы.

Синтаксис:

SetSourceData (Source, PlotBy)

  • source — диапазон, на основе которого строится диаграмма
  • PlotBy — допустимые значения: xlColumns (данные расположены по столбцам) и XIROWS (данные расположены по строкам)

Пример:

ActiveChart . SetSourceData Source :=Sheets (1) .Range ("A1 : F1") , PlotBy:=xlRows

Export

Экспортирует диаграмму в графический формат.

Синтаксис:

Export (FileName, FilterName, Interactive)

  • FileName — имя файла, в который будет записана диаграмма в графическом формате
  • FilterName — имя графического фильтра в том виде, как он записан в графическом формате
  • Iinteractive — допустимые значения: True (для того чтобы показать диалоговое окно в процессе фильтрации) и False (в противном случае) Пример экспорта диаграммы в GIF-файл:

ActiveChart . Export FileName : ="График . gif " , FilterName := "GIF"

Location

Передвигает диаграмму на новое место.

Синтаксис:

Location (Where, Name)

  • where — указывает, будет ли диаграмма располагаться на новом листе диаграмм (xlLocationAsNewSheet), внедряться как объект на рабочий лист (xiLocationAsobject) или ее местоположение будет определяться автоматически
    (xlLocationAutomatic)
  • Name — имя листа диаграммы, если аргумент where принимает значение xlLocationAsNewSheet, либо имя рабочего листа, если аргумент where принимает значение xlLocationAsobject

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

Add

Создает новую диаграмму.

Синтаксис:

Add (Left, Top, Width, Height)

  • Left, Top — координаты левого верхнего угла диаграммы
  • width, Height — ширина и высота диаграммы

Delete

Удаляет элемент семейства

CopyPicture

Копирует диаграмму в буфер обмена как рисунок.

Синтаксис:

CopyPicture (Appearance, Format, Size)

  • Appearance — устанавливает, каким образом диаграмма копируется. Допустимые значения: xlScreen (диаграмма копируется в том виде, в котором она отображается на экране) и xlPrinter (диаграмма копируется так, как она выглядит после вывода на печать)
  • Format — формат рисунка. Допустимые значения: xlPicture И xlBitmap

BringToFront

Отображает диаграмму на переднем плане

SendToBack

Отображает диаграмму на заднем плане

Select

Выбирает диаграмму

Приведем соответствие между построением графика вручную и аргументами метода ChartWizard на примере построения диаграммы из рис. 5.2.

Рис. 5.2. Пример диаграммы

Шаг 0 | Выделите диапазон, на основе которого будет строиться диаграмма (рис. 5.3). Этот диапазон вводится в аргумент source. В данном примере аргументу source присваивается значение Range ("A1:B11") .

Рис. 5.4. Диалоговое окно первого шага работы мастера диаграмм

Шаг 1 | Нажмите кнопку Мастер диаграмм (Chart Wizard) чтобы отобразить на экране диалоговое окно первого шага мастера диаграмм (рис. 5.4). Выберите тип и вид диаграммы на первом шаге работы мастера диаграмм. Выбранный тип диаграммы вводится в аргумент Gallery, а тип — в аргумент Format. В данном случае аргументу Gallery присваивается значение xlLine, а аргументу Format — 1. Нажмем кнопку Далее > (Next >) для перехода к следующему шагу построения диаграммы.
Шаг 2
  • На вкладке Диапазон данных (Data Range) (рис. 5.5) второго шага работы мастера диаграмм при помощи переключателей Ряды в (Data Series In) укажите, как расположены ряды данных (в столбцах или строках), на основе которых строится диаграмма. 'Выбранное расположение вводится в аргумент piotBy. В данном случае аргументу PiotBy присваивается значение xicoiumns (в столбцах). В поле Диапазон (Data Range) вводится диапазон, на основе которого строится диаграмма. В данном случае =лист1 ! $A$1 : $B$11 .
  • На, вкладке Ряд (Series) (рис. 5.6) второго шага работы мастера диаграмм исключите РЯД! из списка Ряд (Series), нажав кнопку Удалить (Delete), т. к. первый ряд из диапазона данных будет отведен под метки оси абсцисс. Переменной categoryLabeis присваивается число столбцов (строк) диапазона данных, отводимых под значения, которые будут отображены на оси абсцисс. В данном случае аргументу CategoryLabeis присваивается значение 1, т. к. только первый столбец (A1:A11) отводится под значения, отображаемые на оси абсцисс. Кроме того, тот же диапазон данных =Лист1 ! $А$1 : $А$11 вводится в поле Подписи оси X (Category (X) Axis Labels). П В поле Значения (Values) приводится ссылка на диапазон, содержащий значения ряда данных. В данном случае =Лист1!$В$1:$В$11. В Переменную SeriesLabels водится число строк (столбцов) данных, отводимых под название различных ветвей диаграмм. Обычно эта переменная используется совместно с легендой для того, чтобы различать ветви диаграмм, построенные в одной и той же системе координат не только по цвету или внешнему виду, но и по этим названиям. В данном случае аргументу SeriesLabels присваивается значение 0, т. к. строится только одна диаграмма.
Нажмите кнопку Далее > (Next >) для перехода к следующему шагу построения диаграммы.

Рис. 5.5. Вкладка Диапазон данных диалогового окна второго шага работы мастера диаграмм

Рис. 5.6. Вкладка Ряд диалогового окна второго шага работы мастера диаграмм

ШагЗ
  • На вкладке Заголовки (Titles) (рис. 5.7) третьего шага работы мастера диаграмм заполняются поля Название диаграммы (Chart Title), Ось X (категорий) (Category (X) Axis) и Ось Y(значений) (Value (Y) Axis) для отображения названий диаграммы и осей. Эти названия вводятся в аргументы Title, CategoryTitie и vaiueTitie соответственно. В данном случае этим аргументам присвоены значения график, Аргумент и Функция.
  • На вкладке Легенда (Legend) третьего шага работы мастера диаграмм с помощью флажка Добавить легенду (Add Legend) устанавливается, надо ли отображать легенду. Результат установки вводится в аргумент Has Legend. В данном случае сбросим флажок Добавить легенду (Add Legend), после чего аргументу HasLegend присваивается значение False, т. к. легенда не отображается.
  • Нажмите кнопку Далее >(Next >) для перехода к следующему шагу построения диаграммы.

Рис. 5.7.Вкладка Заголовки диалогового окна третьего шага работы мастера диаграмм

ШагЗ

На четвертом шаге работы мастера диаграмм выбирается, строится ли диаграмма как внедренный объект в рабочий лист, или на отдельном листе диаграмм. Для создания диаграммы на отдельном листе выберите переключатель отдельном (As New Sheet), а для создания внедренной диаграммы — переключатель имеющемся (As Object In) (рис. 5.8). Выберем переключатель имеющемся (As Object In). Результат выбора не отображается в методе ChartWizard.

Нажатие кнопки Готово (Finish) завершает процесс создания диаграммы. Подытожим произведенные присвоения аргументам метода ChartWizard.

' Добавляется диаграмма в семейство диаграмм на активном

' рабочем листе

'

ActiveSheet.ChartObjects.Add(195, 30, 200, 190). Select

'

' Производится построение диаграммы методом ChartWizard

ActiveChart. ChartWizard Source : =Range ("A1:B11") ,

Gallery:= xlLine, Format :=1, PlotBy:= xlColumns,

CategoryLabels : =1,

SeriesLabels :=0,

HasLegend: =False, Title := "График", CategoryTitle : = "Аргумент",

ValueTitle : ="Функция"

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

Charts . Add

ActiveChart. ChartType = xlLine

ActiveChart . SetSourceData

Source :=Sheets('ЛИCT3").

Range ( "Bl : Bll" ),

PlotBy : =xlColumns ActiveChart. SeriesCollection (1) .XValues = "=Лист3 !R1C1:R11C1"

ActiveChart .Location Where:=xlLocationAsObject,

Nаmе:="ЛистЗ" With ActiveChart

.HasTitle = True

. ChartTitle. Characters. Text = "График"

.Axes (xlCategory, xlPrimary)

.HasTitle = True .Axes (xlCategory, xlPrimary)

.AxisTitle. Characters. Text = "Аргумент"

.Axes (xlValue, xlPrimary)

.HasTitle = True .Axes (xlValue, xlPrimary)

.AxisTitle. Characters. Text = "Функция"

.HasLegend = False

End With

Рис. 5.8. Диалоговое окно четвертого шага работы мастера диаграмм

Линия тренда

С помощью диаграммы легко можно анализировать тренды и делать прогнозы. Вручную линия тренда на диаграмме добавляется с помощью команды Диаграмма, Добавить линию тренда (Chart, Add Trendline).

Все линии тренда, соответствующие данному ряду данных, образуют семейство Trendlines, элементами которого являются объекты Trendline (линия тренда).

Основными методами семейства Trendiines являются метод Add, добавляющий новый элемент в семейство, и метод item, возвращающий конкретный элемент семейства.

Приведем описание метода Add семейства Trendiines.

Add

Добавляет новый элемент в семейство Trendlines.

Синтаксис:

Add (Type, Order, Period, Forward, Backward, Intercept, DisplayEquation, DisplayRSquared, Name)

  • Tуре — устанавливает тип линии тренда. Допустимые значения: xlLinear (линейная), xlLogarithmic (логарифмическая), xiExponential (экспоненциальная), xlPolynomial (полиномиальная) , xlMovingAvg (скользящее среднее) и xlPower (степенная)
  • Oorder — устанавливает порядок линии тренда. Допустимые значения: целые числа в интервале от 2 до 6. Используется, если аргумент туре принимает значение xlPolynomial
  • Period — период тренда. Допустимые значения: целое не меньше 1, но меньше числа точек, по которым строится тренд.

Используется, если аргумент туре принимает значение xlMovingAvg.

  • Forward — прогнозируемое число точек на будущее (вперед), для предсказания значений в соответствии с трендом
  • Backward — прогнозируемое число точек в прошлом (назад), для предсказания значений в соответствии с трендом
  • intercept — пересечение с осью ординат
  • DisplayEquation — допустимые значения: True (уравнение тренда отображается на диаграмме) и False (в противном случае)
  • DisplayRSquared допустимые значения: True (отображается квадрат коэффициента корреляции) и False (в противном случае)
  • Name — строка, задающая имя линии тренда

Из свойств семейства Trendlines отметим только свойство count, возвращающее число элементов этого семейства.

Приведем соответствие между построением линии тренда вручную и аргументами метода Add семейства Trendiines.

Шаг 1
  • Активизируйте диаграмму, где надо построить линию тренда.
  • Выберите команду Диаграмма, Добавить линию тренда (Chart, Add Trendline) (рис. 5.9).

Шаг 2

На вкладке Тип (Туре) появившегося диалогового окна Линия тренда (Trendline) (рис. 5.10):

  • В списке Построен на ряде (Based on Series) выбирается ряд данных, по которому строится линия тренда. В данном случае ряд данных только один.
  • В группе Построение линии тренда (аппроксимация и сглаживание) (Trend/Regression Type) выбирается один из шести видов линии тренда. Выберите Линейная (Linear).

ШагЗ

На вкладке Параметры (Options) диалогового окна Линия тренда (Trendline) (рис. 5.11) устанавливаются параметры линии тренда:

  • В группе Лазвание аппроксимирующей (сглаженной) кривой
    (Trendline Name) переключатель автоматическое (Automatic) устанавливает имя линии тренда такое же, как и у ряда данных, а переключатель другое (Custom) устанавливает имя, введенное в соответствующем поле. В данном случае выберем переключатель автоматическое (Automatic).
  • В группе Прогноз (Forecast) счетчики вперед на (Forward) и назад на (Backward) определяют, на сколько периодов вперед или назад надо прогнозировать данные при помощи линии тренда. В данном случае не будем заниматься прогнозом, и поэтому оба эти счетчика установим равными 0.
  • Флажок пересечение кривой с осью Y в точке (Set Intercept) позволяет установить конкретную точку, в которой тренд должен пересекать ось Y. В данном случае такого значения устанавливать не будем и поэтому сбросим этот флажок.
  • Флажок показывать уравнение на диаграмме (Display Equation on Chart) определяет, надо ли отображать уравнение линии тренда на диаграмме. В данном случае будем выводить уравнение, и, следовательно, установим этот флажок.
  • Флажок поместить на диаграмму величину достоверности аппроксимации (R^2) (Display R-squared) определяет, надо ли отображать квадрат коэффициента корреляции на диаграмме. Установим этот флажок, тем самым обеспечив вывод квадрата коэффициента корреляции на диаграмму.

Рис. 5.9. Построение линии тренда для объема продаж по неделям

Рис. 5.10. Вкладка Тип диалогового окна Линия тренда

Рис. 5.11. Вкладка Параметры диалогового окна Линия тренда

Шаг 4 | Нажмите кнопку ОК. Линия тренда построена на диаграмме (рис. 5.12). Программно линия тренда строится с помощью следующих инструкций: ActiveSheet . ChartObjects ( "Диагр.1").Activate ActiveChart . ChartArea . Select ActiveChart . SeriesCollection ( 1 ) . Trendlines . Add (Type : =xlLinear , Forward :=0, Backward :=0, DisplayEquation:=True, DisplayRSquared:=True) .Select

Рис. 5.12. Линия тренда объема продаж


  • ГЛАВА 6. СВОДНЫЕ ТАБЛИЦЫ
    • ОБЪЕКТ PIVOTTABLE
    • МЕТОД PIVOTTABLEWIZARD
    • ПРЕОБРАЗОВАНИЕ СВОБОДНОЙ ТАБЛИЦЫ

Глава 6.

Сводные таблицы

Объект PivotTable

Сводные таблицы являются одним из наиболее мощных средств Excel для анализа данных, помещенных в таблицы или списки. Сводные таблицы позволяют группировать данные и производить их анализ. Создавая сводные таблицы, пользователь оперирует именами полей, которые должны помещаться в ее строках и столбцах. Возможно также задание поля страницы, превращающего сводную таблицу в подшивку из нескольких страниц. Иерархически сводная таблица входит в рабочий лист. Все сводные таблицы рабочей книги образуют семейство pivotTabies (сводные таблицы), которое содержит в себе семейство pivotFieids (поля сводной таблицы) всех полей, входящих в сводную таблицу. Объект Pivotitem (элемент сводной таблицы) является конкретным элементом объекта pivotFieid. Все объекты Pivotitem образуют семейство Pivotitems. На рис. 6.1 показана иерархия этих семейств.

Рис. 6.1. Иерархия семейства объектов PivotTabies, PivotFieids и Pivotitems

Семейство PivotTabies имеет единственный метод item, возвращающий элемент этого семейства, т. е. конкретную сводную таблицу.

Синтаксис:

Item(Index)

  • Index — имя или номер возвращаемого элемента семейства PivotFieids

Из свойств семейства PivotTabies отметим только свойство Count, возвращающее число элементов этого семейства.

Метод PivotTableWizard

Программно сводная таблица создается методом PivotTableWizard. Вручную на рабочем листе сводная таблица конструируется с помощью команды Данные, Сводная таблица (Data, Pivot Table and Pivot Chart Report).

Синтаксис:

Объект.PivotTableWizard(SourceType, SourceData, TableDestination,

TableName, RowGrand, ColumnGrand, SaveData, HasAutoFormat, AutoPage, Reserved, BackgroundQuery, OptimizeCache, PageFieldOrder, PageFieldWrapCount, ReadData, Connection)

Аргументы

Объект

Объект Worksheet (рабочий лист ) или PivotTable (сводная таблица)

SourceType

Тип источника данных. Допустимые значения:

  • xlConsolidation (консолидация нескольких диапазонов рабочих листов Excel)
  • xlDatabase (список или база данных Excel)
  • xlExternal (внешняя база данных)
  • xlPivotTabie (сводная таблица)

SourceData

Определяет вид источника данных в зависимости от значения аргумента SourceType:

  • Диапазон, если значением аргумента является xlDatabase
  • Массив строк, содержащий строку связи ODBC и SQL-оператор, если — xlExternal
  • Массив диапазонов, если — xlConsolidation
  • Имя существующей сводной таблицы, если -xlPivotTable

TableDestination

Диапазон, где будет размещена сводная таблица

TableName

Имя создаваемой сводной таблицы

RowGrand

Допустимые значения: True (отображается суммарный итог по строкам сводной таблицы) и False (итог не отображается)

ColumnGrand

Допустимые значения: True (отображается суммарный итог по столбцам сводной таблицы) и False (итог не отображается)

SaveData | Допустимые значения: True (сохраняются данные вместе со сводной таблицей) и False (сохраняется только сводная таблица)
HasAuto Format | Допустимые значения: True (автоматическое пере-форматирование сводной таблицы при изменении данных) и False (в противном случае)
AutoPage | Применим только при аргументе sourceType, равным xlConsolidation. Допустимые значения: True (Excel создает поле страницы) и False (пользователь должен создать поле)
Reserved | Не используется
BackgroundQuery | Допустимые значения: True (Excel выполняет запрос в фоновом режиме) и False (в последовательном)
OptimizeCache | Допустимые значения: True (создается сводная таблица в режиме оптимизации, применяется для сводных таблиц, обрабатывающих большие базы данных) и False (оптимизация выключена, что убыстряет создание сводной таблицы)
PagePieldOrder | Задает ориентацию поля страницы. Допустимые значения: xlDownThenOver (поле страницы располагается вертикально) и xlOverThenDown (поле страницы располагается горизонтально)
PageFieldWrapCount | Задает номер поля, с которого начинается новая страница. По умолчанию 0, т. е. отменена разбивка на страницы
ReadData | Допустимые значения: True (данные сразу считываются в кэш) и False (данные считываются в кэш по мере необходимости)
Connection | Используется для указания источника данных ODBC, источника данных URL и имени файла, содержащего запрос

С методом pivotTableWizard тесно связан метод PivotTables, применяемый к рабочему листу. Метод PivotTabies возвращает объект PivotTable или семейство сводных таблиц, размещенных на рабочем листе. Этот метод имеет два синтаксиса.

Синтаксис 1:

Объект.PivotTabies

Возвращает семейство сводных таблиц. Здесь и во втором синтаксисе объект -рабочий лист.

Синтаксис 2:

Объект.PivotTables(Index)

Возвращает сводную таблицу из семейства сводных таблиц с именем или номером, указанным в аргументе index .

Объект PivotTable имеет следующие наиболее часто используемые методы.

PivotFields

Возвращает объект, являющийся либо единичным полем (синтаксис 1), либо семейством полей.

Синтаксис 1:

PivotFields (Index)

  • Index — имя или номер поля сводной таблицы Синтаксис 2:

PivotFields

PivotSelect

Выбирает элементы сводной таблицы.

Синтаксис:

PivotSelect (Name, Mode)

Аргументы: G Name — строковое выражение, идентифицирующее выбранный элемент

  • Mode — специфицирует структуры выбранного элемента. Допустимые значения:
xlBlanks, xiButton,

xlDataAndLabel, xlDataOnly, xlLabelOnly или xlOrigin

RefreshTable

Обновляет данные. Дело в том, что в сводной таблице не происходит автоматического перерасчета при изменении исходных данных. Для перерасчета сводной таблицы вручную надо ее выделить и выбрать команду Данные, Обновить данные (Data, Refresh Data). Программно перерасчет сводной таблицы производится методом RefreshTable

AddFields

Добавляет строки, столбцы и страницы в сводную таблицу.

Синтаксис:

AddFields (RowFields, ColumnFields, PageFields, AddToTable)

Аргументы:

  • RowFields — специфицирует имя или массив имен полей, которые будут играть роль строк сводной таблицы
  • ColumnFields — специфицирует имя или массив имен полей, которые будут играть роль столбцов сводной таблицы
  • FageFields — специфицирует имя или массив имен полей, которые будут играть роль страниц сводной таблицы
  • AddToTabie — допустимые значения: True (добавляет поля в сводную таблицу) и False (заменяет существующие поля)

Объект pivotTabie имеет следующие наиболее часто используемые свойства.

ColumnFields, RowFields, DataFields

И

PageFields

Возвращает объект, являющийся либо единичным полем (синтаксис 1), либо семейством полей (синтаксис 2), который является столбцом (строкой, данными или страницей) сводной таблицы.

Синтаксис 1:

ColumnFields (Index) RowFields (Index) DataFields (Index) PageFields (Index)

  • Index — имя или номер поля сводной таблицы

Синтаксис 2:

ColumnFields RowFields DataFields PageFields

VisibleFields и HiddenFields

Возвращает объект, являющийся либо единичным полем (синтаксис 1), либо семейством полей (синтаксис 2), который в данный момент отображается (скрыт) в сводной таблице.

Синтаксис 1:

VisibleFields (Index) HiddenFields (Index)

  • Index — имя или номер поля сводной таблицы

Синтаксис 2:

VisibleFields HiddenFields

Объект PivotField имеет следующие наиболее часто используемые свойства.

Orientation Возвращает местоположение поля в сводной таблице.

Допустимые значения:

xlColumnField, xlDataField,

xlHidden, xlPageField или xlRowField

Возвращает позицию поля (первая, вторая и т. д.) среди полей того же местоположения

Рассмотрим соответствие между аргументами метода pivotTabiewizard и созданием сводной таблицы вручную на рабочем листе с помощью команды Данные, Сводная таблица (Data, Pivot Table). Сводную таблицу будем создавать для отчета по продажам компьютеров сети из трех магазинов (рис. 6.2).

Рис. 6.2. Отчет о продаже компьютеров сети из трех магазинов

Шаг 1

Выберите команду Данные, Сводная таблица (Data, Pivot Table and Pivot Chart Report). Появится первое диалоговое окно мастера сводных таблиц (рис. 6.3). Выбор переключателей, расположенных под заголовком Создать таблицу на основе данных, находящихся: (Where is the data that you want to analyze?) позволяет установить источник данных для сводной таблицы.

  • Переключатель в списке или базе данных Microsoft Excel (Microsoft Excel List or Database) устанавливает создание сводной таблицы на основе списка данных, расположенных на рабочем листе.
  • Переключатель во внешнем источнике данных (External Data Source) устанавливает создание сводной таблицы на основе файлов или таблиц, созданных другими программами.
  • Переключатель в нескольких диапазонах консолидации (Multiple Consolidation Ranges) устанавливает создание сводной таблицы на основе нескольких списков.
  • Переключатель в другой сводной таблице (Another Pivot Table) устанавливает создание сводной таблицы на основе другой существующей сводной таблицы.
Установите переключатель в списке или базе данных Microsoft
Excel (Microsoft Excel List or Database), т. к. сводная таблица будет создаваться на основе одного списка активного рабочего листа. Нажмите кнопку Далее > (Next >)

Рис. 6.3. Первое диалоговое окно мастера сводных таблиц

Шаг 2 | На экране появится второе диалоговое окно мастера сводных таблиц (рис. 6.4). В поле Диапазон (Range) введите ссылку, например AI :Е1б, на диапазон, по которому будет строиться сводная таблица. Нажмите кнопку Далее > (Next >).

Рис. 6.4. Второе диалоговое окно мастера сводных таблиц

ШагЗ

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

  • Выберите поле, по которому будут подводиться итоги сводных таблиц, и перетащите кнопку, соответствующую этому полю в область Данные (Data). В данном случае перетащим кнопку Стоимость в область Данные (Data) (рис. 6.6). Двойной щелчок на кнопке Стоимость в области Данные (Data) приводит к отображению диалогового окна Вычисления поля сводной таблицы (PivotTable Field), позволяющее установить операцию, на основе которой будут подводиться итоги. Выберите операцию Сумма (Sum).
  • Выберите поля, которые будут образовывать строки сводной таблицы и перетащите кнопки, соответствующие этим полям в область Строка (Row). В данном случае строки сводной таблицы будут соответствовать магазинам. Поэтому перетащим кнопку магазин в область Строка (Row).
  • Выберите поля, которые будут образовывать столбцы сводной таблицы и перетащите кнопки, соответствующие этим полям в область Столбец (Column). В данном случае строки сводной таблицы будут соответствовать месяцам. Поэтому перетащим кнопку месяц в область Столбец (Column).
  • Если вы хотите создать сводную таблицу в виде подшивки страниц, то перетащите кнопку, соответствующую полю, по которому будут строиться страницы в область Страница (Page). В данном случае сводная таблица, состоящая из страниц, не строится и поэтому не будем перетаскивать никакую кнопку в область Страница (Page). Нажмите кнопку Далее > (Next >).

Рис. 6.5. Третье диалоговое окно мастера сводных таблиц

Рис. 6.6. Третье диалоговое окно мастера сводных таблиц после создания структуры сводной таблицы

ШагЗ

Появится последнее четвертое диалоговое окно мастера сводных таблиц (рис. 6.7). В этом окне устанавливается местоположение сводной таблицы. П Выбор переключателя новый лист (New worksheets) приводит к созданию нового рабочего листа и размещения на нем сводной таблицы. Выберите переключатель новый лист. П Выбор переключателя существующий лист* (Existing worksheets) позволяет разместить сводную таблицу в любом месте уже существующего листа. Для этого в поле Поместить таблицу в (Pivot Table Starting Cell) надо указать ссылку на ячейку, в которой будет располагаться левый верхний угол сводной таблицы. О Нажав кнопку Параметры (Options) можно вызвать диалоговое окно Параметры сводной таблицы (Pivot Table Options), где задаются имя сводной таблицы и ее формат. Нажмите кнопку Готово (Finish).

Шаг 4

Сводная таблица построена (рис. 6.8). Такую же сводную таблицу можно построить при помощи следующей последовательности инструкций VBA:

ActiveSheet. PivotTableWizard SourceType:=xlDatabase, SourceData:= "Лист1 !R1C1:R16C5", TableDestination:="", TableName : ="СводнаяТаблица1 "

ActiveSheet . PivotTables ( "СводнаяТаблица! " ) . AddFields RowFields : ="Магазин" , ColumnFields : ="Месяц"

ActiveSheet . PivotTables ( "СводнаяТаблица! " } . PivotFields ("Стоимость") .Orientation = xlDataField

Если в данных, по которым строилась сводная таблица, произошли изменения, для перерасчета сводной таблицы надо ее выделить и выбрать команду Данные, Обновить данные (Data, Refresh Data). Программно перерасчет сводной таблицы осуществляется следующими инструкциями:

ActiveSheet . PivotTables ( "СводнаяТаблица! " ) . PivotSelect "", xlDataAndLabel

ActiveSheet . PivotTables ("СводнаяТаблица!") . Ref reshTable

Рис. 6.7. Четвертое диалоговое окно мастера сводных таблиц

Рис. 6.8. Сводная таблица

Преобразования свободной таблицы

Рассмотрим наиболее часто используемые операции преобразования сводной таблицы.

Удаление поля | Для удаления поля сводной таблицы достаточно расположить на нем указатель мыши и перетащить поле за пределы сводной таблицы. Например, удалим поле месяц (рис. 6.9). Программно тот же результат получается при ** помощи следующих двух инструкций: ActiveSheet . PivotTables (СводнаяТаблица!" ) . _ PivotSelect "Месяц", xlButton ActiveSheet. PivotTables ("СводнаяТаблица!") . _ PivotFields ("Месяц") .Orientation = xlHidden

Рис. 6.9. Сводная таблица после удаления поля Месяц

Перемещение поля

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

ActiveSheet . PivotTables ("СводнаяТаблица!") . _

PivotSelect "Месяц [Все] ", xlLabelOnly With ActiveSheet .

PivotTables ( "СводнаяТаблица!").

PivotFields ("Месяц") .Orientation = xlRowField .Position = 1

End With

Группировка полей

Поля сводной таблицы можно группировать. Например, объединим магазины Альфа и Бета в одну группу. Для этого надо выделить поля этих магазинов и выбрать команду Данные, Группа и структура, Группировать (Data, Group and Outline, Group) (рис. 6.11). Программно тот жерезультат получается при помощи следующих двух инструкций:

ActiveSheet . PivotTables ( "СводнаяТаблица1 " ) . PivotSelect "Альфа: Бета", xlDataAndLabel Selection . Group

Скрыть детали элементов группы можно командой Данные, Группа и структура, Скрыть детали (Data, Group and Outline, Hide Details) (рис. 6.12), предварительно выделив поле этой группы. Программно тот же результат получается при помощи следующих двух инструкций:

ActiveSheet . PivotTables ( "СводнаяТаблица1 " ) .

PivotSelect "Группа1 Январь", xlDataAndLabel Selection. ShowDetail = False

Показать детали элементов группы можно, выполнив команду Данные, Группа и структура, Отобразить детали (Data, Group and Outline, Show Details). Программно это осуществляется инструкциями:

Active Sheet . PivotTables ("СводнаяТаблица! " ).

PivotSelect "Группа! Январь", xlDataAndLabel Selection. ShowDetail = True

Рис. 6.10. Сводная таблица после перемещения поля Месяц из столбцов в строки

Рис. 6.11. Сводная таблица после группировки магазинов Альфа и Бета

Рис. 6.12. Сводная таблица со скрытой детализацией элементов группы магазинов Альфа и Бета


  • ГЛАВА 7. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ И ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА
    • ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
      • Режим конструктора
      • Установка свойств элемента управления
    • РЕДАКТОР КОДА
    • ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА USERFORM
      • Семейство Controls
      • Создание пользовательской формы
    • ОБЩИЕ СВОЙСТВА ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
    • СОГЛАШЕНИЯ ОБ ИМЕНАХ
    • ОБЩИЕ МЕТОДЫ и СОБЫТИЯ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
    • ОБЪЕКТ DATAOBJECT
    • ПОЛЕ
    • НАДПИСЬ
    • КНОПКА
      • Список
      • Заполнение списка
      • Выбор нескольких элементов из списка
    • ПОЛЕ СО СПИСКОМ
    • ПОЛОСА ПРОКРУТКИ И СЧЕТЧИК
    • ПЕРЕКЛЮЧАТЕЛЬ
    • РАМКА
    • ФЛАЖОК и ВЫКЛЮЧАТЕЛЬ
    • РИСУНОК
    • ССЫЛКИ НА ЯЧЕЙКИ И ДИАПАЗОНЫ
    • НАБОР СТРАНИЦ
    • НАБОР ВКЛАДОК
    • ДОПОЛНИТЕЛЬНЫЕ ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
    • ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫБОРА ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
    • ИНИЦИАЛИЗАЦИЯ и ОТОБРАЖЕНИЕ ДИАЛОГОВОГО ОКНА
    • ЗАКРЫТИЕ ДИАЛОГОВОГО ОКНА
    • ОТОБРАЖЕНИЕ ВСТРОЕННЫХ ДИАЛОГОВЫХ ОКОН

Глава 7.

Элементы управления и пользовательская форма

Элементы управления

VBA обладает встроенным набором элементов управления. Используя этот набор и редактор форм не трудно создать любой пользовательский интерфейс, который будет удовлетворять всем требованиям, предъявляемым к интерфейсу в среде Windows. В данной главе дан обзор встроенных элементов управления VBA. Элементы управления являются объектами. Поэтому, как любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели инструментов Элементы управления (Control Toolbox) (рис. 7.1). На этой панели представлены кнопки, позволяющие конструировать элементы управления, а также кнопки вызова окна свойств, перехода в режим конструктора и редактор кода.

Рис. 7.1. Панель инструментов Элементы управления

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

Большинство элементов управления можно располагать как на рабочем листе, так и в форме. Но существуют такие элементы управления, как RefEdit, Набор страниц и Набор вкладок, которые можно располагать только в форме. В табл. 7.1 приведен список основных элементов управления и соответствующих кнопок панели инструментов Элементы управления (Control Toolbox).

Таблица 7.1. Панель инструментов Элементы управления

Элемент управления | Имя | Кнопка для создания элемента
Поле Надпись | TextBox Label |
Кнопка | CommandButton |
Список | ListBox |
Поле со списком | ComboBox |
Полоса прокрутки | ScrollBar |
Счетчик | SpinButton |
Переключатель | OptionButton |
Флажок | CheckBox |
Выключатель | ToggleButton |
Рамка | Frame |
Рисунок | Image |
RefEdit | RefEdit |
Набор страниц | MultiPage |
Набор вкладок | TabStrip |

Для размещения элемента управления на листе или в форме нажмите соответствующую кнопку панели инструментов Элементы управления (Control Toolbox) и с помощью мыши перетащите рамку элемента управления в нужное место. После этого элемент управления можно перемещать, изменять его размеры, копировать в буфер обмена и вставлять из буфера обмена.

Режим конструктора

Для удобства работы с элементами управления в период их конструирования в Excel введен режим конструктора, который активизируется нажатием кнопки

Режим конструктора (Design Mode) панели инструментов Элементы управления (Control Toolbox). В режиме конструктора отключена реакция элемента управления на события. Поэтому при включенном режиме конструктора можно видоизменять элемент управления и задавать его свойства. На рис. 7.2 показано создание элемента управления CommandButton (кнопка) на рабочем листе. После того как пользователь решит, что созданный элемент управления имеет тот вид, который ему нужен, и все требуемые свойства элемента управления установлены, он должен отключить режим конструктора повторным нажатием кнопки Режим конструктора (Design Mode).

Рис. 7.2. Создание элемента управления CommandButton на рабочем листе в режиме конструктора

Установка свойств элемента управления

Для установки свойств элемента управления вручную при его конструировании необходимо выделить элемент управления и нажать кнопку Свойства (Properties) панели инструментов Элементы управления (Control

ТоoolBох). На экране отобразится диалоговое окно Свойства (Properties) (рис. 7.3). Оно аналогично окну Свойства (Properties) редактора Visual Basic. Вручную при помощи этого окна обычно устанавливается свойство Caption, возвращающее отображаемый текст элемента управления. На рис. 7.3 значение свойства Caption элемента управление CommandButton изменено с установленного ПО умолчанию (CommandButtonl) на текст Нажми меня. Кроме

того, внесены изменения в параметры свойства Font, устанавливающее шрифт выводимого на поверхности кнопки текста, а именно, увеличен размер шрифта с 8 до 12, шрифт MS sans serif заменен на courier New и изменено начертание букв с обычного на полужирное. Также свойство shadow установлено равным True, вместо False, как это имеет место по умолчанию. Свойство shadow устанавливает, отображается ли элемент управления с тенью или без нее.

Рис. 7.3. Диалоговое окно Свойства и элемент управления CommandButton с измененными свойствами Caption, Font и Shadow

Редактор кода

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

Click | Щелчок
DblClick | Двойной щелчок
GotFocus | Кнопка в фокусе
LostFocus | С кнопки снят фокус

Код обработки события записывается на листе модуля. Для активизации модуля в том месте, где надо ввести код по обработке события, связанного с выделенным элементом управления, или отредактировать уже написанный код достаточно нажать кнопку Исходный текст (View Code) панели инструментов Элементы управления (Control Toolbox).

Нажатие на кнопку Исходный текст (View Code) активизирует модуль с именем лист1, т. е. модуль, относящийся к рабочему листу, на котором создана кнопка (рис. 7.4). Вся рабочая книга, а также каждый рабочий лист, диаграмма или форма имеют связанные с ними модули кода. Кроме того, можно создать модули кода для макросов и модули класса.

Рис. 7.4. Модуль кода и окно Проект

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

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

Составим процедуру обработки события click так, чтобы нажатие на кнопку отображало на экране диалоговое окно, уведомляющее пользователя о случившемся действии (нажатии кнопки) (рис. 7.5).

Private Sub CoimiandButtonl_Click ()

MsgBox "Ты нажал на меня"

End Sub

Рис. 7.5. Диалоговое окно, отображаемое на экране при нажатии кнопки Нажми меня

Пользовательская форма UserForm

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

Семейство userForms является семейством, компоненты которого представляют все загруженные формы UserForm в приложении. Как и все семейства, UserForms имеет свойства count (возвращает число компонентов в семействе) и item (возвращает определенный компонент семейства), а также метод Add (добавляет к семейству новый компонент).

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

Name

Возвращает имя пользовательской формы

Caption

Возвращает текст, отображаемый в строке заголовка формы

BackColor

Возвращает цвет фона формы

BorderStyle

Устанавливает тип границы

Picture

Указывает рисунок, отображаемый как фон формы

Left И Top

Возвращают местоположение верхнего левого угла формы в пунктах

Height И Width

Возвращают высоту и ширину формы в пунктах

StartUpPosition

Возвращает значение, определяющее положение формы при ее первом отображении на экране.

Допустимые значения:

  • Manual (начальное значение не устанавливается),
  • CenterOwner (выравнивание по центру объекта, к которому принадлежит форма)
  • CenterScreen (выравнивание по центру экрана)
  • windows Default (положение верхнего левого угла экрана)

Наиболее часто используемые методы объекта UserForm.

Show | Отображает форму на экране
Hide | Закрывает форму
Move | Изменяет положение и размер формы
PrintForm | Печатает изображение формы

Семейство Controls

Доступ к семейству всех элементов управления, расположенных в пользовательской форме UserForm, осуществляется с помощью семейства controls. Например, чтобы скрыть все элементы управления формы UserForm, можно использовать код, в котором свойству visible элемента управления, определяющему, отображается ли этот элемент на экране или нет, устанавливается значение False:

For Each Элемент in UserForml.Controls

Элемент.Visible = False Next Control

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

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

Шаг 1

Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Visual Basic) для того, чтобы перейти в редактор Visual Basic.

Шаг 2

Выберите команду Вставить User Form (Insert UserForm). В редакторе Visual Basic появятся:

  • Окно с пользовательской формой
  • Панель инструментов Панель элементов (Toolbox) (рис. 7.6).

Рис. 7.6. Окно редактора Visual Basic с пользовательской формой и панелью элементов

ШагЗ

Используя диалоговое окно Свойства (Properties), отображаемое нажатием кнопки и Панель элементов (Toolbox), создайте из пользовательской формы диалоговое окно, показанное на рис. 7.7. Это окно состоит из трех кнопок и одного поля. Свойство Caption пользовательской формы определите равным Песнь о воробушке и бабочке, а кнопок — равными Первый акт, Второй акт и Третий акт.

Шаг 4

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

UserForml, в который введите Процедуру:

Private Sub CommandButtonl Click ()

TextBoxl .Text = "Воробышек за бабочкой прыг -прыг -прыг"

End Sub

для Обработки событий Нажатий кнопок

Второй акт и Третий акт в модуле UserForml введите следующие две процедуры:

Private Sub CommandButton2 Click () TextBoxl .Text = "Воробышек за бабочкой скок-скок-скок"

End Sub

Private Sub CommandButton3 Click () TextBoxl . Text = "Воробышек бабочку ням-ням-ням"

End Sub
Шаг 5 Процесс создания диалогового окна и процедур, связанных с ним, завершен. Для того чтобы проверить, как работает созданная программа, нажмите кнопку Запуск подпрограммы/UserForm (Run). На экране на фоне рабочего листа отобразится диалоговое окно песнь о воробушке и бабочке. Для проверки функционирования кнопок нажмите, например, кнопку первый акт. В поле выведется сообщение Воробышек за бабочкой прыг-прыг-прыг (рис. 7.8). Для закрытия диалогового окна песнь о воробушке и бабочке нажмите системную кнопку, расположенную в верхней правой части строки заголовка диалогового окна.

Рис. 7.7. Редактор Visual Basic с преобразованной пользовательской формой для создаваемого приложения

Рис. 7.8. Диалоговое окно Песнь о воробушке и бабочке

Общие свойства элементов управления

Приведем основные общие свойства элементов управления.

Name | Имя элемента управления
Caption | Надпись, отображаемая при элементе управления
AutoSize | Допустимые значения: True (устанавливает режим автоматического изменения размеров элемента управления так, чтобы на нем полностью помещался текст, присвоенный свойству Caption) и False (в противном случае)
Visible | Допустимые значения: True (элемент управления отображается во время выполнения программы) и False (в противном случае)
Enabled | Допустимые значения: True (пользователь вручную может управлять элементом управления) и False (в противном случае)
Height И Width | Устанавливают геометрические размеры объекта (высоту и ширину)
Left И Top | Устанавливают координаты верхнего левого угла элемента управления, определяющие его местоположение в форме

ControlTipText

Устанавливает текст в окне всплывающей подсказки, связанной с элементом управления. В следующем примере элементу управления CommandButtonl назначен текст всплывающей подсказки Это кнопка :

CommandButtonl . ControlTipText = "Это кнопка"

BackColor, ForeColor и BorderColor

Устанавливают цвет заднего и переднего плана элемента управления, также его границы

BackStyle

Устанавливает тип заднего фона

BorderStyle

Устанавливает тип границы. Допустимые значения:

  • fmBorderStyieSingle (граница в виде контура)
  • fmBorderStyieNone (граница невидима)

SpecialEf feet

Устанавливает тип границы. Отличается от свойства BorderStyle тем, что позволяет установить несколько типов, но одного цвета. BorderStyle позволяет установить только один тип, но различных цветов

Picture (создание картинки)

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

CommandButtonl . Picture = LoadPicture ( "с : \my doc\Kpyr . bmp" )

Функция LoadPicture (ПолноеИмяФайла) считывает графическое изображение. Аргумент ПолноеИмяФайла указывает полное имя графического файла

Picture (удаление картинки)

После того как картинка создана на элементе управления, иногда возникает необходимость ее удалить. Это легко достигается присвоением свойству Picture значения LoadPicture ("")

Tag

Используется для хранения дополнительной информации о форме или элементе управления, которая может быть в последующем востребована в программе. В следующем примере в пользовательской форме расположены три кнопки и одно поле. Свойство Tag каждого из этих элементов управления, за исключением второй
кнопки , установлено равным Показать. свойство Tag второй кнопки установлено равным спрятать. В цикле проверяется свойство Tag всех элементов управления и при инициализации диалогового окна отображаются только те элементы управления, у которых это свойство равно Показать . Private Sub UserForm Initialize)) Dim Элемент As Object CommandButtonl .Tag = "Показать"

ControlTipText

Устанавливает текст в окне всплывающей подсказки, связанной с элементом управления. В следующем примере элементу управления CommandButton1 назначен текст всплывающей подсказки это кнопка :

CommandButton1 .ControlTipText = "Это кнопка"

BackColor, ForeColor и BorderColor

Устанавливают цвет заднего и переднего плана элемента управления, также его границы

BackStyle

Устанавливает тип заднего фона

BorderStyle

Устанавливает тип границы. Допустимые значения:

  • fmBorderStyleSingle (граница в виде контура)
  • fmBorderstyieNone (граница невидима)

SpecialEf feet

Устанавливает тип границы. Отличается, от свойства BorderStyle тем, что позволяет установить несколько типов, но одного цвета. BorderStyle позволяет установить только один тип, но различных цветов

Picture

(создание картинки)

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

CommandButtoni . Picture = LoadPicture ( "с : \my doc\Kpyr . bmp" ) Функция LoadPicture (ПолноеИмяФайла) считывает графическое изображение. Аргумент ПолноеИмяФайла указывает полное имя графического файла

Picture

(удаление картинки)

После того как картинка создана на элементе управления, иногда возникает необходимость ее удалить. Это легко достигается присвоением свойству picture значения LoadPicture ("")

Tag

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

Private Sub UserForm Initialize ()

Dim Элемент As Object CommandButton1 . Tag = "Показать"

CommandButton2 .Tag = "Спрятать"

CommandButton3 .Tag = "Показать"

TextBoxl.Tag = "Показать"

For Each Элемент In Controls

If Элемент . Tag = "Показать" Then Элемент. Visible = True

Else Элемент .Visible = False

End If Next Элемент End Sub

Цвета, устанавливаемые свойствами BackColor, ForeColor и BorderColor, задаются шестнадцатеричными числами. Если эти свойства устанавливать не при помощи окна Свойства (Properties), а программно, вместо этих шестна-дцатеричных чисел удобнее использовать соответствующие постоянные, задающие цвета (табл. 7.2).

Таблица 7.2. Константы, задающие цвет

Константа | Значение | Цвет
vbBlack | 0x0 | Черный
vbRed | 0xFF | Красный
vbGreen | 0xFF00 | Зеленый
vb Yellow | 0xFFFF | Желтый
vbBlue | 0xFF0000 | Синий
vbMagenta | 0xFF00FF | Розойый
vbCyan | 0xFFFF00 | Голубой
vbWhite | 0xFFFFFF | Белый

Соглашения об именах

При создании формы или элемента управления, VBA устанавливает свойство объекта Name (т. е. его имя) по умолчанию. Например, для первой созданной кнопки свойство Name устанавливается равным CommandButtonl, для второй — commandButton2 и т. д. При разработке приложений с одной формой имя объекта, устанавливаемое по умолчанию, обычно не вызывает никаких проблем и в этом случае имена объектов оставляют без изменения. Если приложение обладает сложной структурой и состоит из нескольких форм, будет трудно отличить первую кнопку CommandButtonl первой формы, от первой кнопки CommandButtonl второй формы. В этом случае полезно переименовать объекты так, чтобы они легче различались. Для переименования объектов и переменных в среде Windows существует соглашение об именах, называемое венгерской нотацией. Суть соглашения состоит в следующем: имя объекта начинается с короткого префикса, одинакового для объектов одного и того же рода. За префиксом следует собственно имя, отображающее суть объекта. В табл. 7.3 приведены префиксы и примеры имен управляющих элементов.

Таблица 7.3. Примеры префиксов и имен

Управляющий элемент | Префикс | Пример имени
TextBox | txt | txtAcount
Label | lbl | IblInform
CoiranandButton | cmd | cmdOK
ListBox | 1st | lstNames
ComboBox | cbo | cboFirms
ScrollBar | scr | scrDown
SpinButton OptionButton CheckBox | spn opt chk | spnUp optChoice chkSex
ToggleButton Frame | Tgl fra | TglSwitch fraStatus
Image RefEdit | img ref | imgBall ref Fun
MultiPage TabStrip UserForm | mlt tab frra | mltPages tabTwoTabs f rmGame

Общие методы и события элементов управления

Перечислим основные общие методы элементов управления.

Add | Позволяет добавить элемент управления во время выполнения программы
Move | Перемещает элемент управления
Zorder | Помешает объект до или после всех пересекающихся с ним объектов
SetFocus | Устанавливает фокус на вызвавшем этот метод элементе управления. Часто применяется в программах обработки ошибок

Перечислим наиболее часто употребляемые общие события элементов управления.

Click | Происходит, когда пользователь выбирает элемент управления с помощью одинарного щелчка кнопкой мыши
DblClick | Происходит, когда пользователь выбирает элемент управления с помощью двойного щелчка кнопкой мыши
KeyPress | Происходит, когда пользователь нажимает любую клавишу на клавиатуре, кроме функциональных и клавиш управления курсором
Change | Происходит при изменении значения элемента управления
GotFocus И LostFocus | Происходит, когда элемент управления получает или теряет фокус
Error | Используется при уведомлении об ошибке

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

Таблица 7.4. События, связанные с нажатием кнопки мыши

и перемещением мыши

Событие | Событие происходит
MouseDown | При нажатии кнопки мыши
MouseUp | При отпускании кнопки мыши
MouseMove | При перемещении указателя мыши

Синтаксис:

Private Sub object_MouseDown( ByVal Button As fmButton,

ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

Private Sub object_MouseUp( ByVal Button As fmButton,

ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

Private Sub object_MouseMove( ByVal Button As fmButton,

ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

Аргументы:

Button

Возвращает код (значение) нажатой кнопки мыши. Допустимые значения:

  • fmButtonLeft или 1 (левая)
  • fmButtonRight или 2 (правая)
  • fmButtonMiddle или 4 (средняя)

Shift

Возвращает код (значение) нажатой на клавиатуре клавиши. Допустимые значения:

  • fmShiftMask или 1 (<Shift>)
  • fmCtrlMask или 2 (<Ctrl>)
  • fmAltMask или 4 (<Alt>)

X И Y

Возвращает значение расстояния от левого или от верхнего края формы, рамки или страницы. При событии MouseMove этим расстоянием считается путь в направлении от левого верхнего угла элемента управления по горизонтали или вертикали

Рассмотрим синтаксис процедур обработки событий при операциях drag-and-drop, связанных с элементами управления (табл. 7.5).

Таблица 7.5. События, связанные с перемещением элемента управления

Событие | Событие происходит
BeforeDragOver BeforeDropOr Paste | Пока совершается операция drag-and-drop Перед завершением операции drag-and-drop

Синтаксис:

Private Sub object_BeforeDragOver( ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As

DataObject, ByVal X As Single,

ByVal Y As Single,

ByVal DragState As fmDragState,

ByVal Effect As MSForms.ReturnEffect,

ByVal Shift As fmShiftState)

Private Sub

object_BeforeDropOrPaste( ByVal Cancel As MSForms.ReturnBoolean,

ByVal Action As fmAction,

ByVal Data As DataObject,

ByVal X As Single,

ByVal Y As Single,

ByVal Effect As MSForms.ReturnEffeet,

ByVal Shift As fmShiftState)

Аргументы:

Cancel

Допустимые значения: False (по умолчанию, элемент управления обрабатывает событие) и True (приложение обрабатывает событие)

Data

Данные, перемещаемые во время операции drag-and-drop. Эти данные размещаются в объекте DataObject. Объект DataObject — это своеобразный аналог буфера обмена, в отличии от которого в нем допускается хранить только текстовую информацию

X и Y

Расстояние от левого верхнего угла элемента управления по горизонтали и вертикали

DragState

Устанавливает позицию указателя мыши относительно целевого объекта. Допустимые значения:

  • fmDragStateEnter или о (указатель мыши внутри целевого элемента управления)
  • fmDragStateLeave или 1 (указатель мыши вне целевого элемента управления)
  • fmDragStateOver или 2 (указатель мыши в новой позиции, но остается внутри элемента управления)

Effect

Устанавливает операцию, производимую над объектом. Допустимые значения:

  • fmDropEffectNone или о (не копировать и не перемещать объект)
  • fmDropEf fectcopy или 1 (копировать» объект)
  • fmDropEf fectMove или 2 (перемещать объект)
  • fmDropEf fectCopyOrMove или з (копировать или перемещать объект)

Shift

Возвращает код (значение) нажатой на клавиатуре клавиши. Допустимые значения:

  • fmShiftMask или 1 (<Shift>)
  • fmCtrlMask или 2 (<Ctrl>)
  • fmAltMask или 4 (<Alt>)

Объект DataObject

Объект DataObject предназначен для передачи текстовой информации при выполнении операций drag-and-drop между элементами управления. По своему действию объект DataObject в основном аналогичен буферу обмена, но в отличие от него он может хранить только текстовую информацию, которая исчезает при закрытии приложения. Рассмотрим методы объекта DataObject.

GetText

Возвращает текстовую строку из объекта Dataobject.

Синтаксис:

String = object. GetText

SetText

Копирует текстовую строку в объект Dataobject.

Синтаксис:

SetText (StoreData)

  • StoreData — определяет данные, копируемые в объект DataObject

StartDrag

Инициирует операцию drag-and-drop для объекта DataObject.

Синтаксис:

ЦелаяПеременная = Object . StartDrag

  • ЦелаяПеременная — возвращает тип операции drag-and-drop (с копированием или перемещением)

GetText

Возвращает текстовую строку из объекта Dataobject.

Синтаксис:

СтроковаяПёременная = object . GetText

  • СтроковаяПёременная — переменная, которой присваивается текстовая строка, хранящаяся в Объекте DataObject

PutlnClipboard

Переносит данные из объекта DataObject в буфер обмена

GetFromClipboard

Переносит данные из буфера обмена в объект DataObject

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

Поле

Элемент управления TextBox (поле) создается с помощью кнопки Поле (TextBox) панели элементов управления (рис. 7.9). В основном TextBox используется для ввода текста, который в последующем используется в программе, или для вывода результатов расчетов программы. Текст, введенный в поле, обычно в программе преобразуется либо в числа, либо в формулы.

Рис. 7.9. Поле в форме

Основные свойства элемента управления TextBox перечислены ниже.

Text

Возвращает текст, содержащийся в поле

Visible

Допустимые значения: True (поле отображается во время выполнения программы) и False (в противном случае)

Enabled

Допустимые значения: True (пользователь непоредственно может вносить изменения в содержание поля) и False (в противном случае)

Multiline

Допустимые значения: True (устанавливается много-строчный режим ввода текста в поле) и False (однострочный режим)

Wordwrap

Допустимые значения: True (устанавливается режим автоматического переноса) и False (в противном случае)

AutoSize-

Допустимые значения: True (устанавливается режим автоматического изменения размера поля так, чтобы весь вводимый текст помещался в нем) и False (устанавливается фиксированный размер поля)

ScrollBars

Устанавливает режим отображения в поле полос прокрутки. Допустимые значения:

  • fmScrollBarsNone (не выводить полос прокрутки)
  • fmScrollBarsHorizontal (выводить горизонтальную полосу прокрутки)
  • fmScrollBarsVertical (выводить вертикальную полосу прокрутки)
  • fmScrollBarsBoth (выводить горизонтальную и вертикальную полосы прокрутки)

SelLenght, SelStart и SelText | Эти свойства характеризуют выделенный в поле фрагмент текста (длина, начало и сам фрагмент текста соответственно)
MaxLength | Устанавливает максимальное допустимое количество вводимых в поле символов. Если это свойство равно 0, то нет ограничений на вводимое количество символов.
PasswordChar | Устанавливает символ, отображаемый при вводе пароля. Если это свойство определено, то вместо вводимых символов в поле будет отображаться установленный символ

Надпись

Элемент управления Label (надпись) создается с помощью кнопки Надпись (Label) панели элементов управления (рис. 7.10). В основном Label используется для отображения надписей, например заголовков, не имеющих свойства Caption. Надпись не может быть изменена пользователем, но код программы во время ее выполнения может управлять текстом надписи.

Рис. 7.10. Надпись в форме

Основные свойства элемента управления Label перечислены ниже.

Caption | Возвращает текст, отображаемый в надписи
Visible | Допустимые значения: True (поле отображается во время выполнения программы) и False (в противном случае)
Multiline | Допустимые значения: True (устанавливается многострочный режим ввода текста в поле) и False (однострочный режим)
AutoSize | Допустимые значения: True (устанавливается режим автоматического изменения размера поля так, чтобы весь вводимый текст помещался в нем) и False (устанавливается фиксированный размер поля)
Wordwrap | Допустимые значения: True (устанавливается режим автоматического переноса) и False (в противном случае)

Кнопка

Элемент управления СommandButton (кнопка) создается с помощью кнопки Кнопка (CommandButton) (рис. 7.11). Элемент управления CommandButton в основном используется для инициирования выполнения некоторых действий, вызываемых нажатием кнопки, например запуск программы или остановка ее выполнения, печать результатов и т. д.

Рис. 7.11. Кнопка в форме

Приведем наиболее часто используемые свойства элемента управления CommandButton.

Caption | Возвращает текст, отображаемый на кнопке
Cancel | Допустимые значения: True (устанавливаются отменяющие функции для кнопки, т. е. нажатие клавиши <Esc> приводит к тем же результатам, что и нажатие кнопки) и False (в противном случае)
Visible | Допустимые значения: True (кнопка отображается во время выполнения программы) и False (в противном случае)
Enabled | Допустимые значения: True (запрещено нажатие кнопки пользователем) и False (в противном случае)
Accelerator | Назначает клавишу, при нажатии на которую одновременно с клавишей <Alt> происходит запуск действий, связанных с кнопкой. Например, CommandButtonl .Accelerator = "С"
Picture | Внедряет на поверхность кнопки картинку. Например, CommandButtonl . Picture = LoadPicture ("с: \my doc\Kpyг.bmp") Функция LoadPicture (ПолноеИмяФайла) Считывает графическое изображение. Аргумент ПолноеИмяФайла указывает полное имя графического файла
Default | Задает кнопку по умолчанию, т. е. устанавливает ту кнопку, для которой действия, связанные с ней, будут выполняться при нажатии клавиши <Enter>

Список

Элемент управления ListBox (список) создается с помощью кнопки Список (ListBox) (рис. 7.12). Элемент управления ListBox применяется для хранения списка значений. Из списка пользователь может выбрать одно или несколько значений, которые в последующем будут использоваться в тексте программы.

Рис. 7.12. Список в форме

Приведем наиболее часто используемые свойства элемента управления ListBox.

Listlndex | Возвращает номер текущего элемента списка. Нумерация элементов списка начинается с нуля
ListCount | Возвращает число элементов списка
Toplndex | Возвращает элемент списка с наибольшим номером
ColumnCount | Устанавливает число столбцов в списке
TextColumn | Устанавливает столбец в списке, элемент которого возвращается свойством Text

Enabled

Допустимые значения: True (запрещен выбор значения из списка пользователем) и False (в противном случае)

Text

Возвращает выбранный в списке элемент

List

Возвращает элемент списка, стоящий на пересечении указанных строки и столбца. Синтаксис:

List (row, column)

RowSource

Устанавливает диапазон, содержащий элементы списка

Control Source

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

MultiSelect

Устанавливает способ выбора элементов списка. Допустимые значения: П fmMultiSelectsingle (выбор только одного элемен-та) П fmMuitiSeiectMuiti (разрешен выбор нескольких элементов посредством либо щелчка, либо нажатием клавиши <Пробел>), П fmMultiSeiectExtended (разрешено использование клавиши <Shift> при выборе ряда последовательных элементов списка)

Selected

Допустимые значения: True (если элемент списка выбран) и False (в противном случае). Используется для определения выделенного текста, когда свойство MultiSelect имеет значение fmMuitiSeiectMuiti или fmMultiSeiectExtended

ColumnWidths

Устанавливает ширину столбцов списка."

Синтаксис:

ColumnWidths = String

  • string — строка, устанавливающая ширину столбцов В следующем примере устанавливается ширина каждого из трех столбцов списка:
    With ListBoxl . ColumnCount = 3 .ColumnWidths = "20;30;30"
    End With

ColumnHeads

Допустимые значения: True (выводятся заголовки столбцов раскрывающегося списка) и False (в противном случае)

ListStyle

Допустимые значения:

  • fmListstylePlain (выбранный элемент из списка выделяется цветом)
  • fmListstyieOption (перед каждым элементом в списке располагается флажок и выбор элемента из списка соответствует установке этого флажка)

MatchEntry

Выводит первый подходящий элемент из списка при наборе его имени на клавиатуре. Допустимые значения:

  • fmMatchEntryNone (режим вывода подходящего элемента в списке отключен)
  • fmMatchEntryFirstLetter (вводит подходящий элемент по набранной первой букве. В этом случае, предпочтительно, чтобы элементы списка были бы упорядочены в алфавитном порядке)
  • fmMatchEntryComplete (вводит подходящий элемент по полному набранному имени)

BoundColumn

Устанавливает тип, возвращаемый свойством value. А именно,

  • если свойство BoundColumn равно 0, то свойство value возвращает индекс выбранной строки, т. е. в этом случае оно действует как свойство ListIndex.
  • Если свойство BoundColumn принимает значение из диапазона от 1 до количества столбцов в списке, то свойство value возвращает элемент из выбранной строки, с.тоящий в столбце, определенном свойством

    BoundColumn

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

Clear

Удаляет все элементы из списка

Remove Itern

Удаляет из списка элемент с указанным номером.

Синтаксис:

Removeltem (index)

  • index — номер удаляемого из списка элемента

Add I tern

Добавляет элемент в список.

Синтаксис:

Addltem ,( [ item [, varIndex) ] )

  • Iitem — элемент (строковое выражение), добавляемый в список
  • Varlndex — номер добавляемого элемента

Заполнение списка

Заполнить список можно одним из следующих способов.

Поэлементно, если список состоит из одной колонки (рис. 7.13) | With ListBoxl .Addltem "Июнь" .Addltem "Июль" .Addltem "Август" .Listlndex = 0 End With

Рис. 7.13. Список с одной колонкой элементов

Массивом, если список состоит из одной колонки | With ListBox1 .List = Array ( "Июнь", "Июль", "Август") .Listlndex = 1 End With
Из диапазона A1 : в4 , в который предварительно введены элементы списка. Результат выбора (индекс выбранной строки) выводится в ячейку С1. | With ListBoxl .ColumnCount =2 .RowSource = "A1:B4" .ControlSource = "Cl" .BoundColumn = 0 End With
Поэлементно, если список состоит из нескольких колонок, например двух | With ListBoxl .ColumnCount = 2 .Addltem "Июнь" .List(0,1} = "Сессия" .Addltem "Июль" .List(l,1) = "Каникулы" .Addltem "Август" .List (2, 1) = "Каникулы" End With
Массивом, если список состоит из нескольких колонок, например двух | Dim A (2, 1) As String A{0, 0) = "Июнь" A(0, 1) = "Сессия" A(l, 0) = "Июль" А(1, 1) = "Каникулы" А (2, 0) = "Август" А (2, 1) = "Каникулы" With ListBoxl .ColumnCount = 2 .List = A End With

Выбор нескольких элементов из списка

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

Рис. 7.14. Выбор нескольких элементов из списка

With ListBox1

.List = Array(1, 3, 4, 5, 6, 7, 8, 9)

.Listlndex = 0

.MuitiSeiect = fmMultiSelectMulti

Среднее = 0

n = 0

For i = 0 To .ListCount - 1

If .Selected(i) = True Then

n = n + 1

Среднее = Среднее + .List(i)

End IF

Next i

End With

Среднее = Среднее / n

Поле со списком

Элемент управления СотbоВох (поле со списком) создается с помощью кнопки Поле со списком (СотЬоВох) (рис. 7.15). Элемент управления СотЬоВох применяется для хранения списка значений. Он сочетает в себе функциональные возможности списка ListBox и поля TextBox. В отличииее от ListBox, в элементе управления СотЬоВох отображается только один элемент списка. Кроме того, у него отсутствует режим выделения нескольких элементов списка, но он позволяет вводить значение, используя поле ввода, как это делает элемент управления TextBox.

Свойства Объекта СотЬоВох, такие как Listlndex, ListCount, Enabled, List и методы clear, Removeitem и Additem аналогичны соответствующим свойствам и методам списка ListBox. Кроме того, у него есть ряд уникальных свойств.

Рис. 7.15. Поле со списком в форме

Приведем наиболее употребляемые из уникальных свойств элемента управления СотЬоВох.

DropButtonStyle

Устанавливает вид раскрывающегося списка. Допустимые значения:

  • fmDropButtonStylePlain (кнопка без символов)
  • FmDropButtonStyleArrowDisplays (кнопка со стрелкой)
  • FmDropButtonStyleEllipsis (кнопка с эллипсом)
  • FmDropButtonStyleReduce (кнопка С линией)

ListRows

Устанавливает число элементов, отображаемых в раскрывающемся списке

MatchRequired

Допустимые значения: True (в поле ввода раскрывающегося списка нельзя ввести значения, отличные от перечисленных в списке, т. е. в поле со спискам отключается функция поля ввода) и False (в противном случае)

MatchFound

Допустимые значения: True (среди элементов раскрывающегося списка имеется элемент, совпадающий с вводимым в поле ввода раскрывающегося списка) и False (в противном случае)

Полоса прокрутки и счетчик

Элемент управления scrollBar (полоса прокрутки) создается с помощью кнопки Полоса прокрутки (ScrollBar) (рис. 7.16).

Рис. 7.16. Полоса прокрутки и счетчик в форме

Приведем наиболее часто используемые свойства элемента управления ScrollBar.

Value | Возвращает текущее значение полосы прокрутки (только целые неотрицательные числа)
Min | Минимальное значение полосы прокрутки (только целые неотрицательные числа)
Max | Максимальное значение полосы прокрутки (только целые неотрицательные числа)
SmallChange | Устанавливает шаг изменения значения при щелчке ! по одной из стрелок полосы прокрутки
Enabled | Допустимые значения: True (пользователь может изменить значение полосы прокрутки) и False (в про- ; тивном случае)
Visible | Допустимые значения: True (полоса прокрутки отображается во время выполнения программы) и False ; (в противном случае)

Элемент управления SpinButton (счетчик) создается с помощью кнопки Счетчик (SpinButton) (рис. 7.16). Элемент управления SpinButton по своим функциональным возможностям аналогичен полосе прокрутки. Если не быть чрезмерным буквоедом, то можно сказать, что счетчик — это полоса прокрутки без ползунка. Счетчик имеет те же свойства value, Min, мах, Enabled, Visible И SmallChange, что и полоса прокрутки.

Переключатель

Элемент управления ОptionButton (переключатель) создается с помощью кнопки Переключатель (OptionButton) (рис. 7.17). Он позволяет выбрать один из нескольких взаимоисключающих параметров или действий. Переключатели обычно отображаются группами, обеспечивая возможность выбора альтернативного варианта.

Рис. 7.17. Переключатель в форме

Приведем наиболее часто используемые свойства элемента управления OptionButton.

Value | Возвращает True, если переключатель выбран и False в противном случае
Enabled | Допустимые значения: True (пользователь может выбрать переключатель) и False, (в противном случае)
Visible | Допустимые значения: True (переключатель отображается во время выполнения программы) и False (в противном случае)
Capture | Надпись, отображаемая рядом с переключателем

Рассмотрим способ использования переключателей на примере классической игры "Орел и Решка". Выбирая один из двух переключателей, игрок загадывает один из вариантов: орел (Г для компьютера) или решка (0 для компьютера). Не зная о выборе игрока, компьютер синтезирует с раиной вероятностью либо 0, либо 1, что моделирует бросание монеты. Если игрок угадал правильную сторону монеты, подброшенную компьютером, то он выигрывает. В противном случае выигрывает компьютер. Компьютер информирует игрока о результате игры. На рис. 7.18 приведено диалоговое окно, отображаемое на экране в случае проигрыша игрока.

Рис. 7.18. Диалоговое окно, отображает на экране при проигрыше игрока

Для создания приложения, моделирующего игру "Орел и Решка", с помощью пользовательской формы userForm1 создадим диалоговое окно, показанное на рис. 7.19, а в модуле UserForm1 введем следующую процедуру, синтезирующую отклик на нажатие кнопки Бросание монеты.

Рис. 7.19. Диалоговое окно игры Орел-Решка

Private Sub CommandButtonl_Click ()

' Генерация с равной вероятностью либо 0 (решка), либо 1 (орел),

' т. е. моделирование бросания монеты '

Randomize

Монета = Int(2 * Rnd)

' Сравнение результата бросания монеты компьютером ' с ситуацией, если игрок загадал "Орел"

If OptionButtonl.Value = True Then

If Монета = 0 Then MsgBox "He везет. Займись-ка лучше изучением VBA"

If Монета = 1 Then MsgBox "Везунчик. Поздравляю, ты выиграл."

End If

'

' Сравнение результата бросания монеты компьютером

' с ситуацией, если игрок загадал "Решка"

'

If OptionButton2.Value = True Then

If Монета = 1 Then MsgBox "He везет. Займись-ка лучше изучением VBA"

If Монета = 0 Then MsgBox "Везунчик. Поздравляю, ты выиграл"

End If

End Sub

Рамка

Элемент управления Frame (рамка) создается с помощью кнопки Рамка (Frame) (рис. 7.20). Он используется для визуальной группировки элементов управления. Основным свойством рамки является Capture, отображающее надпись рамки.

Флажок и выключатель

Элемент управления checkBox (флажок) создается с помощью кнопки Флажок (Checkbox) (рис. 7.21). Этот элемент управления предоставляет пользователю возможность выбора. Флажок обычно имеет два состояния: установленное и сброшенное, но может настраиваться на выбор из трех альтернатив. Флажок имеет те же свойства value, Enabled, visible и Capture, что и переключатель. Кроме того, флажок обладает уникальным свойством Triplestate, позволяющим производить выбор из трех альтернатив. Свойство Triplestate может принимать два значения: False (выбор из двух альтернатив .True и False) и True (выбор из трех альтернатив True, False и Null).

Рис. 7.20. Рамка в форме

Рис. 7.21. Флажок и выключатель в форме

Элемент управления ToggieButton (выключатель) создается с помощью кнопки Выключатель (ToggieButton) (рис. 7.21). Этот элемент управления предоставляет пользователю те же возможности, что и флажок.

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

Private Sub UserForm_Initialize()

' Выключатели

ToggleButtonl.Value = True

ToggleButton2.Value = False

ToggleButton3.TripleState = True

ToggleButton3.Value = Null

'

' Флажки

CheckBoxl.Value = True

CheckBox2.Value = False

CheckBox3.TripleState = True

CheckBox3.Value = Null

End Sub

Рис. 7.22. Три допустимых состояния выключателя и флажка

Рисунок

Элемент управления image (рисунок) создается с помощью кнопки Рисунок (Image). Он используется для отображения графических файлов в формате bmp, cur, gif, ico, jpg и wmf. Перечислим некоторые из его свойств, используемых для управления выводом изображения.

AutoSize

Допустимые значения: True (рисунок автоматически изменяет размер для того, чтобы отобразить изображение целиком) и False (в противном случае)

Picture

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

Синтаксис:

Picture = LoadPicture (ПолноеИмяФайла)

  • ПолноеИмяФайла — полное имя отображаемого графического файла

Pictures izeMode

Устанавливает масштабирование рисунка. Допустимые значения:

  • fmpictureSizeModeClip (не помещающиеся в границах объекта части рисунка обрезаются)
  • fmPictureSizeModeStretch (рисунок масштабируется так, чтобы он занимал всю поверхность объекта)
  • fmPictureSizeModeZoom (рисунок масштабируется с сохранением относительных размеров так, чтобы он помещался целиком внутри объекта)

PictureAlignment

Устанавливает расположение рисунка внутри объекта. Допустимые значения:

  • fmPictureAlignmentTopLeft (в верхнем левом углу)
  • fmPictureAlignmentTopRight (в Верхнем Правом углу)
  • fmPictureAlignmentCenter (в центре)
  • fmPictureAlignmentBottomLeft (в нижнем левом углу)
  • fmPictureAlignmentBottomRight (в нижнем Правом углу)

PictureTiling

Допустимые значения: True (объект покрывается мозаикой из рисунка) и False (в противном случае)

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

Private Sub UserForm_Initialize() With Imagel

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeZoom

.Picture = LoadPicture("c:\Face.bmp")

End With

With Image 2

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeStretch

.Picture = LoadPicture("c:\Face.bmp") End With '

With Image2

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeStretch

.Picture = LoadPicture("c:\Face.bmp")

End With

With Image3

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeClip

.Picture = LoadPicture("c:\Face.bmp")

End With

With Image4

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureTiling = True

.Picture = LoadPicturet"c:\Face.bmp")

End With

End Sub

Рис. 7.23. Четыре примера размещения рисунка

Ссылки на ячейки и диапазоны

Элемент управления RefEdit (редактирование ссылок) создается с помощью кнопки RefEdit (рис. 7.24). Элемент управления RefEdit обычно используется для ввода ссылок на ячейки или диапазоны. Основным свойством элемента управления RefEdit является Text, возвращающее строку, введенную в поле ввода этого элемента управления.

Рис. 7.24. Элемент управления RefEdit в форме

Набор страниц

Элемент управления MultiPage (набор страниц) создается с помощью кнопки Набор страниц (MultiPage) (рис. 7.25). Этот элемент управления реализует многостраничные диалоговые окна. Заголовки страниц отображаются на вкладках. Переход от страницы к странице осуществляется выбором вкладки посредством щелчка кнопкой мыши.

Рис. 7.25. Набор страниц в форме

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

Объект MultiPage содержит в себе семейство Pages, являющееся набором всех страниц, входящих в этот объект.

Перечислим свойства объекта MultiPage.

Value и BoundValue | Возвращают номер активной страницы. Нумерация производится с нуля
MultiRow | Допустимые значения: True (если ярлыки не помещаются ; в одну строку, то они выводятся в несколько строк) и False (если ярлыки не помещаются в одну строку, то появляется полоса прокрутки, позволяющая переходить от страницы к странице)
Selectedltem | Возвращает выбранную страницу

Семейство Pages, содержащее все страницы, входящие в объект MultiPage, имеет единственное свойство count, возвращающее число элементов семейства. Кроме того, у семейства Pages имеются следующие методы.

Add

Создает новую страницу.

Синтаксис:

Set Object = object. Add ( [ Name [, Captitsn [, index]]])

  • Oobject — семейство Pages
  • Name — имя страницы
  • Caption — текст, отображаемый на ярлыке страницы
  • Iindex — номер страницы, нумерация страниц производится с 0

Clear

Удаляет все страницы из семейства Pages

Remove

Удаляет страницу из семейства Pages

Item

Возвращает страницу со специфицированным индексом.

Синтаксис:

Set Object = object . Item(collectionindex)

Набор вкладок

Элемент управления Tabstrip (набор вкладок) создается с помощью кнопки Набор вкладок (TabStrip) (рис. 7.26). Он позволяет создать несколько вкладок в диалоговом окне. Объект TabStrip содержит в себе семейство Tabs, представляющее собой набор всех вкладок. Объект Tabstrip и семейство таБз обладают теми же свойствами и методами, что и объект MuitiPage и семейство Pages .

Рис. 7.26. Набор страниц 6 форме

Дополнительные элементы управления

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

  1. Выбрать команду Сервис, Дополнительные элементы (Tools, Additional Controls).
  2. В появившемся на экране окне Дополнительные элементы (Additional Controls) (рис. 7.27) в списке Доступные элементы (Available Controls) установить флажок напротив добавляемого элемента.
  3. Нажать кнопку ОК.

Удаление ненужного элемента управления из панели элементов почти аналогично добавлению, а именно, надо:

  1. Выбрать команду Сервис, Дополнительные элементы (Tools, Additional Controls).
  2. В появившемся на экране окне Дополнительные элементы (Additional Controls) (рис. 7.27) в списке Доступные элементы (Available Controls) снять флажок напротив удаляемого элемента.
  3. Нажать кнопку ОК.

Рис. 7.27. Диалоговое окно Дополнительные элементы

Среди дополнительных элементов управления очень полезным является элемент управления Calendar (календарь) (рис. 7.28). Этот объект представляет средство для организации удобного интерфейса по вводу дат. Элемент управления конструируется в форме с помощью кнопки Календарь (Calendar)

Рис. 7.28. Календарь в форме

Перечислим основные свойства элемента управления calendar.

Day

Возвращает выбранный день

DayFont , DayFontColor

Устанавливают шрифт и цвет шрифта для названий дней недели

DayLenght

Допустимые значения:

  • Длинный (Long) (отображаются полные названия дней)
  • Средний (Medium) (в русской версии — отображаются две буквы из названий дней, в английской -три буквы)
  • Короткий (Short) (отображается только по первой букве из названия дня)

FirstDay

Первый день недели. Допустимые значения от воскресенье (Sunday) до суббота (Saturday)

Month

Возвращает выбранный месяц

MonthLenght

Допустимые значения: длинный ( Long ) (отображаются полные названия месяца) и короткий (short) (отображаются только первые три буквы из названия месяца)

ShowDays

Допустимые значения: True (отображаются названия дней недели) и False (в противном случае)

ShowDataselected

Допустимые значения: True (отображается выбранная дата в верхней части календаря) и False (в противном случае)

Value

Возвращает выбранную дату

Year

Возвращает выбранный год

Перечислим основные методы элемента управления calendar.

NextDay, NextWeek, NextMonth и NextYear | Устанавливает следующий день, неделю, месяц и год
PreviousDay, PreviousWeek, PreviousMonth и PreviousYear | Устанавливает предыдущий день, неделю, месяц и год
Today | Устанавливает текущую дату в календаре

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

Private Sub Calendarl_Click()

Cells (1, 1).Value = Calendar1.Value

End Sub

Последовательность выбора элементов управления

Последовательность перехода от одного элемента управления к другому определяет порядок, в соответствии с которым активизируются эти элементы управления при нажатии клавиши <Таb>. Для установки последовательности перехода в пользовательской форме необходимо:

  1. Находясь в редакторе Visual Basic выбрать команду Вид, Последовательность перехода (View, Tab Order).
  2. В появившемся диалоговом окне Последовательность перехода (Tab Order) с помощью клавиш Вниз (Move Down) и Вверх (Move Up) изменить порядок выделенного элемента управления в зависимости от потребности (рис. 7.29).

Рис. 7.29. Диалоговое окно

Последовательность перехода

Другим способом задания последовательности перехода является определение свойства TabIndex элемента управления. При этом надо помнить, что начальному элементу соответствует значение свойства Tabindex, равное 0, второму — 1, третьему — 2 и т. д.

Инициализация и отображение диалогового окна

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

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

Приведем пример процедуры инициализации диалогового окна (рис. 7.30), в котором рассчитываются размеры периодических выплат при постоянной процентной ставке.

Рис. 7.30. Диалоговое окно Периодических выплат

Private Sub UserForeinitialize ()

' Процедура инициализации и активизации диалогового окна

'

'

' Первоначальный выбор переключателя Гистограмма

'

OptionButtonl. Value = True

' Назначение клавише <Enter> функции кнопки Вычислить

With CommandButtonl

.Default = True

.ControlTipText = "Вычисление процентных ставок" & Chr(13) &

"составление отчета на рабочем листе" End With

CommandButton2.ControlTipText = "Кнопка отмены"

'

'

On Error GoTo СообщениеО With Imagel

'

' Установка такого же цвета границы элемента управления Рисунок,

' как и его фон

.BorderColor = .BackColor

'

'

' Загрузка рисунка, соответствующего переключателю Гистограмма '

.Picture = LoadPicture("VBA3_F1.BMP")

End With

'

UserForml.Show

Exit Sub

'

' В случае отсутствия файла с рисунком отображается сообщение

'

Сообщение0:

If Err.Number Then

MsgBox "Нет графического файла VBA3_F1.BMP." & Chr(13) &

"Работаем без картинки", vbCritical, "Выплаты"

End If

'

Resume Next

End Sub

Закрытие диалогового окна

В VBA диалоговые окна работают в режиме модального диалога. Это означает, что пользователь, прежде чем перейти к выполнению действий, не связанных с текущим активным диалоговым окном, должен его закрыть. Закрытие диалогового окна производится методом Hide. Следующая процедура является примером процедуры закрытия диалогового окна. Эта процедура активизируется при нажатии кнопки CommandButton2 диалогового окна UserForm1 и выполняет только одну инструкцию, осуществляющую закрытие этого диалогового окна.

Private Sub CommandButton2_Click() '

' Процедура закрытия диалогового окна '

UserForm1.Hide

End Sub

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

Отображение встроенных диалоговых окон

VBA позволяет отображать программно на экране встроенные диалоговые окна в Excel наряду с пользовательскими диалоговыми окнами. Все встроенные диалоговые окна в Excel образуют семейство Dialogs, индекс которого специфицирует активизируемое диалоговое окно. Отображение встроенного диалогового окна на экране осуществляется методом show. Например, следующая процедура при нажатии кнопки активизирует диалоговое окно Открытие документа (Open) (рис. 7.31).

Private Sub CommandButtonl_Click()

Application.Dialogs(xlDialogOpen).Show

End Sub

Рис. 7.31. Диалоговое окно Открытие документа

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

XlDialogFindFile | Диалоговое окно Открытие документа (Open) при поиске файла
xlDialogPivotTableWizard | Диалоговое окно Мастер сводных таблиц (Pivot Table Wizard)
xlDialogSaveAs | Диалоговое окно Сохранить как (Save as)
xlDialogSaveWorkbook | Диалоговое окно Сохранить (Save)
xlDialogPrint | Диалоговое окно Печать (Print)


  • ГЛАВА 8. ПРОГРАММИРОВАНИЕ ПАНЕЛИ ИНСТРУМЕНТОВ
    • ОБЪЕКТ COMMANDBAR и СЕМЕЙСТВО COMMANDBARS
    • СЕМЕЙСТВО COMMANDBARCONTROLS и ОБЪЕКТ COMMANDBARCONTROL
    • ПРИМЕР СОЗДАНИЯ ПАНЕЛИ ИНСТРУМЕНТОВ ПОЛЬЗОВАТЕЛЯ
    • ПРИМЕР СОЗДАНИЯ СТРОКИ МЕНЮ ПОЛЬЗОВАТЕЛЯ
    • СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКОЙ ПАНЕЛИ ИНСТРУМЕНТОВ ВРУЧНУЮ
    • УДАЛЕНИЕ ЭЛЕМЕНТА УПРАВЛЕНИЯ из ПАНЕЛИ ИНСТРУМЕНТОВ ВРУЧНУЮ
    • УДАЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКОЙ ПАНЕЛИ ИНСТРУМЕНТОВ ВРУЧНУЮ
    • НАЗНАЧЕНИЕ ВРУЧНУЮ МАКРОСА КНОПКЕ
    • ИЗМЕНЕНИЕ и СОЗДАНИЕ ВРУЧНУЮ ИЗОБРАЖЕНИЯ НА КНОПКЕ

Глава 8.

Программирование панели инструментов

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

Объект CommandBar и семейство CommandBars

Объект CommandBar и семейство CommandBars используются для программирования строк меню и панелей инструментов. В семействе CommandBars хранятся все строки меню и панели инструментов конкретного приложения.

Семейство CommandBars содержится в объекте Application. Оно представляет собой панели команд. В свою очередь каждый объект CommandBar содержит семейство commandBarControls, состоящее из всех элементов управления данной панели инструментов. Свойство controls объекта CommandBar возвращает семейство CommandBarControls. Элементы семейства CommandBarControis относятся к одному из трех типов.

CommandBar But ton | Кнопка или элемент меню, вызывающий выполнение команды или подпрограммы
CommandBarComboBox | Сложно организованные меню, такие как поле ввода, раскрывающийся список или поле со списком
CommandBarPopUp | Меню или вложенное меню

На рис. 8.1 показана иерархическая схема объекта CommandBar.

Рис. 8.1. Иерархическая схема объекта CommandBar

Обсудим наиболее часто используемые методы и свойства объекта CommandBar. Начнем с его методов.

Add Delete

Создает новую панель команд и добавляет ее в семейство CommandBars

Синтаксис:

Add (Name, Position, MenuBar, Temporary)

  • Name — имя создаваемой панели команд
  • Position — определяет местоположение панели команд. Допустимые значения:
    • msoBarLeft (привязка строки меню к левой границе окна основного приложения)
    • msoBarTop (привязка строки меню к верхней границе окна основного приложения)
    • msoBarRight (привязка строки меню к правой границе окна основного приложения)
    • msoBarBottom (привязка строки меню к нижней границе окна основного приложения)
    • msoBarFloating (свободное размещение строки меню на экране)
    • msoBarPopup (устанавливает, будет ли панель команд контекстным меню)
  • MenuBar — допустимые значения: True (панель команд заменяет активную строку меню) и False (в противном случае)
  • Temporary — допустимые значения: True (панель команд удаляется при закрытии Excel) и False (в противном случае) Удаляет панель команд

ShowPopUp

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

Синтаксис:

ShowPopUp (х, у)

  • х — х-координата панели команд
  • у — у-координата панели команд

Reset

Восстанавливает в исходное состояние (по умолчанию) встроенную панель инструментов

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

Enabled

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

Visible

Определяет, видима ли строка панели команд. Например, скрыть панель инструментов Форматирование (Formatting) можно с помощью следующей инструкции:

Application. CommandBars ("Formatting" ) .Visible = False

Отобразить все панели инструментов можно с помощью следующей инструкции:

Application. CommandBars .Visible = True

Controls

Возвращает семейство commandBarControis, состоящее из всех элементов управления конкретной панели инструментов

Position

Возвращает местоположение панели команд. Допустимые значения:

  • msoBarLeft (привязка строки меню к левой границе окна основного приложения)
  • msoBarTop (привязка строки меню к верхней границе окна основного приложения)
  • msoBarRight (привязка строки меню к правой границе окна основного приложения)
  • msoBarBottom (привязка строки меню к нижней границе окна основного приложения)
  • msoBarFloating (свободное размещение строки меню на экране)
  • msoBarPopup (устанавливает, будет ли панель команд контекстным меню)

Protection

Устанавливает защиту строки меню от изменений со стороны пользователя. Допустимые значения:

msoBarNoProtection, msoBarNoCustomize, msoBarNoResize, msoBarNoMove, msoBarNoChangeVisible, msoBarNoChangeDock, msoBarNoVerticalDock и msoBarNoHorizontalDock

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

Таблица 8.1. Названия панелей инструментов

Название (англ.) | Название (рус.)
Formatting | Форматирование
Standard | Стандартная
Visual Basic | Visual Basic
Drawing | Рисование
Web | Web
WordArt | WordArt
External Data | Внешние данные
Chart | Диаграммы
Picture | Настройка изображения
Worksheet Menu Bar | Строка меню листа
Reviewing | Рецензирование
PivotTable | Сводные таблицы
Control Toolbox | Элементы управления
Clipboard | Буфер обмена
Custom 1 | Настраиваемая 1
Stop Recording | Остановка записи
Shadow Settings | Настройка тени
3-D Settings | Настройка объема
Circular Reference . | Циклические ссылки
Full Screen | Во весь экран
Chart Menu Bar | Строка меню диаграммы
Auditing | Зависимости

Семейство CommandBarControls и объект CommandBarControl

Семейство CommandBarControls содержит все элементы конкретной панели инструментов или меню. Важнейшим методом этого семейства является метод Add, создающий новый элемент. Рассмотрим синтаксис метода Add.

Add

Добавляет новый элемент на панель управления или в меню. Возвращает объект CommandBarButton, CommandBarComboBox или CommandBarPopup.

Синтаксис:

Add (Type, Id, Parameter, Before, Temporary)

  • Type — задает тип добавляемого элемента. Допустимые значения:
    • msoControlButton (кнопка или элемент меню)
    • msoControlEdit (поле ввода)
    • msoControlOropdown (раскрывающийся список)
    • msoControlComboBox (поле со списком)
    • msoControlPopup (вложенное меню)
  • id — целое число, идентифицирующее встроенный элемент управления. Если аргумент Id равен 1 или опущен, то добавляется пустой элемент управления заданного типа
  • Parameter — задает параметр, используемый встроенным элементом управления
  • Before — индекс или имя элемента управления, перед которым добавляется новый элемент управления. Если аргумент опущен, то элемент размещается в конце панели инструментов или меню
  • Temporary — допустимые значения: True (новый элемент управления автоматически удаляется из меню или панели инструментов при закрытии приложения) и False (в противном случае)

Обсудим вкратце основные свойства объекта CommandBarControi.

Caption

Текстовая строка, отображаемая в заголовке

DescriptionText

Возвращает описание элемента управления

Enabled

Устанавливает, является ли допустимым выбранный пользователем элемент управления

FacelD

Возвращает номер встроенной кнопки, используемой в качестве элемента управления. Если это свойство равно нулю, то возвращается пустой элемент управления

OnAction

Возвращает имя макроса, выполняемого при активизации элемента управления

ShortcutText

Возвращает комбинацию горячих клавиш, назначенных элементу управления

Style

Только для объекта CommandBarButton. Устанавливает . внешний вид кнопки. Допустимые значения:

  • msoButtonAutomatic (кнопка не содержит текста и рисунка)
  • msoButtonIcon (кнопка содержит рисунок, в этом случае надо также задать свойство Icon)
  • msoButtonCaption (кнопка содержит текст, в этом случае надо также задать свойство caption)
  • msoButtonIconandCaption (кнопка содержит текст и рисунок, в этом случае надо также задать свойства Icon и Caption)

TooltipText | Текст, отображаемый в окне всплывающей подсказки
Visible | Устанавливает режим отображения (видимость) на экране кнопки

Пример создания панели инструментов пользователя

Приведем пример проекта, который создает интерфейс приложения, состоящего из строки меню и одной панели инструментов. В панель инструментов входят две кнопки и раскрывающийся список. На поверхности одной из кнопок выводится рисунок, а другой — надпись (рис. 8.2).

Рис. 8.2. Пользовательский интерфейс

Каждая из кнопок связана с макросом таким образом, что их активизация приводит к выполнению соответствующего макроса. Кроме того, эти кнопки снабжены пояснительными надписями, которые отображаются в окне всплывающей подсказки. При закрытии приложения данная панель инструментов удаляется, а ее место занимают панели инструментов Стандартная (Standard) и Форматирование (Formatting).

В окне Проект — VBAProject (Project - VBAProject) выберите лист ThisWorkbook и наберите следующие две процедуры.

Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)

'

' Процедура создания новой панели инструментов при

' открытии рабочей книги

'

' При открытии рабочей книги панели инструментов Форматирование

' и Стандартная скрываются

'

'

With Application

.CommandBars("Formatting").Visible = False

.CommandBars("Standard").Visible = False End With

' Создание новой панели инструментов с именем

' МояПанельИнструментов, которая будет

' удаляться при закрытии приложения

'

With Application.CommandBars

.Add(Name:="МояПанельИнструментов",

Position:=msoBarTop, MenuBar:=False, Temporary:=True)

.Visible = True With .Controls

' Создание кнопки с рисунком

With .Add(Type:=msoControlButton, Id:=2950)

.TooltipText = "КнопкаДейства!" .OnAction = "Действо 1"

End With

'

' Создание кнопки с надписью

With .Add(Type:=msoControlButton, Id:=l)

.Caption = "Действо"

.TooltipText = "КнопкаДейства2"

.Style = msoButtonCaption

.OnAction = "Действо 2" End With

' Создание раскрывающегося списка

With .Add(Type:=msoControlDropdown)

.Addltem "Приедет", 1 .Addltem "Уедет", 2

.Addltem "Еще не решил", 3

.Listlndex = i

End With

End With

End With

End Sub

'

Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window)

' Процедура, отображающая панели инструментов Форматирование

' ' и Стандартная при закрытии приложения

'

With Application

.CommandBars("Formatting").Visible = True

.CommandBars("Standard").Visible = True

End With

End Sub

А на листе модуля введите следующие две процедуры, которые будут выполняться при нажатии на соответствующие кнопки.

Sub Действо1()

MsgBox "Результат действа 1"

End Sub

Sub Действо 2()

MsgBox " Результат действа 2"

End Sub

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

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

Рис. 8.3. Интерфейс с пользовательской строкой меню

В окне Проект — VBA Project (Project - VBAProject) выберите лист Thisworkbook и введите на нем следующие две процедуры.

Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)

'

' Процедура создания новой строки меню при

' открытии рабочей книги. При закрытии приложения

' подданная строка удаттететея

'

With Application.CoimnandBars.Add(Name:="МоеМеню", MenuBar:=True, Temporary:=True) .Visible = True

With .Controls

'

' Создание меню Меню!

'

With .Add(Type:=msoControlPopup)

.Caption = "&Меню1" With .Controls

With .Add (Type :=msoControlButtoj»)

.Caption = "Пункт&1" .OnAction = "АтьДва!"

End With

'

' Создание подменю Меню1

With -Add(Type:=msoControlPopup)

.Caption = "&ПодМеню1" With

.Controls

With .Add(Type:=msoControlButton)

.Caption = "Пункт&2" .OnAction = "АтьДва2"

End With

With .Add(Type:=msoControlButton)

.Caption = "Пункт&З"

.OnAction = "АтьДваЗ"

End With

End With

End With

End With

End With

'

' Создание меню Меню2

'

With .Add(Type:=msoControlPopup)

.Caption = "&Меню2" With .Controls

With .Add(Type:=msoControlButton)

.Caption = "Пункт&4"

.OnAction = "АтьДва4"

End With

End With

End With

End With

End With

End Sub

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

Sub АтьДва!()

MsgBox "Стой! Стоять! Буду стрелять!"

' End Sub

'

Sub АтьДва2 ()

MsgBox "Стой! Стоять! Стреляю в воздух!"

End Sub

Sub АтьДваЗ()

MsgBox "Стой! Стоять! Последний раз стреляю в воздух!"

End Sub

'

Sub АтьДва4()

MsgBox "Стой! Стоять! Стреляю!"

End Sub

Создание пользовательской панели инструментов вручную

Иногда бывает удобнее проектировать собственную панель вручную, чем ее программировать.

Создается панель пользователя по следующему алгоритму.

Шаг 1 | Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).
Шаг 2 | В появившемся диалоговом окне Настройка (Customize) нажмите кнопку Создать (New) (рис. 8.4).

Рис. 8.4. Диалоговое окно Настройка

ШагЗ | В появившемся диалоговом окне Создание панели инструментов в поле Панель инструментов (Toolbars) введите имя новой панели инструментов, например моя панель (рис. 8.5).

Рис. 8.5. Диалоговое окно Создание панели инструментов

Шаг 4 | Нажмите кнопку ОК. Это приведет к появлению новой панели инструментов (рис. 8.6). Пусть вас не смущает ширина панели инструментов. Она будет автоматически расширяться по мере ее заполнения элементами управления.

Рис. 8.6. Новая панель инструментов и диалоговое окно Настройка

Шаг 5

Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и перетащите на новую панель нужные кнопки из списка Команды (Commands). Итак, панель инструментов создана (рис. 8.7). Программно та же панель инструментов создается следующими инструкциями:

Application. CommandBars

.Add (Name :=" Моя панель" )

.Visible = True Application. CommandBars ( "Моя панель")

. Controls .Add Type : =msoControlButton, Id:=23, Before:=l Application. CommandBars ( "Моя панель")

. Controls. Add Type:=msoControlButton, Id:=211, Before:=2 Application. CommandBars ( "Моя панель").Controls.

Add Type:=msoControlButton,

Id:=1031, Before :=3

Application. CommandBars ("Моя панель") .Controls.

Add Type:=msoControlButton, Id:=166, Before:=4

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

Рис. 8.7. Новая панель инструментов Моя панель

Удаление элемента управления из панели инструментов вручную

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

Шаг 1 | Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).
Шаг 2 | После появления диалогового окна Настройка (Customize) выберите удаляемую кнопку и перетащите ее за пределы панели инструментов в область рабочего листа, но так, чтобы она не попала на другую панель инструментов.
ШагЗ | Отпустите кнопку мыши. Элемент управления удален. Удалите по указанному выше алгоритму, например, четвертую кнопку из панели инструментов моя панель. Программно тот же результат достигается инструкцией: Application. CommandBars ("Моя панель") .Controls (4) .Delete

Удаление пользовательской панели инструментов вручную

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

Шаг 1 | Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).
Шаг 2 | Раскройте вкладку Панели инструментов (Toolbars) диалогового окна Настройка (Customize). Выделите пользовательскую панель и сбросьте соответствующий флажок, а затем нажмите кнопку Удалить (Delete). Программно тот же результат достигается инструкцией: Application. CommandBars ("Моя панель") .Delete

Назначение вручную макроса кнопке

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

Шаг 1 | Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).
Шаг 2 | Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и выберите элемент управления, который требуется связать с макросом. Нажмите кнопку Изменить выделенный объект (Modify selection). В появившемся меню выберите команду Назначить макрос (Assign Macro) (рис. 8.8).

Рис. 8.8. Меню с командой Назначить макрос

ШагЗ | Появится диалоговое окно Назначить макрос (Assign Macro) (рис. 8.9). В списке Имя макроса (Macro Name) выберите имя макроса, назначаемое элементу управления. Нажмите кнопку ОК диалогового окна Назначить макрос (Assign Macro) и кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь макрос назначен кнопке.

Рис. 8.9. Диалоговое окно Назначить макрос

Изменение и создание вручную изображения на кнопке

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

1 Шаг | Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель 1 инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).
Шаг 2 | Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и выберите кнопку, которую следует видоизменить. Нажмите кнопку Изменить выделенный объект (Modify selection). Выберите команду Выбрать значок для кнопки (ChangeButton Image) и один из значков в появившемся меню (рис. 8.10). Нажмите кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь изображение на кнопке изменилось.

Рис. 8.10. Диалоговое окно со значками

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

Рис. 8.11. Диалоговое окно Редактор кнопок

Шаг 2 | Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и выберите кнопку, которую следует видоизменить. Нажмите кнопку Изменить выделенный объект (Modify selection). Выберите команду Изменить значок на кнопке (Edit Button Image).
ШагЗ | Появится диалоговое окно Редактор кнопок (Edit Button) (рис. 8.11). Используя средства этого редактора можно создать любое изображение на поверхности кнопки. Нажмите кнопку OK диалогового окна Редактор кнопок (Edit Button) и кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь изображение на кнопке изменилось.


  • ГЛАВА 9. ПРОГРАММИРОВАНИЕ СРЕДСТВ ДЛЯ РАБОТЫ СО СПРАВОЧНОЙ ИНФОРМАЦИЕЙ
    • СТРУКТУРА ПОМОЩНИКА
    • ТИПЫ ПОМОЩНИКА
    • СВОЙСТВА ОБЪЕКТА ASSISTANT
    • ОБЪЕКТ BALLOON

Глава 9.

Программирование средств для работы со справочной информацией

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

Структура помощника

Помощник программируется на VBA при помощи объекта Assistant. Структура объекта Assistant приведена на рис. 9.1. Важной особенностью объекта является то, что это единичный объект, не являющийся элементом никакого семейства объектов. В каждый момент времени можно вывести только одного помощника. Но помощника можно видоизменять по ходу работы программы. Объект Balloon представляет собой окно помощника, содержащее список разделов справки, связанных с помощником. В этот список могут входить надписи и флажки. Все надписи, входящие в объект Balloon, образует семейство BalloonLabeis, а все флажки - семейство BalloonCheckBoxes.

Рис. 9.1. Структура объекта Assistant

Типы помощника

Всего имеется 9 типов помощников. По умолчанию используется помощник с именем скрепыш (Clippit). Отображением помощника на экране управляет свойство Visible объекта Assistant. Свойство Filename объекта Assistant позволяет изменить вид помощника. А свойство Name возвращает имя текущего помощника.

Перечислим используемые в VBA типы помощников.

Внешний вид | Название (рус.)
 | Скрепыш
 | Колобок
 | Робот
 | Ученый
 | Эмблема
 | Планета Земля
 | Кот
 | Пес-барбос

Свойства объекта Assistant

Перечислим основные свойства объекта Assistant.

Animation

Управляет движением помощника на экране. Допустимы 34 значения, программирующие разовые движения помощника, и 8 значений, задающих его непрерывные движения. Отметим, что некоторые анимационные эффекты не работают для всех персонажей, но использование их не приводит к ошибкам, просто помощник остается в покое, не производя предписанное действие. Приведем значения свойства Animation, задающие непрерывные действия помощника:

  • msoAnimationCheckingSomething
  • msoAnimationGetArtsy
  • msoAnimationGetTechy
  • msoAnimationSaving
  • msoAnimationSearching
  • msoAnimationThinking
  • msoAnimationWorkingAtSomething
  • msoAnimationWritingNotingSome thing
Приведем некоторые значения свойства Animation, задающие разовые действия помощника:
  • msoAnimationGestureDown
  • msoAnimationGestureLeft
  • msoAnimationGestureRight
  • msoAnimationGestureUp
  • msoAnimationGoodbye
  • msoAnimationGreeting
  • msoAnimationLookDown
  • msoAnimationLookDownLeft
  • msoAnimationLookDownRight
  • msoAnimationLookLeft
  • msoAnimationLookRight
  • msoAnimationLookUp
  • msoAnimationLookUpLeft
  • msoAnimationLookUpRight

AssistWithAlerts | Допустимые значения: True (автоматическое отображение справочной информации при возникновении ситуации, приводящей к отображению предупреждения, например при удалении рабочего листа) и False (в противном случае)
AssistWithHelp | Допустимые значения: True (отображается помощник со справкой, при нажатии клавиши <F1>) и False (в противном случае)
Filename | Возвращает полное имя файла (т. е. с указанием папки, где находится файл) для активного помощника. Имена файлов помощников имеют расширение act. Обычно Windows-файлы помощников располагаются В папке \Program Files\Microsoft Office\0ffiсе\Actors
GuessHelp | Допустимые значения: True (отображается помощник с наиболее подходящей справкой при нажатии клавиши <F1>) и False (в противном случае)
Sounds | Допустимые значения: True (помощник воспроизводит звуковой сигнал, соответствующий информационному сообщению) и False (в противном случае)
TipOfDay | Допустимые значения: True (помощник отображает сообщение при запуске приложения) и False (в противном случае)
Visible | Допустимые значения: True (помощник отображается на экране) и False (в противном случае)

Объект Balloon

Помощник выводит анимационную картинку, задаваемую типом помощника, и список разделов справки, выводимых в окне помощника. Содержание и вид окна помощника определяется объектом Balloon. Объект Balloon создается методом NewBalion объекта Assistant. Метод show отображает объект Balloon на экране.

Перечислим основные свойства объекта Balloon.

BalloonType

Задает тип надписей объекта Balloon. Допустимые значения:

  • msoBalloonTypeButtons
  • msoBalloonTypeBullets
  • msoBalloonTypeNumbers

Button

Устанавливает тип кнопок, отображаемых в окне помощника. Допустимые значения:

  • mpsoButtonSetAbortRetrylgnore
  • msoButtonSetBackClose
  • msoButtonSetBackNextClose
  • msoButtonSetBackNextSnooze
  • msoButtonSetCancel
  • rasoButtonSetNextClose
  • msoButtonSetNon
  • msoButtonSetOK
  • msoButtonSetOkCancel
  • msoButtonSetRetryCancel
  • msoButtonSetSearchClose
  • msoButtonSetTipsOptionsClose
  • msoButtonSetYesAllNoCancel
  • msoButtonSetYesNoCancel
  • msoButtonSetYesNo

Callback

Устанавливает имя процедуры, которая выполняется при отображении окна помощника

CheckBoxes

Возвращает семейство BallooncheckBoxes, флажки окна помощника

Heading

Возвращает заголовок окна помощника

Icon

Возвращает тип значка, отображаемого в левом верхнем углу окна помощника. Допустимые значения:

  • msoIconAlert
  • msoIconNone
  • msoIconTip

Labels

Возвращает семейство BalloonLabels, все надписи окна помощника

Text

Возвращает текст, располагаемый в окне помощника между заголовком и надписями.

Приведем два примера программирования помощника.

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

Рис. 9.2. Первый пример окна помощника

Sub ПримерПомощника()

Set МойПомощник = Assistant.NewBalloon

Assistant.Animation = msoAnimationSearching

With МойПомощник

.BalloonType = msoBalloonTypeNumbers

.Heading = "Советы дня"

.Text = "Народные мудрости"

.Labels(1).Text = "Под лежачий камень вода не течет"

.Labels(2).Text = "Капля воды камень точит"

.Labels(3).Text = "Жизнь с VBA стала веселей"

.CheckBoxes(1).Text = "Жить - хорошо"

.Checkboxes(2).Text = "А хорошо жить - еще лучше"

. Show Select Case True

Case . CheckBoxes (1) .Checked

MsgBox "Выбрали хорошую жизнь" Case

.CheckBoxes(2).Checked

MsgBox "Выбрали лучшую жизнь"

End Select

End With

End Sub

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

Sub ПримерЕщеОдногоПомощника()

Dim Номер As Integer

Set МойПомощник = Assistant.NewBalloon

Assistant.Animation = msoAnimationSaving

With МойПомощник

.BalloonType = msoBalloonTypeButtons

.Heading = "Советы дня"

.Text = "Народные мудрости"

.Labels(1).Text = "Под лежачий камень вода не течет"

.Labels(2).Text = "Капля воды камень точит"

.Labels(3).Text = "Жизнь с VBA стала веселей" Номер = .Show Snd With

Select Case Номер Case Is = 1

MsgBox "Вывод: пора начать читать книгу по VBA"

Case Is = 2

MsgBox "Вывод: если приложить достаточно усилий," & Chr(13) &

"то можно разобраться с любой проблемой" Case Is = 3

MsgBox "Что верно, то верно. Excel с VBA - это мощь"

End Select

End Sub

Рис. 9.3. Второй пример окна помощника


  • ПРЕДИСЛОВИЕ
    • КРАТКИЙ ОБЗОР МАТЕРИАЛА КНИГИ
  • ВВЕДЕНИЕ
    • ЗАЧЕМ НУЖЕН VBA
    • СОЗДАНИЕ ФУНКЦИЙ ПОЛЬЗОВАТЕЛЯ

Предисловие

Настоящая книга является с одной стороны, подробным справочником по Visual Basic for Applications (VBA), а с другой стороны, самоучителем по составлению и разработке приложений, написанных на этом языке. Это уникальное сочетание, которое, следуя рекламному подходу, можно назвать "два в одном", обеспечивает большую гибкость при решении читателем своих собственных задач. Самоучитель на большом количестве примеров умело и доступно обучает, как можно быстро и эффективно решать разнообразные задачи. В справочнике приводится подробное описание возможностей VBA, имея такие сведения под рукой у читателя исчезнет необходимость бегать по магазинам в поиске дополнительной литературы при написании самостоятельных приложений, что несомненно сбережет время и кошелек.

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

С помощью VBA можно легко и быстро создавать пользовательские приложения, используя единую для всех офисных программ среду и язык. Научившись разрабатывать приложения для одной офисной программы, например Excel (которой, как наиболее популярной офисной программе, в основном и посвящена данная книга), можно создавать приложения и для других офисных программ, например Access. Внимательно читая эту книгу, можно стать искусным разработчиком и научиться пользоваться мощными средствами разработки приложений Excel для того, чтобы конструировать эффективные и применимые к реальной жизни приложения. Кроме того, по своей структуре, интерфейсу и синтаксису VBA образует ядро Visual Basic. Поэтому тот, кто изучит программирование на VBA очень быстро может освоить и Visual Basic.

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

Краткий обзор материала книги

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

  • Во введении на простейших примерах объясняется, зачем нужен VBA.
  • Глава 1 отвечает на вопрос: "Что такое VBA?". В ней также дано описание основных структурных элементов VBA.
  • В главе 2 рассматриваются основные элементы объектной иерархической структуры VBA.
  • В главах 3 и 4 дан обзор методов VBA, программирующих команды для работы с рабочим листом, которые позволяют строить прогрессии, создавать фильтры и консолидировать данные, организовывать сценарии и структуры, решать уравнения, подводить промежуточные итоги и сортировать данные.
  • Глава 5 описывает, как строятся диаграммы в VBA.
  • В главе 6 обсуждается, как программировать одно из наиболее мощных средств по анализу данных — сводные таблицы.
  • В глава 7 приведен обзор элементов управления VBA и описание того, как в VBA создаются и программируются диалоговые окна.
  • Глава 8 продолжает начатый в предыдущей главе разговор по созданию пользовательского интерфейса. В ней объясняется, как создать пользовательское меню и панели инструментов.
  • Глава 9 посвящена вопросу создания очень полезного и наглядного средства Microsoft Office — помощника.
  • В главе 10 дано обзорное описание процесса создания графических объектов.
  • В главе И приводится краткая информация по основным понятиям языка VBA: какими типами данных оперирует VBA, что такое переменная, константа, массив и динамический массив, как создается пользовательский тип переменной. В ней перечислены операции, встроенные функции, операторы и процедуры VBA, а также типы процедур.
  • В главе 12 обсуждаются принципы создания процедур обработки ошибок, а также встроенные в редактор VBA мощные средства по отладке программ.
  • В главе 13 описаны типы файлов и способы работы с ними в VBA.
  • Глава 14 объясняет, как в VBA можно создавать пользовательские объекты.
  • В главе 15 дан обзор методов по работе с внешними базами данных, использовании Microsoft Query, открытой связи с базой данных (ODBC) и объектов доступа к данным (DAO).

Во второй части приведено 14 уроков самоучителя по созданию пользовательских приложений:

  • В уроке 1 на примере создания приложение по игре в орел и решку показывается: как в редакторе VBA создается программа и как она запускается на выполнение; создание пользовательского диалогового окна; программный контроль за вводом в поле чисел, а не строковой информации; программное управление запретом ввода данных в поле; работа с функцией генератора случайных чисел; вывод числовой информации в поле.
  • В уроке 2 на примере разработки приложения по расчету маргинальной процентной ставки объясняется: как программно решаются уравнения; программный ввод формулы в ячейку рабочего листа; финансовые функции; проверка корректности ввода данных из диалогового окна; назначение клавишам <Enter> и <Esc> функций кнопок диалогового окна; создание всплывающих подсказок у элементов управления; использование MacroRecorder для упрощения и убыстрения написания кода; программное форматирование ячеек рабочего листа.
  • В уроке 3 на рассмотренном примере работы со списком показывается: как заполняется список; управление выбором нескольких элементов из списка; как выполнить специфицированную операцию над выбранными элементами из списка с помощью переключателей.
  • В уроке 4 на примере разработки приложения по расчету амортизации объясняются: финансовые функции расчета амортизации; управление видимостью отдельных элементов управления в окне диалога; программный вывод объектов WordArt на рабочий лист.
  • В уроке 5 на рассмотренном примере показывается: ввод формул при помощи элемента управления RefEdit; нахождение корня уравнения зависящего от параметра; установка параметров метода GoalSeek; создание прогрессий на рабочем листе; программирование протаскивания маркера заполнения выделенного диапазона на рабочем листе; построение диаграмм.
  • В уроке 6 на обсужденных примерах показывается: программное управление размерами диалогового окна и элементов управления; задание последовательности элементов управления в виде массива объектов; определение текущего объема вклада; задание параметров счетчика; как можно программно или при помощи drag-and-drop операции перемещать элементы управления по поверхности диалогового окна.
  • В уроке 7 на примере конструируемого приложения демонстрируется: как при помощи диалогового окна можно заполнить базу данных на рабочем листе; программирование примечаний и текстовых полей на рабочем листе; использование переключателя и флажков; создание пользовательского заголовка окна приложения и программное закрепление области.
  • В уроке 8 на примере разработки приложения по построению поверхности объясняется: как табулируются функции, зависящие от двух аргументов; преобразование формулы с аргументами х и у в формулу рабочего листа; программное построение поверхности; запись диаграммы в графический файл; считывание графического файла в элемент управления image; программное управление углом зрения, под которым смотрят на поверхность, и углом поворота поверхности вокруг оси Z.
  • В уроке 9 на примере конструируемого приложения по расчету периодических выплат показывается: как используется финансовая функция пплдт (РМТ); вывод результатов табулирования функции в элемент управления ListBox (список); построение диаграммы, тип которой выбирается в группе переключателей; программная проверка наличия файла на диске.
  • В уроке 10 на примере разработки приложения по работе с базой данных демонстрируется: конструирование пользовательского интерфейса; создание приложения, работающего с несколькими диалоговыми окнами; поиск информации в базе данных; редактирование записей в базе данных; удаление ненужных записей из базы данных; архивация данных; программирование фильтрации и сортировки данных; создание сводных таблиц; добавление пользователем новых элементов в список с полем во время выполнения программы.
  • В уроке И на примере игры в крестики и нолики объясняется: удаление рисунка из элемента управления; учет количества щелчков по элементу управления; управление видимостью границы элемента управления; создание игрового поля.
  • В уроке 12 на примере приложения по построению линии тренда показывается: конструирование многостраничных диалоговых окон и линии тренда; применение метода offset для вывода данных на рабочем листе; считывание данных из каждой отдельной ячейки диапазона.
  • В уроке 13 на примере приложения по составлению расписания обсуждается: передача информации между элементами управления при обработке события click; управление видимостью рисунков и цветом элементов управления.
  • В уроке 14 на примере показана работа с текстовыми файлами: считывание и запись в файл последовательного доступа; считывание и запись записей в файла прямого доступа; создание и работа с пользовательскими типами данных; создание простейшего текстового редактора и заставки приложения.

Введение

Зачем нужен VBA

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

Рис. В.1. Таблица ежемесячных расходов

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

Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro). Появится диалоговое окно Запись макроса (Record Macro) (рис. В.2). Это диалоговое окно позволяет задать параметры макроса.

Поля Имя макроса (Macro Name) и Описание (Description) предназначены для задания имени макроса и его описания. Последнее важно для многократно используемых макросов. Наша память не долговечна и, не имея подсказки в виде описания, через некоторое время бывает трудно вспомнить, для чего тот или иной макрос создавался. По умолчанию макросам присваиваются имена макрос1, Макрос2 и т. д. Чтобы было легче разпознать макрос, лучше не оставлять стандартное, а присвоить ему какое-нибудь уникальное имя, поясняющее его назначение. В данном случае присвоим макросу, например, имя Расходы. Поле Сочетание клавиш (Shortcut Key) позволяет назначить макросу комбинацию клавиш, т. е. указать клавишу, которая в сочетании с клавишей <Ctrl> будет служить для запуска его на выполнение. Назначать комбинацию клавиш макросу совсем не обязательно. Это стоит делать только для постоянно используемых макросов, для быстрого доступа к ним. Макрос всегда можно вызвать командой Сервис, Макрос (Tools, Macro). Раскрывающийся список Сохранить в книге (Store Macro in) предназначен для выбора книги, в которой будет сохранен макрос. Если выбрать Личная книга макросов (Personal Macro Workbook), то макрос будет сохранен в специальной скрытой книге. Эта книга хотя и скрыта, но является открытой, и записанные в ней макросы доступны для других рабочих книг. Команда Окно, Отобразить (Window, Unhide) позволяет отобразить личную книгу макросов. Если в раскрывающемся списке выбрать Эта книга (This Workbook) (этот выбор по умолчанию предлагает компьютер), то макрос сохранится на новом листе модуля в активной рабочей книге, а если выбрать Новая книга (New Workbook) — в новой рабочей книге.

Рис. В.2. Диалоговое окно Запись макроса

Итак, в диалоговом окне Запись макроса (Record Macro) в поле Имя макроса (Macro Name) введем Расходы, а в поле Описание (Description) — Расчет месячных расходов и нажмем кнопку ОК. Появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Построим шаблон таблицы расходов по следующему алгоритму:

  1. Активизируем ячейку B1 и введем в нее Расходы.
  2. Активизируем ячейку А2 и введем в нее транспорт.
  3. Активизируем ячейку A3 и введем в нее коммунальные.
  4. Активизируем ячейку А 4 и введем в нее Еда.
  5. Активизируем ячейку А5 и введем в нее Развлечения.
  6. Активизируем ячейку Aб и введем в нее Одежда.
  7. Активизируем ячейку A7 и введем в нее компьютер.
  8. Активизируем ячейку А8 и введем в нее машина.
  9. Активизируем ячейку A9 и введем в нее прочие.
  10. Активизируем ячейку A10 и введем в нее итого.
  11. Активизируем ячейку вю и введем в нее формулу =СУМM(В2:В9), вычисляющую суммарные расходы.
  12. Выберем диапазон В2:В9 и при помощи раскрывающегося списка Границы (Borders) панели инструментов Форматирование (Formatting) создадим рамку, окаймляющую этот диапазон.
  13. Выберем диапазон дю:вю и при помощи раскрывающегося списка Цвет заливки (Fill Color) панели инструментов Форматирование (Formatting) окрасим этот диапазон в желтый цвет.
  14. Выберем ячейку Bi и при помощи раскрывающегося списка Цвет заливки (Fill Color) панели инструментов Форматирование (Formatting) окрасим эту ячейку в желтый цвет.
  15. Выберем диапазон А2:Д9 и при помощи раскрывающегося списка Цвет заливки (Fill Color) панели инструментов Форматирование (Formatting) окрасим этот диапазон в светло-бирюзовый цвет.
  16. Выберем столбец д, изменим его ширину так, чтобы введенный в диапазон А2: Д9 текст помещался в этом столбце.
  17. Выберем диапазон А2:В9 и при помощи мастера диаграмм, вызываемого кнопкой Мастер диаграмм (Chart Wizard) панели инструментов Стандартная (Standard), создадим диаграмму.

Рабочий лист теперь будет выглядеть так, как показано на рис. В.1. Остановим запись макроса, нажав кнопку Остановить запись (Stop Recording).

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

Для просмотра записанной процедуры необходимо выбрать команду Сервис, Макрос, Макросы (Tools, Macro, Macros), которая вызовет диалоговое окно Макрос (Macro) (рис. В.З).

В этом диалоговом окне в списке выделим макрос и нажмем кнопку Изменить (Edit). Это вызовет появление главного окна редактора VBA (рис. В.4). Ниже приведен полный текст записанного макроса.

Рис. В.З. Диалоговое окно Макрос

Рис. В.4. Главное окно редактора VBA

Sub Расходы()

'

' Расходы Макрос

' Расчет месячных расходов '

'

Range("Bl").Select

ActiveCell.FormulaRlCl = "Расходы"

Range("A2").Select

ActiveCell.FormulaRlCl = "Транспорт"

Range("A3").Select

ActiveCell.FormulaRlCl = "Коммунальные"

Range("A4").Select

ActiveCell.FormulaRlCl = "Еда"

Range("A5").Select

ActiveCell.FormulaRlCl = "Развлечения"

Range("A6").Select

ActiveCell.FormulaRlCl = "Одежда"

Range("A7").Select

ActiveCell.FormulaRlCl = "Компьютер"

Range("A8").Select

ActiveCell.FormulaRlCl = "Машина"

Range("A9").Select

ActiveCell.FormulaRlCl = "Прочие"

Range("A10").Select

ActiveCell.FormulaRlCl = "Итого"

Range("BIO").Select

ActiveCell.FormulaRlCl = "=SUM(R[-8]C:R[-1]C)"

Range("A10:BIO").Select

Selection.Interior.Colorlndex = 36

Range("B1").Select

Selection.Interior.Colorlndex = 36

Range("A2:A9").Select

Selection.Interior.Colorlndex = 34

Columns("A:A").ColumnWidth = 13.86

Range("A2:B9").Select

Charts.Add

ActiveChart.ChartType = xlColumnClustered

ActiveChart.SetSourceData

Source:=Sheets("Лист1").Range("A2:B9"), PlotBy:=xlColumns

ActiveChart.Location Where:=xlLocationAsObject, Nаmе:="Лист1"

With ActiveChart

.HasTitle = False

.Axes(xlCategory, xlPrimary)

.HasTitle = False

.Axes(xlValue, xlPrimary)

.HasTitle = False

End With

End Sub

На первый взгляд полученный макрос выглядит довольно устрашающе, но прочитав данную книгу вы поймете, что его очень легко создавать и читать. Еще более замечательным является то, что в настоящий момент эта программа сама по себе совершенно не нужна и с ней можно работать даже не понимая записанные в ней коды. Пока о программе надо знать только ее имя -Расходы и то, что рабочий лист, на котором при помощи этого макроса будет строиться шаблон таблицы с диаграммой, должен иметь имя лист1. Ограничение на выбор имени рабочего листа не столь обременительно. Изучив эту книгу, вы легко сможете создавать универсальные приложения без каких-либо ограничений на среду. Для того чтобы воспользоваться макросом, надо перед его выполнением переименовать рабочий лист, присвоив ему имя лист1. После построения таблицы можно изменить имя рабочего листа на новое, например, на имя месяца, для которого строится текущий отчет по расходам.

Итак, активизируем новый рабочей лист, временно присвоим ему имя лист1. Выберем команду Сервис, Макрос, Макросы (Tools, Macro, Macros), которая вызовет диалоговое окно Макрос (Macro). В этом окне в списке выделим исходный макрос и нажмем кнопку Выполнить (Run). Диалоговое окно закроется и выполнится процедура, создающая на активном рабочем листе шаблон таблицы. Теперь в нее остается ввести новые данные, а расчет суммарных расходов и построение диаграммы будет происходить автоматически.

Создание функций пользователя

VBA предоставляет также возможность пользователю создавать собственные функции, работать с которыми на рабочем листе можно при помощи мастера функций точно так же, как и с любой встроенной функцией. Рассмотрим один пример построения функции пользователя. На минуту представьте себе, что вы менеджер издательства по оптовой продаже книг. Для привлечения покупателей в вашем издательстве введена прогрессивная шкала цен. Если продается от 100 до 200 экземпляров книги, то скидка от ее отпускной цены составляет 7%, если продается от 201 до 300 экземпляров, то скидка составляет 10%, а если свыше 300 экземпляров — 15%. Кроме того, для постоянных клиентов предусмотрена дополнительная скидка в размере 5%. Создадим функцию пользователя с именем стоимость для расчета стоимости Партиикниг. Аргументы этой функции назовем ЦенаОднойКниги, Количество и Скидка. Для аргумента Скидка предусмотрим только два допустимых значения: 1 для постоянных клиентов и 0 в противном случае. Построим пользовательскую функцию стоимость следующим образом:

  1. Выполните команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Visual Basic Editor), чтобы открыть окно редактора Visual Basic.
  2. Выполните команду Вставка, Модуль (Insert, Module) для создания листа модуля.
  3. Выберите значок модуля в окне Проект (Project), чтобы активизировать окно редактора кода на листе модуля.
  4. Наберите на листе модуля приведенную ниже процедуру.

Function Стоимость(ЦенаОднойКниги, Количество, Скидка)

'

' Вычисление стоимости без учета скидки для постоянных клиентов '

If Количество < 100 Then

'

' Продажа до 99 экземпляров

'

СтоимостьБезСкидки = ЦенаОднойКниги * Количество Else

If Количество <= 200 Then

'

' Продажа от 100 до 200 экземпляров

'

СтоимостьБезСкидки = ЦенаОднойКниги * Количество * 0.93

Else '

' Продажа от 201 до 300 экземпляров

'

If Количество <= 300 Then

СтоимостьБезСкидки = ЦенаОднойКниги * Количество * 0.9 Else

' Продажа свыше 300 экземпляров

'

СтоимостьБезСкидки = ЦенаОднойКниги * Количество * 0.85

End If

End If

End If

'

' Корректировка стоимости с учетом скидки для постоянных клиентов

If Скидка = 0 Then

Стоимость = СтоимостьБезСкидки Else

Стоимость = СтоимостьБезСкидки * 0.95

End If

End Function

Итак, функция пользователя стоимость создана. Она включена в категорию функций, определенных пользователем, мастера функций. Благодаря тому что в VBA допустимо применение русскоязычных имен, текст написанной программы ясен и прозрачен для понимания. Кроме того, это обеспечивает и простоту использования диалогового окна мастера функций для данной функции (рис. В.5). Названия всех параметров функции стоимость в окне мастера функций выводятся также на русском языке. Доступная для понимания структура диалогового окна позволяет использовать функцию стоимость любому пользователю, даже не владеющему VBA. Для ее применения достаточно знать только имя этой функции.

Рис. В.5. Диалоговое окно для заполнения параметров функции Стоимость