Самоучитель VBA

Что такое VBA

Что такое VBA

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

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

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



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

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

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

Классы

Классы

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



Методы

Методы

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

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

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

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

Application.Quit

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

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



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

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

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

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



Объекты OLE и ActiveX

Объекты 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.



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

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

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

Окно проекта

Окно проекта

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

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

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

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

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

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

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

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

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

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

Окно свойств

Окно свойств

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

ОСНОВНЫЕ СРЕДСТВА И ВОЗМОЖНОСТИ VBA

  • ЧАСТЬ I. ОСНОВНЫЕ СРЕДСТВА И ВОЗМОЖНОСТИ VBA

  • ГЛАВА 1. ОСНОВНЫЕ ЭЛЕМЕНТЫ VBA
  • ЧТО ТАКОЕ VBA

  • ОБЪЕКТЫ И СЕМЕЙСТВА

  • Объекты OLE и ActiveX

  • Классы

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

  • Методы

  • Свойства

  • События

  • СТРУКТУРА РЕДАКТОРА VBA
  • Окно проекта

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

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

  • Окно свойств

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

  • Часть I.

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



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

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

    Иерархия встроенных объектов 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")



    Окно Просмотр объектов

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

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


  • Окно проекта

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

    Окно проекта


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

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

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


    Диалоговое окно Параметры

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

    Range("A1").

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

    Список компонентов

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

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

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

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

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

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

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

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

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



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

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

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

    Команды меню Формат

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

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


    Окно свойств

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

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


  • Событие представляет

    События

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

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



    Свойство представляет собой атрибут объекта,

    Свойства

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

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

    В следующем примере изменяется заголовок окна 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



    Режимы работы редактора

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


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

    Методы, создающие объекты 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).

    WordArtобъект

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

    WordArtобъект
    ActiveSheet.Shapes.AddTextEffeet(msoTextEffect27,_
    "VBA " & Chr(13) & "" & Chr(10) & "Лучшее решение",
    "Impact", 36#, msoFalse, msoFalse, 87tt, 45#).Select

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

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

    Семейства 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)



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

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

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

    Dim R() As Single

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

    Синтаксис:

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

    Аргументы:

    | Preserve

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

    ИмяПеременной

    Имя переменной, удовлетворяющее стандартным правилам именования переменных

    Индексы

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

    [Нижний То] Верхний [, [Нижний То] Верхний] . . .

    Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция option Base, нижняя граница массива равняется нулю

    Тип

    Тип данных массива

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

    ReDim R(l To 10)

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



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

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

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

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

    процентная
    ставка х_начзнач

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

    ПроцентнаяСтавка
    х_НачЗнач



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

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

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

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

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

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

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

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

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

    и

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

    Возвращают минимальное и максимальное допустимые значения указанной размерности. Аргументы:
  • ИмяМассива — имя переменной массива
  • [, Размерность])

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


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

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



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

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

    В 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 (посимвольное сравнение без учета регистра)


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

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

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

    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



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

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

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

    Функция

    Проверка

    IsArray (переменная)
    IsDate (переменная)
    IsEmpty (переменная)
    IsError (переменная)
    IsNull (переменная)
    IsNumeric (переменная)
    IsObject (переменная)

    Является ли переменная массивом
    Является ли переменная датой
    Была ли переменная описана инструкцией Dim
    Является ли переменная кодом ошибки
    Является ли переменная пустым значением (Null)
    Является ли переменная числовым значением
    Является ли переменная объектом



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

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

    Некоторые функции имеют по две версии, одна из которых возвращает тип данных 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 имеются следующие, функции времени и даты.

    Функция

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

    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, значение-п] ] )



    Инструкции VBA

    Инструкции VBA

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

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


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

    Инструкция 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



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

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

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

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

    s = 0

    For Each a In Массив

    s = s + а Next a

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



    удобно использовать комментарии, т. е.

    Комментарии

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

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

    Dim a As Integer
    '

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

    '

    Dim b As String
    '
    b — строковая переменная



    Константы

    Константы

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

    Синтаксис:

    [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 Бескрайние просторы"



    Массивы

    Массивы

    Как и в других языках программирования, в 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)



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

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

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

    Функция

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

    Abs (число)
    Atn (число)
    Cos (число)

    Модуль (абсолютная величина)числа
    Арктангенс
    Косинус

    Ехр (число)

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

    Log (число)

    Натуральный логарифм

    Rnd (число)

    Случайное число из интервала [0,1).

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

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

    Sgn (число)

    Знак числа

    Sin (число)

    Синус

    Sqr (число)

    Квадратный корень из числа

    Tan (число)

    Тангенс

    Fix (число) И Int (число)

    Обе функции, int и Fix, отбрасывают дробную часть числа и возвращают целое значение.

    Различие между функциями int и Fix состоит в том, что для отрицательного значения аргумента число функция int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, a Fix — ближайшее отрицательное целое число, большее либо равное указанному



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

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

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

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

    Сумма = a + b End Function



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

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

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

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


  • Операции VBA

    Операции 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] , но предпочтительнее, во избежания путаницы, применять операцию со знаком &



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

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

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

    Синтаксис:

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

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

    х = 2

    х = х + 2

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

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

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

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

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

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


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

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

    Перечислим операторы перехода и выбора 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 не требуется тратить время на распознавание типа неописанной переменной при каждом обращении к ней.

    Синтаксис:

    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

  • ГЛАВА 11. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА VBA

  • ТИПЫ ДАННЫХ

  • ОПИСАНИЕ ПЕРЕМЕННЫХ

  • ДОПУСТИМЫЕ ИМЕНА

  • ИНСТРУКЦИЯ DЕFТИП

  • МАССИВЫ
  • Динамические массивы

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

  • КОНСТАНТЫ

  • ТИП ДАННЫХ, ОПРЕДЕЛЕННЫЙ ПОЛЬЗОВАТЕЛЕМ

  • ОПЕРАЦИИ VBA
  • Приоритеты операций

  • ВСТРОЕННЫЕ ФУНКЦИИ VBA
  • Математические функции

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

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

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

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

  • ФУНКЦИИ ВЫБОРА

  • ФУНКЦИИ, ВОЗВРАЩАЮЩИЕ СТРОКИ

  • ВСТРОЕННЫЕ ДИАЛОГОВЫЕ ОКНА

  • ИНСТРУКЦИИ VBA

  • ОПЕРАТОР ПРИСВОЕНИЯ

  • ПЕРЕНОС СТРОКИ

  • КОММЕНТАРИИ

  • РАСПОЛОЖЕНИЕ НЕСКОЛЬКИХ ОПЕРАТОРОВ НА ОДНОЙ СТРОКЕ

  • ОПЕРАТОРЫ ПЕРЕХОДА И ВЫБОРА

  • ОПЕРАТОРЫ ПОВТОРА

  • УСЛОВНАЯ КОМПИЛЯЦИЯ

  • ПРОЦЕДУРА
  • Переход в подпрограмму и возвращение из подпрограммы

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

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

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

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

  • ОБЛАСТЬ ОПРЕДЕЛЕНИЯ ПЕРЕМЕННОЙ

  • ВРЕМЯ ЖИЗНИ ПЕРЕМЕННОЙ

  • Глава 11.

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



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

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

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

    Синтаксис:

    GoSub строка

    строка

    Return

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

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



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

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

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

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

    у = sin(Application.Pi()*х) + (1 + х)^(1/2)/(1 + х^2)
    у = Sin (Application. Pi ()*x) + (1 + х)^(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



    Процедура

    Процедура

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

    Синтаксис:

    [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 вызывается в выражении по своему имени, за которым следует список аргументов в скобках.

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



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

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

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

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

    у = х + 2



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

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

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

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

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

    Function Fact(n As Integer) As Integer
    If n
    Fact = 1 Else

    Fact = Fact(n - 1) n
    End If
    End Function

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

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

  • Если а делится на b, то НОД(а, b) = b
  • В противном случае — НОД(а, 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

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



    Диалоговое окно

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

    Диалоговое окно
    Пример окна сообщения

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

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

    Диалоговое окно Еще один пример окна сообщения
    Private Sub ТестОкон()
    '

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

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

    '

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

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

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

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

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

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

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

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

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

    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



    Значения аргумента

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


    Значения аргумента

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

    Значения аргумента

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

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

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

    Синтаксис:

    [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 имеются следующие основные типы данных:

    Тип данных

    Размер (байт)

    Диапазон значений

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

    Синтаксис:

    #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) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.

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

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

    В проектах 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




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

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

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

  • Математические функции
  • Функции проверки типов
  • Функции преобразования форматов
  • Функции обработки строк
  • Функции времени и даты
  • Ниже рассмотрены основные функции из этих категорий.



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

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

    Вызов процедуры 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



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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

    Перехват и обработка ошибок
    Из диалогового окна 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).


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

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

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

    ПРОЦЕДУРЫ ОБРАБОТКИ ОШИБОК И ОТЛАДКА ПРОГРАММ

  • ГЛАВА 12. ПРОЦЕДУРЫ ОБРАБОТКИ ОШИБОК И ОТЛАДКА ПРОГРАММ

  • РАЗРАБОТКА ПРОЦЕДУР, ПРЕДОТВРАЩАЮЩИХ ПОЯВЛЕНИЕ ОШИБОК
  • Перехват и обработка ошибок

  • ОТЛАДКА ПРОГРАММ
  • Ошибки компиляции

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

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

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

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

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

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

  • Глава 12.

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



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

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

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

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

    Private Sub CommandButtonl_Click()

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

    Числитель = CDbl(TextBoxl.Text)
    Знаменатель = CDbl(TextBox2.Text)
    Результат = Числитель / Делитель
    TextBoxS.Text = CStr(Результат)
    End Sub

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

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

    Точка останова
    Точка останова устанавливается или снимается с помощью команды Отладка, Точка останова (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).

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

    Существует также программный способ вывода значений свойств и переменных в диалоговом окне Контрольные значения (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) ввести соответствующую инструкцию и нажать клавишу . Единственным ограничением на использование, инструкции является то, что она должна быть набрана в одну строку. Например,
    s=0: For i=1 to 5: s=s+i^2: Next i: MsgBox s

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


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


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

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

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

    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 путь



    Объект FileSearch

    Объект FileSearch

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

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


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

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

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

    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



    ПХЯ 13 1 Иерархическая структура объекта FileSearch

    пХЯ. 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

    РАБОТА С ФАЙЛАМИ

  • ГЛАВА 13. РАБОТА С ФАЙЛАМИ

  • Типы ФАЙЛОВ в VBA

  • ОТКРЫТИЕ И ЗАКРЫТИЕ ФАЙЛА

  • ВВОД ДАННЫХ В ФАЙЛ ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА

  • ВЫВОД ДАННЫХ ИЗ ФАЙЛА ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА

  • РАБОТА с ФАЙЛОМ ПРОИЗВОЛЬНОГО ДОСТУПА

  • НАИБОЛЕЕ УПОТРЕБЛЯЕМЫЕ ИНСТРУКЦИИ и ФУНКЦИИ
    ПРИ РАБОТЕ С ФАЙЛАМИ

  • ОБЪЕКТ FILESEARCH


  • Глава 13.

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



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

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

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

    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



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

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

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

    Файл последовательного доступа

    Рассматривается как последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно

    Файл произвольного доступа

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

    Бинарный файл

    Является частным случаем файла произвольного доступа. Размер записи в бинарном файле считается равным 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



    ПОЛЬЗОВАТЕЛЬСКИЕ ОБЪЕКТЫ

  • ГЛАВА 14. ПОЛЬЗОВАТЕЛЬСКИЕ ОБЪЕКТЫ

  • СОЗДАНИЕ МОДУЛЕЙ КЛАССА

  • ПРОЦЕДУРЫ PROPERTY LET, PROPERTY SET и PROPERTY GET

  • ПРИМЕР СОЗДАНИЯ КЛАССА


  • Глава 14.

    Пользовательские объекты



    Пример создания класса

    Пример создания класса

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

    Итак, в модуле класса, у которого установлено свойство 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

    Процедуры Property Let Property Set и Property Get

    Процедуры 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



    Создание модулей класса

    Создание модулей класса

    В VBA наряду с огромным числом встроенных объектов предусмотрена возможность создания пользовательских объектов. Использование таких объектов позволяет сократить текст программы и сделать его более понятным. Пользовательские объекты являются элементами пользовательских классов (или образно говоря, классы являются формами, из которых "пекутся" конкретные объекты). Пользовательские классы конструируются в модулях классов, которые создаются в редакторе Visual Basic выбором команды Вставка, Модуль класса (Insert, Class Module). При создании классов надо предусмотреть его инициализацию, описание свойств и методов, которыми будет наделен объект.

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

  • Выберите команду Вставка, Модуль класса (Insert, Class Module). Откроется окно нового модуля класса.
  • Нажмите клавишу и присвойте в появившемся окне свойству Name имя класса. Имя модуля класса является именем класса объектов.
  • В разделе описания модуля объявите переменные уровня модуля, которые используются как "значения свойств".
  • Инициализируйте класс при помощи процедуры Private Sub Class_Initialize. В этой процедуре надо указать значения, принимаемые по умолчанию переменными уровня модуля, описывающими "значения свойств".
  • При помощи процедур Property Let объявите имена свойств, значениями которых являются числовые данные, а при помощи процедур Property set объявите имена свойств, значениями которых являются объекты. Если какое-то свойство — только для чтения, то для него не надо составить процедуру Property Let.
  • При помощи процедур Property Get установите возможность считывания значения свойств.
  • Создайте методы класса. Методы создаются при помощи обычных процедур и функций. Если метод возвращает число, то для его конструирования используется функция, а в остальных случаях — процедура.
  • Допустимо также создание процедуры Private Sub Class_Terminate для удаления объекта из памяти по завершению работы с ним.


  • Что такое ODBC?

    Что такое ODBC?

    Для унификации способа работа с базами данных, созданными разными средствами (например, Access, FoxPro, SQL Server и т. д.), Microsoft разработал интерфейс доступа к данным, называемый протоколом ODBC (Open Database Connectivity - открытая связь с базой данных). Ввод, получение и работа с данными происходит при помощи структурированного языка запросов (SQL, Structured Query Language). Протокол ODBC обеспечивает стандарт передачи данных из одного приложения в другое.

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



    DАО — объектный доступ к данным

    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 представляет связь между полями таблиц или запросами.

    Microsoft Jet

    Microsoft Jet

    Microsoft Jet — это ядро базы данных, которое обеспечивает возможность доступа к данным из любого приложения, поддерживающего OLE Automation, в частности VBA и Excel, независимо от интерфейса конкретной системы управления базами данных. Ядро Jet хранит свою информацию по умолчанию в файлах с базами данных, имеющих расширение mdb. Такие файлы содержат таблицы, модули, формы, отчеты, запросы и индексы. Конечно, формат mdb — это не единственный формат баз данных, с которыми работает Microsoft Jet. Он поддерживает форматы баз данных, созданных с помощью FoxPro, dBASE и т. д.



    Объект Recordset

    Объект 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



    Открытие базы (источника) данных

    Открытие базы (источника) данных

    Открыть базу данных можно методом 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)



    Порядок работы при объектном доступе к данным

    Порядок работы при объектном доступе к данным

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

  • Создать рабочую область (объект Workspace)
  • Открыть базу (источника) данных (объект Database)
  • Создать набор записей (объект Recordset)
  • Выполнить непосредственную работу с конкретными записями и полями


  • Пример приложения

    Пример приложения

    Рассмотрим работу с базой данных на примере следующего простого приложения, в котором используются все основные операции с записями. База данных находится в файле студенты.mdb, созданным в Access, и состоит из одной таблицы ПервыйКурс. В таблице имеются четыре поля: Фамилия, Группа, предмет и Оценка. При запуске приложения на экране отображается диалоговое окно Студенты первого курса.

    РАБОТА С ВНЕШНИМИ БАЗАМИ ДАННЫХ

  • ГЛАВА 15. РАБОТА С ВНЕШНИМИ БАЗАМИ ДАННЫХ

  • СОЗДАНИЕ ЗАПРОСОВ С ПОМОЩЬЮ MICROSOFT QUERY

  • ЧТО ТАКОЕ ODBC?

  • MICROSOFT JET

  • DАО — ОБЪЕКТНЫЙ ДОСТУП К ДАННЫМ

  • ПОРЯДОК РАБОТЫ ПРИ ОБЪЕКТНОМ ДОСТУПЕ К ДАННЫМ
  • Создание рабочей области

  • Открытие базы (источника) данных

  • Объект Recordset

  • ПРИМЕР ПРИЛОЖЕНИЯ

  • Глава 15.

    Работа с внешними базами данных



    База данных о студентах

    Рисунок 15.1. База данных о студентах


    База данных о студентах



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

    Рисунок 15.10. Иерархия объектов DАО

    Иерархия объектов DАО
    Для возможности использования объектов доступа необходимо задать ссылку на библиотеку DАО 3.5. Для этого в редакторе VBA необходимо выбрать команду Сервис, Ссылки (Tools, References) и в появившемся диалоговом окне Ссылки (References) установить флажок напротив элемента Microsoft DAO 3.5 Object Library


    Диалоговое окно Студенты первого курса

    Рисунок 15.11. Диалоговое окно Студенты первого курса

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

  • При нажатии кнопки Удалить удаляется запись.
  • При нажатии кнопки новая запись создается новая запись по данным, введенным в поля ввода.
  • При нажатии кнопки Редактировать вносятся изменения в запись из базы данных.
  • При нажатии кнопки Закрыть закрываются база данных и диалоговое окно.
  • При выборе переключателя хорошисты и отличники в диалоговом окне выводятся данные только о хорошистах и отличниках, а при выборе переключателя все — выводится информация обо всех студентах.
  • '

    ' Переменные уровня модуля
    '

    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

    Диалоговое окно Выбор источника данных

    Рисунок 15.2. Диалоговое окно Выбор источника данных


    Диалоговое окно Выбор источника данных



    Диалоговое окно Select Database

    Рисунок 15.3. Диалоговое окно Select Database

    Диалоговое окно 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.

    Диалоговое окно Возврат данных в Microsoft Excel

    Рисунок 15.8. Диалоговое окно Возврат данных в Microsoft Excel


    Диалоговое окно Возврат данных в 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-строковое выражение, указывающее критерии, по которым создается запрос



    Создание рабочей области

    Создание рабочей области

    Рабочую область можно создать методом 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)



    Создание запросов с помощью Microsoft Query

    Создание запросов с помощью 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) и нажмите кнопку ОК, что приведет к запуску мастера запросов.

    Создание запросов

    с помощью 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-строковое выражение, указывающее критерии, по которым создается запрос



    ПРАКТИЧЕСКИЕ ПРИЕМЫ ПРОГРАММИРОВАНИЯ НА VBA

  • ЧАСТЬ П. ПРАКТИЧЕСКИЕ ПРИЕМЫ ПРОГРАММИРОВАНИЯ НА VBA

  • УРОК 1. ТЕМА: ИГРА "ОРЕЛ И РЕШКА"
  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

  • Часть II.

    Практические приемы программирования на VBA



    Практика

    Практика

  • Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Edit Visual Basic), откроется окно редактора Visual Basic.
  • Выберите команду Вставить User Form (Insert UserForm).
  • Используя панель элементов и окно свойств, заполните пользовательскую форму элементами управления (Рисунок У1.1), создав требуемое диалоговое окно приложения.




  • У1 1 Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка

    Рисунок У1.1. Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка

    У1 1 Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка
  • Для написания кода программы, связанного с пользовательской формой, достаточно дважды щелкнуть, например, кнопку Бросание монеты. Откроется редактор кода на листе модуля userFormi. Более того, он откроется на том месте, где программируются действия, связанные с элементом управления, который вы дважды щелкнули. Если код еще не набран, то при открытии редактора кода появятся инструкции заголовка и окончания процедуры, которая будет ассоциирована с элементом управления. В данном случае в редакторе кода будет: Private Sub CommandButtonl_Click() End Sub

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

  • Когда-то Конфуций сказал: "То что слышу — забываю, то что вижу -запоминаю, а то что делаю — поминаю", а Мао Дзе Дун добавил: "Для того чтобы стул сдвинулся, его надо сдвинуть". Итак, вдохновившись этими двумя мудростями, наберем текст следующей программы на листе модуля 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

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

    Бросание монеты

    запускает на выполнение процедуру

    CommandButton1 Click

  • В переменной партия учитывается номер очередной партии.
  • В поле Банк разрешен только программный ввод данных. Перед началом игры первой партии проверяется, является ли вводимое данное числом в диапазоне от 1 до 10 000. Если это условие не выполняется, отображается соответствующее сообщение (Рисунок У 1.2), предлагающее пользователю откорректировать данные. В поле Банк снова разрешен ввод данных пользователем. После чего происходит выход из процедуры для повтора ввода данных.
  • Генерируется бросание модели. Определяется, кто выиграл в текущей партии. Корректируется информация о максимальном и минимальном выигрыше в течение игры, если какие-то изменения в этой информации имели место. Вся информация о текущем состоянии игры отображается в полях ввода.
  • Нажатие кнопки Отмена запускает на выполнение процедуру

    CommandButton2 Click

    Закрывает диалоговое окно.

    Для запуска приложения достаточно нажать кнопку Запуск подпрограммы/UserForm или выбрать команду Запуск, Запуск подпрограммы/UserForm.
    На экране появится диалоговое окно игры. Игрок вводит в поле Банк сумму денег, и потом, выбирая соответствующий переключатель в группе выбор, загадывает орел или Решка. Нажатие кнопки Бросание монеты приводит к подбрасыванию компьютером монеты. Текущий счет игрока отображается в поле Банк. В поле партия выводится номер текущей партии, а в полях максимум и минимум выводятся максимальный и минимальный счет игрока втечение предыдущих партий. На Рисунок У 1.3 приведено диалоговое окно орел-решка на 30-м ходе игры при начальном банке в 100 единиц. Отображаемая информация в диалоговом окне Орел-Решка показывает, что 30 партий изнурительной игры принесли игроку выигрыш только в 2 единицы. Если бы игрок не жадничал и остановил игру на 18 ходе, то его выигрыш был бы в два раза больше. А если бы игрок струсил, когда стал проигрывать, и вышел из игры на 3 ходе, то его проигрыш составил бы 3 единицы.

    У1 2 Возможное сообщение о неправильном вводе данных в поле Банк

    Рисунок У1.2. Возможное сообщение о неправильном вводе данных в поле Банк


    У1 2 Возможное сообщение о неправильном вводе данных в поле Банк



    У1 3 Диалоговое окно ОрелРешка

    Рисунок У1.3. Диалоговое окно Орел-Решка

    У1 3 Диалоговое окно ОрелРешка


    Самостоятельное задание

    Самостоятельное задание

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

    Теория

    Теория

    Для моделирования бросания монеты потребуется генератор случайных чисел. Функция Rnd возвращает случайное число типа single из диапазона [0,1). Это приятное известие, что в VBA имеется генератор случайных чисел из диапазона [0,1). Но нам-то надо, чтобы моделировался процесс бросания монеты и с равной вероятностью генерировались два числа, скажем, 1 для орла и 0 для решки. На самом деле, этого легко достичь, рассматривая вместо Rnd функцию Int(2*Rnd). Функция int отбрасывает дробную часть аргумента и возвращает его целую часть. По аналогии с помощью функции Int (6*Rnd) +1 можно моделировать бросание игральной кости.



    Цель урока



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

  • Как при помощи метода Goaiseek решаются уравнения

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

  • Применение финансовой функции пз (PV)

  • Проверку корректности ввода данных из диалогового окна

  • Назначение клавишам и функций кнопок диалогового окна

  • Назначение кнопкам всплывающих подсказок

  • Использование MacroRecorder для упрощения и ускорения написания кода

  • Программное форматирование ячеек рабочего листа



    Практика



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

    Практика
    Рис. У2.1. Диалоговое окно Маргинальная процентная ставка

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


    UserForm Initialize


  • Активизирует диалоговое окно.
  • Запрещает ввод данных пользователем в поля Текущий объем ссуды И Маргинальная процентная ставка.

  • Назначает клавише функцию кнопки отмена, а клавише - вычислить.
  • Связывает с кнопками Вычислить и отмена всплывающие подсказки.

  • Нажатие кнопки вычислить запускает на выполнение процедуру

    CommandButton1_Click


  • Проверяет, являются ли вводимые данные числами. Если хотя бы одно из них не является числом, то на экране отображается соответствующее информационное сообщение с ; установкой фокуса на поле, где произведен некорректный ввод данных.
  • Проверяет, будет ли ссуда меньше, чем возвращаемая сумма денег. Если ссуда больше этой суммы, то отображается сообщение с указанием, на сколько ссуда меньше возвращаемой суммы денег (рис. У2.2).
  • Используя финансовую функцию рабочего листа, пз (PV) вычисляет чистый текущий объем ссуды при введенной процентной ставке.

  • Используя метод Goaiseek (подбор параметра), находит маргинальную процентную ставку, т. е. ставку, при которой чистый текущий объем ссуды равен величине самой ссуды.
  • Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (рис. У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

    '

    ' Клавише назначена функция кнопки Вычислить

    ' Кнопке Вычислить назначен текст всплывающей подсказки

    '

    With CommandButtonl .Default = True

    .ControlTipText = "Расчет и составление отчета на рабочем листе"

    End With

    '

    ' Клавише назначена функция кнопки Отмена

    ' Кнопке Отмена назначен текст всплывающей подсказки

    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 включен, осталось решить данную задачу вручную на рабочем листе и посмотреть на записанный макрос.

    Решите задачу в соответствии со следующим алгоритмом:

  • Выберите команду Сервис, Подбор параметра (Tools, Goal Seek).

  • В появившемся диалоговом окне Подбор параметра (Goal Seek) в поле Установить в ячейке (Set cell) укажите ссылку на ячейку B6, где содержится формула с левой частью решаемого уравнения. В поле Значение (То value) введите число 10 000, значение правой части решаемого уравнения. В поле Изменяя значение ячейки (By changing cell) укажите ссылку на ячейку B7, которая отведена под неизвестную в решаемом уравнении.

  • Нажмите на кнопку ОК. Появится диалоговое окно Результат подбора параметра (Goal Seek Status) с информацией о найденном решении.

  • Нажмите на кнопку ОК диалогового окна Результат подбора параметра (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 по следующему алгоритму:

  • Выделите ячейку вз. Выберите команду Формат, Ячейки (Format, Cells). В появившемся диалоговом окне Формат ячеек (Format Cells), на вкладке Число (Number) в списке Числовые форматы (Category) выберите Денежный (Currency). В поле Число десятичных знаков (Decimal places) введите 0, а в раскрывающемся списке Обозначения (Symbol) выберите р. Нажмите кнопку ОК.

  • Выделите ячейку В4 и установите в ней числовой формат, как описано в выше.

  • Выделите ячейку В5. Выберите команду Формат, Ячейки (Format, Cells). В появившемся диалоговом окне Формат ячеек (Format Cells) на вкладке Число (Number) в списке Числовые форматы (Category) выберите Процентный (Percentage). В поле Число десятичных знаков (Decimal places) введите 2. Нажмите кнопку ОК.

  • Выделите ячейку 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. ТЕМА: РАСЧЕТ МАРГИНАЛЬНОЙ ПРОЦЕНТНОЙ СТАВКИ

  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 2

    Тема: Расчет маргинальной процентной ставки



    У2 1 Диалоговое окно Маргинальная процентная ставка

    Рисунок У2.1. Диалоговое окно Маргинальная процентная ставка

    У2 1 Диалоговое окно Маргинальная процентная ставка
    Обсудим, как приведенная ниже программа решает перечисленные выше задачи и что происходит в программе.
    UserForm Initialize

  • Активизирует диалоговое окно.
  • Запрещает ввод данных пользователем в поля Текущий объем ссуды И Маргинальная процентная ставка.
  • Назначает клавише функцию кнопки отмена, а клавише - вычислить.
  • Связывает с кнопками Вычислить и отмена всплывающие подсказки.
  • Нажатие кнопки вычислить запускает на выполнение процедуру

    CommandButton1_Click

  • Проверяет, являются ли вводимые данные числами. Если хотя бы одно из них не является числом, то на экране отображается соответствующее информационное сообщение с ; установкой фокуса на поле, где произведен некорректный ввод данных.
  • Проверяет, будет ли ссуда меньше, чем возвращаемая сумма денег. Если ссуда больше этой суммы, то отображается сообщение с указанием, на сколько ссуда меньше возвращаемой суммы денег (Рисунок У2.2).
  • Используя финансовую функцию рабочего листа, пз (PV) вычисляет чистый текущий объем ссуды при введенной процентной ставке.
  • Используя метод Goaiseek (подбор параметра), находит маргинальную процентную ставку, т. е. ставку, при которой чистый текущий объем ссуды равен величине самой ссуды.
  • Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (Рисунок У2.3).


  • Нажатие кнопку отмена запускает на выполнение процедуру

    CommandButton2_Click

    Закрывает диалоговое окно.



    У2 2 Сообщение о некорректном вводе данных

    Рисунок У2.2. Сообщение о некорректном вводе данных


    У2 2 Сообщение о некорректном вводе данных



    У2 3 Отчет выводимый на рабочем листе программой расчета маргинальной процентной ставки

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

    У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

    '

    ' Клавише назначена функция кнопки Вычислить

    ' Кнопке Вычислить назначен текст всплывающей подсказки
    '

    With CommandButtonl .Default = True
    .ControlTipText = "Расчет и составление отчета на рабочем листе"

    End With
    '

    ' Клавише назначена функция кнопки Отмена

    ' Кнопке Отмена назначен текст всплывающей подсказки

    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 включен, осталось решить данную задачу вручную на рабочем листе и посмотреть на записанный макрос.

    Решите задачу в соответствии со следующим алгоритмом:

  • Выберите команду Сервис, Подбор параметра (Tools, Goal Seek).
  • В появившемся диалоговом окне Подбор параметра (Goal Seek) в поле Установить в ячейке (Set cell) укажите ссылку на ячейку B6, где содержится формула с левой частью решаемого уравнения. В поле Значение (То value) введите число 10 000, значение правой части решаемого уравнения. В поле Изменяя значение ячейки (By changing cell) укажите ссылку на ячейку B7, которая отведена под неизвестную в решаемом уравнении.
  • Нажмите на кнопку ОК. Появится диалоговое окно Результат подбора параметра (Goal Seek Status) с информацией о найденном решении.
  • Нажмите на кнопку ОК диалогового окна Результат подбора параметра (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 по следующему алгоритму:

  • Выделите ячейку вз. Выберите команду Формат, Ячейки (Format, Cells). В появившемся диалоговом окне Формат ячеек (Format Cells), на вкладке Число (Number) в списке Числовые форматы (Category) выберите Денежный (Currency). В поле Число десятичных знаков (Decimal places) введите 0, а в раскрывающемся списке Обозначения (Symbol) выберите р. Нажмите кнопку ОК.
  • Выделите ячейку В4 и установите в ней числовой формат, как описано в выше.
  • Выделите ячейку В5. Выберите команду Формат, Ячейки (Format, Cells). В появившемся диалоговом окне Формат ячеек (Format Cells) на вкладке Число (Number) в списке Числовые форматы (Category) выберите Процентный (Percentage). В поле Число десятичных знаков (Decimal places) введите 2. Нажмите кнопку ОК.
  • Выделите ячейку 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.4. Диалоговое окно Формат ячеек

    У2 4 Диалоговое окно Формат ячеек
    Созданные в данном макросе инструкции как раз и осуществляют требуемое в программе приложения форматирование.


    Самостоятельное задание



    Разработать приложение с диалоговым окном Решение уравнения (рис. У2.5) для реализации следующих задач:

  • Нахождение корней уравнения хеbx = а

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

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

    Самостоятельное задание
    Рис. У2.5. Диалоговое окно Решение уравнения

    Теория



    Рассматриваемое приложение решает задачу следующего типа. В одной стране со стабильной валютой, скажем рублем, жил-был Ксенофон Заковыркин, начинающий бизнесмен. Однажды ему была предложена следующая сделка. Ксенофон дает в долг 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.



    Цель урока



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

  • Заполнять списки

  • Выбирать несколько элементов из списка

  • Выполнять специфицированную операцию над выбранными элементами из списка



    Практика



    Создадим приложение, которое позволит выбрать несколько чисел, выводимых В списке В диалоговом Окне Операции над элементами списка (рис. У3.1).

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

    Практика
    Рис. У3.1. Диалоговое окно Операции над элементами списка

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


    UserForm Initialize


  • Активизирует диалоговое окно.
  • Запрещает ввод данных в поле Результат,
  • Назначает клавише функцию кнопки Отмена, а клавише — Вычислить.
    Связывает с кнопками вычислить и отмена, а также с переключателями всплывающие подсказки.

  • Нажатие кнопки вычислить запускает на выполнение процедуру

    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

    ' Назначение клавише функции кнопки Вычислить

    ' и задание текста всплывающей подсказки

    With CommanandButtonl

    .Default = True

    .ControlTipText = "Нахождение результата"

    End With

    '

    ' Назначение клавише функции кнопки Отмена

    ' и задание текста всплывающей подсказки

    '

    CommandButton2.Cancel = True

    '

    ' Задание -заголовка пользовательской формы

    '

    UserForm1.Caption = "Операции над элементами списка"

    UserForm1.Show

    End Sub



    РАБОТА СО СПИСКОМ

  • УРОК 3. ТЕМА: РАБОТА СО СПИСКОМ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 3.

    Тема: Работа со списком



    Самостоятельное задание

    Интересной особенностью приводимой процедуры инициализации userForm_initiaiize является то, что заголовок диалогового окна вводится программно при помощи свойства Caption, а не вручную при помощи окна Свойства (Properties).

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

    В качестве самостоятельного задания составьте программу нахождения среднего балла студентов, выбранных из списка в диалоговом окне Средний балл (рис. УЗ.2). Список заполните из данных, введенных из диапазона на рабочем листе с помощью свойства RowSource объекта ListBox. Фамилии студентов пусть будут расположены в столбце А, а их оценки в столбце в диапазона с данными о студентах. Создайте в программе обработчик ошибок, который будет проверять, являются ли данные из второго столбца списка с оценками студентов числами. Если хотя бы одно из этих данных не является числом, программа должна проинформировать об этом пользователя с просьбой исправить найденную некорректность. Обратите внимание также на то, чтобы в диалоговом окне средний балл надписи на кнопках ок и Отмена для большей презентабельности были выведены полужирным шрифтом увеличенного размера.

    Самостоятельное задание
    Рис. УЗ.2. Диалоговое окно Средний балл

    Цель урока



    В уроке разрабатывается приложение, решающее задачу расчета амортизации в зависимости от выбранного метода: стандартного или А;-кратного учета амортизации. На примере данного приложения вы узнаете, что такое:

  • Финансовые функции расчета амортизации

  • Управление видимостью отдельных элементов управления в окне диалога

  • Программный вывод объектов WordArt на рабочий лист



    ПХЯ У4 1 Диалоговое окно Расчет амортизации

    пХЯ. У4.1. Диалоговое окно Расчет амортизации

    ПХЯ У4 1 Диалоговое окно Расчет амортизации
    Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.

    UserForm Initialize

  • Активизирует диалоговое окно.
  • Запрещает ввод данных пользователем в поле Кратность метода.
  • Назначает клавише функцию кнопки Отмена, а клавише -- Вычислить.
  • Назначает кнопке вычислить сочетание клавиш +, а кнопке Отмена — +.
  • В группе тип амортизации при инициализации диалогового окна назначает выбор переключателя Стандартный метод. За счет выбора этого переключателя при инициализации диалогового окна не отображаются надпись кратность метода и соответствующие ей поле и счетчик (Рисунок У4.2).
  • Устанавливает для счетчика минимальное значение, равное 2, и шаг изменения значений счетчика, также равный 2, для убыстрения прокрутки ; счетчика. Промежуточные значения вводятся в i поле Кратность метода не с помощью счетчика, i а посредством клавиатуры.


  • ПХЯ У4 2 Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета

    пХЯ. У4.2. Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета

    ПХЯ У4 2 Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета
    SpinButton1_ Change

    Изменяет значение счетчика, которое вводится в i поле Кратность метода .

    OptionButton2_Click

    Отображает в диалоговом окне надпись кратность ; метода и соответствующие ей поле и счетчик.

    OptionButton2_Click

    Скрывает в диалоговом окне надпись кратность метода и соответствующие ей поле и счетчик.

    Нажатие кнопки вычислить запускает на выполнение процедуру

    CoramandButton1_Click

  • Проверяет согласованность вводимых данных. В случае их несогласованности отображает соответствующее сообщение (Рисунок У4.3, а и У4.3, б).
  • Используя финансовую функцию рабочего листа SYD (АМГД) и DDB (ДДОБ) вычисляет величину амортизации выбранным методом.
  • Удаляет с рабочего листа все ранее созданные графические объекты и внедряет объект WordArt. Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (Рисунок У 4. 4).




  • ПХЯ У4 3 Сообщения о несогласованности вводимых данных

    пХЯ. У4.3. Сообщения о несогласованности вводимых данных


    ПХЯ У4 3 Сообщения о несогласованности вводимых данных



    ПХЯ У4 4 Отчет выводимый на рабочем листе программой расчета амортизации

    пХЯ. У4.4. Отчет, выводимый на рабочем листе программой расчета амортизации

    ПХЯ У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
    '

    ' Нажатие .клавиши эквивалентно нажатию кнопки Отмена

    CommandButton2.Cancel = True
    '

    ' Функция кнопки Вычислить выполняется по нажатию клавиш +

    ' или на русской клавиатуре +
    '

    CommandButtonl.Accelerator = "D" '

    ' Функция кнопки Отмена выполняется по нажатию клавиш +
    ' или на русской клавиатуре +<0>

    CommandButton2.Accelerator = "J"

    UserForml.Show
    '

    End Sub

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

    Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Выполните построение объекта WordArt по следующему алгоритму:

  • Нажмите кнопку Добавить объект WordArt (Insert WordArt) панели инструментов Рисование (Drawing).
  • В появившемся окне Коллекция WordArt (WordArt Gallery) выберите нужный стиль надписи. Нажмите кнопку ОК.
  • В появившемся окне Изменение текста WordArt (Edit WordArt Text) установите шрифт и размер отображаемого текста, а также в поле Текст (Text) введите текст, который будет отображаться, например Амортизация . Нажмите кнопку ОК.
  • На рабочем листе появится внедренный объект WordArt. Выберите и перенесите его в требуемое место на этом листе.
  • Для того чтобы разобраться, как происходит программное удаление объекта WordArt с рабочего листа, выделите его и удалите с помощью клавиши .
  • Перечисленные выше действия будут переведены 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. Эта идея как раз и реализована в данном приложении.



    ПХЯ У4 5 Диалоговое окно Значение или график при выборе переключателя Значение

    пХЯ. У4.5. Диалоговое окно Значение или график при выборе переключателя Значение

    ПХЯ У4 5 Диалоговое окно Значение или график при выборе переключателя Значение
  • Либо протабулировать значения этой функции на заданном интервале с заданным шагом, вывести результат табуляции в список и построить график на рабочем листе.
  • Операция, выполняемая над функцией, должна устанавливаться выбором

    Переключателя из группы Операция диалогового окна Значение или график.

    При выборе переключателя Значение в диалоговом окне должны отображаться только элементы управления, относящиеся к нахождению функции при вводимом значении аргумента (Рисунок У4.5), а при выборе переключателя график - относящиеся к табуляции функции и построению ее графика (Рисунок У4.6).

    ПХЯ У4 5 Диалоговое окно Значение или график при выборе переключателя Значение
    Рисунок У4.6. Диалоговое окно Значение или график при выборе переключателя График

    Практика



    Для решения задачи нахождения вычисления амортизации оборудования по стандартному методу или методу к-кратного учета с помощью редактора пользовательских форм создадим диалоговое окно Расчет амортизации (рис. У4.1).

    Практика
    Рис. У4.1. Диалоговое окно Расчет амортизации

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


    UserForm Initialize


  • Активизирует диалоговое окно.

  • Запрещает ввод данных пользователем в поле Кратность метода.

  • Назначает клавише функцию кнопки Отмена, а клавише -- Вычислить.
  • Назначает кнопке вычислить сочетание клавиш +, а кнопке Отмена — +.
  • В группе тип амортизации при инициализации диалогового окна назначает выбор переключателя Стандартный метод. За счет выбора этого переключателя при инициализации диалогового окна не отображаются надпись кратность метода и соответствующие ей поле и счетчик (рис. У4.2).
    Устанавливает для счетчика минимальное значение, равное 2, и шаг изменения значений счетчика, также равный 2, для убыстрения прокрутки ; счетчика. Промежуточные значения вводятся в i поле Кратность метода не с помощью счетчика, i а посредством клавиатуры.


  • Практика
    Рис. У4.2. Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета


    SpinButton1_ Change

    Изменяет значение счетчика, которое вводится в i поле Кратность метода .

    OptionButton2_Click

    Отображает в диалоговом окне надпись кратность ; метода и соответствующие ей поле и счетчик.



    OptionButton2_Click

    Скрывает в диалоговом окне надпись кратность метода и соответствующие ей поле и счетчик.

    Нажатие кнопки вычислить запускает на выполнение процедуру

    CoramandButton1_Click


  • Проверяет согласованность вводимых данных. В случае их несогласованности отображает соответствующее сообщение (рис. У4.3, а и У4.3, б).
  • Используя финансовую функцию рабочего листа SYD (АМГД) и DDB (ДДОБ) вычисляет величину амортизации выбранным методом.
    Удаляет с рабочего листа все ранее созданные графические объекты и внедряет объект 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

    '

    ' Нажатие .клавиши эквивалентно нажатию кнопки Отмена

    CommandButton2.Cancel = True

    '

    ' Функция кнопки Вычислить выполняется по нажатию клавиш +

    ' или на русской клавиатуре +

    '

    CommandButtonl.Accelerator = "D" '

    ' Функция кнопки Отмена выполняется по нажатию клавиш +

    ' или на русской клавиатуре +<0>

    CommandButton2.Accelerator = "J"

    UserForml.Show

    '

    End Sub

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

    Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Выполните построение объекта WordArt по следующему алгоритму:

  • Нажмите кнопку Добавить объект WordArt (Insert WordArt) панели инструментов Рисование (Drawing).

  • В появившемся окне Коллекция WordArt (WordArt Gallery) выберите нужный стиль надписи. Нажмите кнопку ОК.

  • В появившемся окне Изменение текста WordArt (Edit WordArt Text) установите шрифт и размер отображаемого текста, а также в поле Текст (Text) введите текст, который будет отображаться, например Амортизация . Нажмите кнопку ОК.

  • На рабочем листе появится внедренный объект WordArt. Выберите и перенесите его в требуемое место на этом листе.

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

    Перечисленные выше действия будут переведены 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. Эта идея как раз и реализована в данном приложении.



    РАСЧЕТ АМОРТИЗАЦИИ

  • УРОК 4. ТЕМА: РАСЧЕТ АМОРТИЗАЦИИ

  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 4

    Тема: Расчет амортизации



    Самостоятельное задание



    Разработать приложение, с помощью которого можно:

  • Либо вычислить значение заданной функции, скажем у(х) = Sin(x) / (1 + х2), при вводимом значении аргумента и вывести найденное значение в поле диалогового окна.

    Самостоятельное задание
    Рис. У4.5. Диалоговое окно Значение или график при выборе переключателя Значение

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

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

    Переключателя из группы Операция диалогового окна Значение или график.

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

    Самостоятельное задание
    Рис. У4.6. Диалоговое окно Значение или график при выборе переключателя График

    Теория



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

    Функция рабочего листа 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.



    Адресация ячеек

    Адресация ячеек

    При работе с объектом 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 текущего рабочего каталога.



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

    Методы объекта 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} или (BS)
  • — {BREAK}
  • — {CAPSLOCK}
  • или — {DELETE} или {DEL}
  • <вниз>— {DOWN}
  • — {END}
  • (цифровая клавиатура) — {ENTER}
  • — {ESCAPE}или {ESC}
  • — {HOME}
  • или — {INSERT}
  • <<-> — {LEFT}
  • — {NUMLOCK}
  • — {PGDN}
  • — {PGUP}
  • — {RETURN}
  • <->> — {RIGHT}
  • — {SCROLLLOCK}
  • - {TAB}
  • <вверх>- {UP}
  • ОТ до — ОТ {F1}до{F15}
  • Допустимо использование сочетания одновременно нажатых клавиш. С этой целью для перечисленных трех клавиш установлены следующие коды:

  • - +
  • ^
  • -%
  • В примере процедуре Амортизация назначена комбинация клавиш +<+>, а процедуре ПроцентнаяСтавка — ++<->.>:

    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



    Методы объекта Workbook и семейства Workbooks

    Методы объекта 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 : = " Порфирий Заковыркин"


    Методы объекта Worksheet и семейства Worksheet Evaluate

    Методы объекта Worksheet и семейства Worksheet
    Evaluate


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

    В следующем примере в поле ввода первого появившегося ) диалогового окна вводится ссылка на ячейку, например A1, процедура считывает значение из этой ячейки и отображает его в диалоговом окне. После этого в поле ввода следующего диалогового окна надо ввести какое-нибудь арифметическое выражение, например sin(l) ^2. Процедура вычислит значение этого выражения и отобразит в диалоговом окне:

    Sub Два Примера ДляEvaluate ( ) '

    ' Ввод адреса ячейки '

    Ячейка = InputBox ( "Введите имя ячейки") '

    ' Считывание значения из ячейки с указанным адресом '

    Значение = Evaluate (Ячейка) .Value '

    ' Вывод считанного значения в диалоговое окно

    '

    MsgBox CStr (Значение) '

    ' Ввод в диалоговое окно формулы, например, sin(1)^2 '

    Функция = InputBox ( "Введите функцию" ) '

    ' Вычисление значения по введенной формуле '

    Значение = Evaluate (Функция)

    ' Вывод найденного значения в диалоговом окне '

    MsgBox CStr (Значение) End Sub



    Объект Application

    Объект Application

    Объект Application (приложение) является главным в иерархии объектов Excel и представляет само приложение Excel. Он имеет более 120 свойств и 40 методов. Эти свойства и методы предназначены для установки общих параметров приложения Excel. Кроме того, объект Application позволяет вызывать более 400 встроенных функций рабочего листа при помощи конструкции вида:

    Application.ФункцияРабочегоЛиста(Аргументы)

    Например:

    Application . Pi ( )

    Вычисление числа п

    Application. Pmt (Аргументы)

    Определение постоянных периодических платежей при постоянной процентной ставке с помощью функции ППЛАТ (РМТ)

    Application . Sum (Аргументы)

    Нахождение суммы значений из ячеек диапазона

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



    Объект Workbook и семейство Workbooks



    В иерархии Excel объект workbook (рабочая книга) идет сразу после объекта Application и представляет файл рабочей книги. Рабочая книга хранится либо в файлах формата XLS (стандартная рабочая книга) или XLA (полностью откомпилированное приложение). Свойства и методы рабочей книги позволяют работать с файлами.

    Объект Worksheet и семейство Worksheets



    В иерархии Excel объект worksheet идет сразу после объекта workbook и представляет рабочий лист.

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

    Объекты Range и Selection



    В иерархии Excel объект Range (диапазон) идет сразу после объекта worksheet. Объект Range является одним из ключевых объектов VBA. Объект Selection (выбор) возникает в VBA двояко — либо как результат работы метода Select, либо при вызове свойства selection. Тип получаемого объекта зависит от типа выделенного объекта. Чаще всего объект Selection принадлежит классу Range и при работе с ним можно использовать свойства и методы объекта Range. Интересной особенностью объектов Range и selection является то, что они не являются элементами никакого семейства объектов.

    ОСНОВНЫЕ ОБЪЕКТЫ VBA

  • ГЛАВА 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
    Событие Когда возникает событие
    NewWorkbook При создании новой рабочей книги
    WorkbookActivate При активизации рабочей книги
    WorkbookBeforeClose Перед закрытием рабочей книги
    WorkbookBeforePrint Перед печатью рабочей книги
    WorkbookBeforeSave Перед сохранением рабочей книги
    WorkbookNewSheet При добавлении нового листа в рабочую книгу
    WorkbookOpen При открытии рабочей книги
    WorkbookDeactivate Когда активная книга теряет фокус
    Объект Workbook и семейство Workbooks


    В иерархии Excel объект workbook (рабочая книга) идет сразу после объекта Application и представляет файл рабочей книги. Рабочая книга хранится либо в файлах формата XLS (стандартная рабочая книга) или XLA (полностью откомпилированное приложение). Свойства и методы рабочей книги позволяют работать с файлами.



    События объекта Application


    Событие Когда возникает событие
    NewWorkbook При создании новой рабочей книги
    WorkbookActivate При активизации рабочей книги
    WorkbookBeforeClose Перед закрытием рабочей книги
    WorkbookBeforePrint Перед печатью рабочей книги
    WorkbookBeforeSave Перед сохранением рабочей книги
    WorkbookNewSheet При добавлении нового листа в рабочую книгу
    WorkbookOpen При открытии рабочей книги
    WorkbookDeactivate Когда активная книга теряет фокус



    События объекта Workbook и семейства Workbooks


    Событие Когда возникает событие
    BeforeClose При закрытии рабочей книги
    BeforePrint Перед печатью рабочей книги
    BeforeSave Перед сохранением рабочей книги
    Deactivate Когда рабочая книга теряет фокус
    NewSheet При добавлении нового листа
    Open При открытии рабочей книги
    SheetActivate При активизации любого рабочего листа
    Sheet Deactivate Когда рабочий лист теряет фокус



    События объекта Workbook и семейства

    События объекта Workbook и семейства Workbooks
    Событие Когда возникает событие
    BeforeClose При закрытии рабочей книги
    BeforePrint Перед печатью рабочей книги
    BeforeSave Перед сохранением рабочей книги
    Deactivate Когда рабочая книга теряет фокус
    NewSheet При добавлении нового листа
    Open При открытии рабочей книги
    SheetActivate При активизации любого рабочего листа
    Sheet Deactivate Когда рабочий лист теряет фокус
    Объект Worksheet и семейство Worksheets


    В иерархии Excel объект worksheet идет сразу после объекта workbook и представляет рабочий лист.

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



    События объекта Worksheet Событие

    События объекта 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 является то, что они не являются элементами никакого семейства объектов.



    События объекта Worksheet


    Событие Когда возникает событие
    BeforeClose При закрытии рабочей книги
    BeforePrint Перед печатью рабочей книги
    BeforeSave Перед сохранением рабочей книги
    Deactivate Когда рабочая книга теряет фокус
    NewSheet При добавлении нового листа
    Open При открытии рабочей книги
    SheetActivate При активизации любого рабочего листа
    Sheet Deactivate Когда рабочий лист теряет фокус


    Связь объекта Range и свойства Cells

    Связь объекта Range и свойства Cells

    Так как ячейка является частным случаем диапазона, состоящим только из единственной ячейки, объект Range также позволяет работать с ней. Объект cells (ячейки) — это альтернативный способ работы с ячейкой. Например, ячейка А2 как объект описывается Range ("A2") или cells (1,2). В свою очередь объект ceils, вкладываясь в Range, также позволяет записывать диапазон в альтернативном виде, который иногда удобен для работы, а именно,

    Range ("А2:C3") И Range(Cells(1,2), Cells(3,3))
    Определяют один и тот же диапазон.



    Свойства и методы объекта Range

    Свойства и методы объекта 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
    Свойства и методы объекта Range
    Рисунок 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. В отличие от обыкновенной формулы рабочего листа, формула диапазона вводится на рабочем листе не посредством нажатия на клавишу , а с помощью комбинации клавиш ++. Следующая инструкция вводит в диапазон Е!:ЕЗ формулу {=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)

    Свойства и методы объекта Range
    Рисунок 2.2. Диалоговое окно Специальная вставка

    AddComment

    Добавляет примечание к диапазону.

    Синтаксис:

    AddComment (Text)
  • Text — строковое выражение добавляемое в качестве примечания В следующем примере создается примечание внимание ! ячейки AI активного рабочего листа:
  • Range ( "А! " ) . AddComment "Внимание!"



    Свойства объекта 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

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

    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 — устанавливается максимальный размер окна



    Свойства объекта Workbook и семейства Workbooks

    Свойства объекта 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



    Свойства объекта Worksheet и семейства Worksheets

    Свойства объекта 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")


    Задание групп строк и столбцов с помощью объекта Range

    Задание групп строк и столбцов с помощью объекта Range

    Если в диапазоне указываются только имена столбцов или строк, то объект Range задает диапазон, состоящий из указанных столбцов или строк. Например, Range ("А: с") задает диапазон, состоящий из столбцов А, в и с, а Range {"2: 2") - из второй строки. Другим способом работы со строками и столбцами являются методы ROWS (строки) и Columns (столбцы), возвращающие коллекции строк и столбцов. Например, столбцом А является columns (1), а второй строкой - ROWS (2).



    Цель урока



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

  • Вводить формулы при помощи элемента управления RefEdit

  • Находить методом Goaiseek корни уравнения, зависящего от параметра

  • Устанавливать параметры метода Goaiseek

  • Создавать профессию на рабочем листе при помощи метода Dataseries

  • Программировать протаскивание маркера заполнения выделенного диапазона на рабочем листе при помощи метода AutoFill

  • Строить диаграммы



    ПХЯ У5 1 Диалоговое окно Нелинейное уравнение с параметром

    пХЯ. У5.1. Диалоговое окно Нелинейное уравнение с параметром

    ПХЯ У5 1 Диалоговое окно Нелинейное уравнение с параметром
    О решаемом уравнении предполагается, что оно преобразовано к виду, когда только левая часть зависит от неизвестной и параметра. Правая же часть -постоянна. При вводе левой части уравнения в поле ввода элемента управления RefEdit вместо переменной х надо давать ссылку на ячейку В2, а вместо параметра — А2. Кроме того, формула должна быть составлена по тем же правилам, по которым пишутся формулы рабочего листа. Например, для упомянутого выше уравнения в поле надо ввести:

    =В2^3-В2-А2

    либо эквивалентную формулу с абсолютными ссылками на ячейки.

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

    UserForm_Initialize

  • Активизирует диалоговое окно.
  • Назначает клавише функцию кнопки отмена, а клавише - вычислить.
  • Нажатие кнопки вычислить запускает на выполнение процедуру

    CommandButtonl_Click

  • При выполнении щелчка в соответствующей ячейке в поле элемента управления Re f Edit вводится абсолютная ссылка на эту ячейку. При выделении ячейки с формулой и протаскивании ее маркера заполнения вниз вдоль столбца для получения корректного результата нужна не абсолютная, а относительная ссылка. С этой целью из строки с формулой, присвоенной строковой переменной Формула, удаляются все знаки $, тем самым превращая все абсолютные ссылки в относительные.
  • Удаляются с рабочего листа ранее введенные данные и создаются заголовки полей отчета.
  • Устанавливаются предельное число итераций и относительная погрешность метода Goal Seek.
  • Методом DataSeries в диапазоне создается арифметическая профессия изменения значений параметра от начального до конечного значения с указанным шагом.
  • Вводится начальное приближение в диапазон.
  • Вводится в диапазон левая часть уравнения при различных значениях параметра.
  • Последовательно для каждой ячейки, имеющей формулу с левой частью уравнения, методом GoalSeek, находится корень уравнения.
  • Вызывается процедура ПостроениеГрафика для построения графика (Рисунок У5.2).
  • Нажатие кнопки отмена запускает на выполнение процедуру

    CommandButton2 _Click

    11 . Закрывает диалоговое окно.

    Процедура

    ПостроениеГрафика

    12. Строит график.



    ПХЯ У5 2 Отчет выводимый на рабочем листе программой решения уравнения с параметром

    пХЯ. У5.2. Отчет, выводимый на рабочем листе программой решения уравнения с параметром

    ПХЯ У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()
    '

    ' Процедура активизации диалогового окна

    ' Клавише назначена функция кнопки Вычислить.

    ' Клавише назначена функция кнопки Отмена.

    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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте диаграмму по следующему алгоритму:

  • Нажмите кнопку Мастер диаграмм (Chart Wizard) панели инструментов Стандартная (Standard).
  • В появившемся окне первого шага мастера диаграм_м на вкладке Стандартные (Standard Types) в списке Тип (Chart type) выберите График (Line), а в группе Вид (Chart sub-type) - четвертый элемент. Нажмите кнопку Далее > (Next >).
  • В появившемся окне второго шага мастера диаграмм на вкладке Диапазон данных (Data Range) выберите переключатель Ряды в столбцах (Series in Columns) и в поле Диапазон (Data range) введите ссылку на диапазон =лист1! $в$2:$в$12, отводимый под значения функции, график которой строится. В поле Подписи оси X (Category (X) axis labels) вкладки Ряд (Series) введите ссылку на диапазон =лист1 !$д$2:$д$12, отводимый под значения аргумента. Нажмите кнопку Далее > (Next >).
  • В появившемся окне третьего шага мастера диаграмм на вкладке Заголовки (Titles) в поле Название диаграммы (Chart title) введите зависимость корня от параметра, в поле Ось X (категорий) (Category (X) axis) - - Параметр, в поле Ось Y (значений) (Category (Y) axis) - корень. На вкладке Легенда (Legent) снимите флажок Добавить легенду (Show Legent). Нажмите кнопку Далее > (Next >).
  • В появившемся окне четвертого шага мастера диаграмм в группе Поместить диаграмму на листе (Place chart) выберите переключатель имеющемся (As object in). Нажмите кнопку Готово (Finish).
  • В построенной диаграмме ухватитесь за маркер изменения размера и увеличьте размер диаграммы. После этого, ухватившись за маркер переноса, переместите диаграмму в требуемое место на рабочем листе.
  • Перечисленные выше действия будут переведены 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.1).

    Практика
    Рис. У5.1. Диалоговое окно Нелинейное уравнение с параметром

    О решаемом уравнении предполагается, что оно преобразовано к виду, когда только левая часть зависит от неизвестной и параметра. Правая же часть -постоянна. При вводе левой части уравнения в поле ввода элемента управления RefEdit вместо переменной х надо давать ссылку на ячейку В2, а вместо параметра — А2. Кроме того, формула должна быть составлена по тем же правилам, по которым пишутся формулы рабочего листа. Например, для упомянутого выше уравнения в поле надо ввести:

    =В2^3-В2-А2

    либо эквивалентную формулу с абсолютными ссылками на ячейки.

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


    UserForm_Initialize


  • Активизирует диалоговое окно.

    Назначает клавише функцию кнопки отмена, а клавише - вычислить.

  • Нажатие кнопки вычислить запускает на выполнение процедуру

    CommandButtonl_Click


  • При выполнении щелчка в соответствующей ячейке в поле элемента управления Re f Edit вводится абсолютная ссылка на эту ячейку. При выделении ячейки с формулой и протаскивании ее маркера заполнения вниз вдоль столбца для получения корректного результата нужна не абсолютная, а относительная ссылка. С этой целью из строки с формулой, присвоенной строковой переменной Формула, удаляются все знаки $, тем самым превращая все абсолютные ссылки в относительные.
  • Удаляются с рабочего листа ранее введенные данные и создаются заголовки полей отчета.
  • Устанавливаются предельное число итераций и относительная погрешность метода Goal Seek.
  • Методом DataSeries в диапазоне создается арифметическая профессия изменения значений параметра от начального до конечного значения с указанным шагом.
  • Вводится начальное приближение в диапазон.
  • Вводится в диапазон левая часть уравнения при различных значениях параметра.
  • Последовательно для каждой ячейки, имеющей формулу с левой частью уравнения, методом GoalSeek, находится корень уравнения.
  • Вызывается процедура ПостроениеГрафика для построения графика (рис. У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()

    '

    ' Процедура активизации диалогового окна

    ' Клавише назначена функция кнопки Вычислить.

    ' Клавише назначена функция кнопки Отмена.

    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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте диаграмму по следующему алгоритму:

  • Нажмите кнопку Мастер диаграмм (Chart Wizard) панели инструментов Стандартная (Standard).

  • В появившемся окне первого шага мастера диаграм_м на вкладке Стандартные (Standard Types) в списке Тип (Chart type) выберите График (Line), а в группе Вид (Chart sub-type) - четвертый элемент. Нажмите кнопку Далее > (Next >).

  • В появившемся окне второго шага мастера диаграмм на вкладке Диапазон данных (Data Range) выберите переключатель Ряды в столбцах (Series in Columns) и в поле Диапазон (Data range) введите ссылку на диапазон =лист1! $в$2:$в$12, отводимый под значения функции, график которой строится. В поле Подписи оси X (Category (X) axis labels) вкладки Ряд (Series) введите ссылку на диапазон =лист1 !$д$2:$д$12, отводимый под значения аргумента. Нажмите кнопку Далее > (Next >).

  • В появившемся окне третьего шага мастера диаграмм на вкладке Заголовки (Titles) в поле Название диаграммы (Chart title) введите зависимость корня от параметра, в поле Ось X (категорий) (Category (X) axis) - - Параметр, в поле Ось Y (значений) (Category (Y) axis) - корень. На вкладке Легенда (Legent) снимите флажок Добавить легенду (Show Legent). Нажмите кнопку Далее > (Next >).

  • В появившемся окне четвертого шага мастера диаграмм в группе Поместить диаграмму на листе (Place chart) выберите переключатель имеющемся (As object in). Нажмите кнопку Готово (Finish).

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

    Перечисленные выше действия будут переведены 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. ТЕМА: РЕШЕНИЕ УРАВНЕНИЯ, ЗАВИСЯЩЕГО ОТ ПАРАМЕТРА. ПОСТРОЕНИЕ ДИАГРАММЫ

  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 5.

    Тема:Решение уравнения, зависящего от параметра.

    Построение диаграммы



    Самостоятельное задание

    Разработать приложение с диалоговым окном уравнение с двумя параметрами (рис. У5.3), которое позволит:

  • Находить при всех возможных комбинациях значений параметров а и b

  • х3 - ах2 + b = 0.

  • Cтроить график, показывающий зависимость корня от значений параметров а и b

    Самостоятельное задание
    Рис. У5.3. Диалоговое окно Уравнение с двумя параметрами

    Теория



    В этом разделе решается уравнение

    х3 - х - b = 0

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



    Цель урока



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

  • Управлять размерами диалогового окна

  • Задавать последовательности элементов управления в виде массива объектов

  • Определять текущий объем вклада

  • Задавать параметры счетчика

    Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно и при помощи метода drag-and-drop по поверхности диалогового окна.



    Перемещение элемента управления при помощи операции draganddrop

    Перемещение элемента управления при помощи операции drag-and-drop

    Перемещение элемента управления при помощи операции draganddrop
    Рассмотрим диалоговое окно новые похождения колобка (Рисунок У6.5), с которым связана ниже приведенная программа, дающая два простых примера программирования операций drag-and-drop.

    Практика



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

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

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

    Практика
    Рис. У6.1. Диалоговое окно Чистый текущий объем инвестиций

    Практика
    Рис. У6.2. Диалоговое окно
    Чистый текущий объем инвестиций со значением счетчика
    Число операций равным 4




    UserForm_Initialize

  • Активизирует диалоговое окно.
  • Назначает клавише функцию кнопки отмена, а клавише — вычислить.

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

  • Нажатие кнопки вычислить запускает на выполнение процедуры

    CoramandButtonl_Click


    Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции. 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

    ' Назначение клавише функции кнопки Вычислить

    '

    CommandButtonl.Default = True

    ' Назначение функции клавиши кнопке Отмена

    '

    CommandButton2.Cancel = True

    ' Установка максимального и минимального

    ' допустимого значений счетчика, а также текста всплывающей подсказки

    With SpinButton1

    .Max = 6

    .Min = 1

    .ControlTipText = "Ввод числа операций"

    End With

    End Sub

    Пример управления размером и перемещением элемента управления

    Пример управления размером и перемещением элемента управления

    Пример управления размером и перемещением элемента управления
    Рассмотрим простой пример диалогового окна похождения колобка (Рисунок У6.3), в котором при нажатии на кнопку катись! Колобок перемещается по поверхности формы, а при нажатии на кнопку Расти \ он начинает увеличиваться в размерах. На Рисунок У6.4 показан вид Колобка после нескольких нажатий на кнопки катись! и Расти!. Приведенная ниже программа позволяет реализовать описанные выше действия Колобка.

    Пример управления размером

    и перемещением элемента управления


    Рассмотрим простой пример диалогового окна похождения колобка (рис. У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

    Самостоятельное задание

    Разработать приложение с диалоговым окном сумма квадратов (рис. У6.6), которое позволит:

  • При помощи счетчиков управлять шириной и высотой диалогового окна.

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

    Самостоятельное задание
    Рис. У6.6. Диалоговое окно Сумма квадратов

    Теория



    В первый свой рабочий день в банке молодой программист Нестор Щукин получил задание от менеджера составить приложение, вычисляющее чистый текущий объем инвестиций от вкладов банка. Допустим, что с помощью этого приложения необходимо найти чистый текущий объем инвестиции 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 , которые соответствуют прибыли, входят в формулу со знаком плюс, а те, которые соответствуют дополнительным инвестициям - со знаком минус.

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



    УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

  • УРОК 6. ТЕМА: УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА
  • Пример управления размером и перемещением элемента управления

  • Перемещение элемента управления при помощи операции drag-and-drop

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

  • Урок 6

    Тема: Управление размером и перемещением элементов управления



    Цель урока



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

  • Последовательное заполнение плоской базы данных

  • Программирование примечаний

  • Программирование текстовых полей на рабочем листе

  • Использование переключателя и флажков

  • Создание пользовательского заголовка окна приложения

  • Как на рабочем листе программно закрепить область



    Практика



    Для заполнения базы данных на рабочем листе с помощью редактора пользовательских форм создадим диалоговое окно Регистрация туристов фирмы "Эх, прокачу!" (рис. У7.1).

    Практика
    Рис. У7.1. Диалоговое окно Регистрация туристов фирмы "Эх, прокачу!"

    Практика
    Рис. У7.2. База данных о туристах на рабочем листе

    Практика
    Рис. У7.3. Пояснительное текстовое поле, появляющееся при выборе переключателя О программе

    При инициализации диалогового окна программа проверяет, есть ли заголовки у полей создаваемой базы данных о регистрации туристов. Если этих заголовков нет, то программа автоматически создает их, снабжая примечаниями, имеющими пояснительный текст о содержании полей (рис. У7.2). Выбор переключателя о программе приведет к отображению на экране текстового поля с пояснениями к данной программе. Снятие этого флажка удаляет данное поле (рис. У7.3). Обратите внимание, что у окна приложения пользовательское имя Регистрация. База данных туристов.

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


    UserForm Initialize


  • Активизирует диалоговое окно.
  • Назначает клавише функцию кнопки Отмена, а Клавише - Вычислить.

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

  • Нажатие кнопки вычислить запускает на выполнение процедуру

    CommandButton1_Click


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

  • Нажатие кнопки Отмена запускает на выполнение процедуру

    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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте примечания по следующему алгоритму. Кроме того, для того чтобы разобраться, как программируется закрепление области на рабочем листе, в этот алгоритм входит также и закрепление первой строки рабочего листа.

  • Щелкните кнопку заголовка второй строки. Вторая строка выделится. Выберите команду Окно, Закрепить области (Window, Freeze Panes).

  • Выделите ячейку A1 и нажмите кнопку Надпись (Text box) панели инструментов Рисование (Drawing). В появившееся текстовое поле введите текст Фамилия клиента.

  • Выделите ячейку 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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте текстовое поле по алгоритму:

  • Нажмите кнопку Надпись (Text box) панели Рисование (Drawing) и создайте на рабочем листе текстовое поле.

  • Наберите в текстовом поле следующий текст:

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

  • Выделите текстовое поле и смените цвет его заливки на желтый, нажав кнопку Цвет заливки (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. Диалоговое окно Регистрация клиентов отеля "Хромая кобыла"

    ЗАПОЛНЕНИЕ БАЗЫ ДАННЫХ

  • УРОК 7. ТЕМА: ЗАПОЛНЕНИЕ БАЗЫ ДАННЫХ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 7.

    Тема: Заполнение базы данных



    Цель урока



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

  • Табулируются функции, зависящие от двух аргументов

  • Осуществляется программная проверка правильности ввода формулы в ячейку рабочего листа

  • Производится преобразование формулы с аргументами х и у в формулу рабочего листа

  • Выполняется программное построение поверхности

  • Записывается диаграмма в графический файл

  • Считывается графический файл в элемент управления image

  • Управлять углом зрения на поверхность

  • Управлять углом поворота поверхности вокруг оси z



    ПОСТРОЕНИЕ ПОВЕРХНОСТИ

  • УРОК 8. ТЕМА: ПОСТРОЕНИЕ ПОВЕРХНОСТИ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 8.

    Тема: Построение поверхности



    Практика



    В данном приложении строится поверхность по введенным в диалоговое окно построение поверхности (рис. У8.1) начальным, конечным значениям аргументов и их шагах изменения. Уравнение поверхности также вводится в программу из диалогового окна. Уравнение должно быть составлено в соответствии с правилами, по которым строятся функции рабочего листа, но в качестве аргументов в нем следует использовать х и у вместо ссылок на ячейки. Программа сама переведет эти аргументы в ссылки на ячейки. После табуляции введенной функции программой и построения поверхности на рабочем листе (рис. У8.2), эта поверхность также отображается в объекте управления image, расположенном в диалоговом окне построение поверхности (рис. У8.3). Управляя полосами прокрутки можно изменить ориентацию поверхности на рабочем листе.

    Практика
    Рис. У8.1. Диалоговое окно Построение поверхности

    Практика
    Рис. У8.2. Результат построения поверхности на рабочем листе

    Практика
    Рис. У8.3. Диалоговое окно Построение поверхности с рисунком построенной поверхности

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


    UserForm_Initialize


  • Активизирует диалоговое окно.
  • Назначает клавише функцию кнопки Отмена, а клавише — Построение.

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



  • Нажатие кнопки

    Построение запускает на выполнение

    процедуру

    CornmandButton1_Click

  • Проверяет, являются ли вводимые данные числами. В случае ошибки отображается соответствующее сообщение.
  • Проверяет согласованность вводимых данных. В случае ошибки отображается соответствующее сообщение (рис. У8.4).
  • Преобразует формулу, введенную в поле Уравнение поверхности, в формулу рабочего листа.
  • Проверяет корректность введенной формулы. В случае ошибки отображается соответствующее сообщение (рис. У8.5).
  • Используя метод DataSeriea, начиная с ячейки А2 строит вниз по столбцу арифметическую прогрессию, являющуюся результатом табуляции аргумента х уравнения поверхности с указанными шагами.
  • Используя метод Dataseries, начиная с ячейки в 1 строит вправо по строке арифметическую прогрессию, являющуюся результатом табуляции аргумента у уравнения поверхности с указанными шагами.
  • Заносит в ячейку В2 уравнение поверхности, введенное пользователем в диалоговом окне. Для корректности последующего табулирования значений функций важно в уравнении указать абсолютные ссылки на столбец А и строку в. Это обеспечивается вводом в уравнении поверхности вместо аргумента х ссылки $А2, а вместо аргумента у — ссылки в$1.
  • Для табуляции функции протаскивается маркер заполнения ячейки В2, используя метод AutoFill и формулу поверхности, позволяющих распространить табуляцию на весь диапазон, где табулируется функция.
  • Строит поверхности при помощи методаChartWizard.

    Изменяет ориентацию надписи оси 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), которое должно решать следующие задачи:

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

  • Самостоятельное задание
    Рис. У8.6. Диалоговое окно Объемный график

    Самостоятельное задание
    Рис. У8.7. Диапазон с данными и результат построения объемного графика на рабочем листе

  • Программа должна определить число строк диапазона, а также минимальное (1) и максимальное (число строк диапазона) значение счетчика.

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

  • При нажатии кнопки ок должен строиться объемный график с выбранной осью абсцисс (рис. У8.7) на рабочем листе и, кроме того, отображаться в объекте image диалогового окна.

  • С помощью полос прокрутки обеспечить управление ориентацией графика в пространстве.

    Цель урока



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

  • Конструируя данное приложение, вы на практике освоите, как:

  • Производить расчет периодических выплат

  • Использовать финансовую функцию ППЛАТ ( РМТ )

  • Выводить результаты табулирования функции в элемент управления ListBox (СПИСОК)

  • Строить диаграмму, тип которой выбирается в группе переключателей

  • Отображать графический файл в элементе управления image (рисунок)

  • Осуществлять проверку наличия файла на диске



    ПЕРИОДИЧЕСКИЕ ВЫПЛАТЫ

  • УРОК 9. ТЕМА: ПЕРИОДИЧЕСКИЕ ВЫПЛАТЫ.
    ПОСТРОЕНИЕ ДИАГРАММ

  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 9.

    Тема: Периодические выплаты. Построение диаграмм



    Практика



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

    Практика
    Рис. У9.1. Диалоговое окно Периодических выплат

    Кроме того, приложение строит диаграмму, показывающую зависимость величины выплат от процентной ставки. Тип диаграммы можно задать, выбирая переключатель из группы диаграмма диалогового окна Периодических выплат (рис. У9.1). Результат табуляции зависимости размера выплат от процентной ставки выводится в элемент управления ListBox диалогового окна и на рабочий лист (рис. У9.2).

    Практика
    Рис. У9.2. Отчет, создаваемый приложением на рабочем листе

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


    UserForm Initialize


  • Активизирует диалоговое окно.
  • Назначает клавише функцию кнопки Отмена, а клавише — вычислить, а также задает тексты всплывающих подсказок для этих кнопок и кнопки Очистка.
    Устанавливает изначально переключатель гистограмма. Проверяет наличие на диске файла, отображаемого в элементе управления image при данном выборе переключателя. Если такого файла нет, то информирует об этом пользователя, но тем не менее программа продолжает свою работу без загрузки отсутствующего файла. Если файл есть, изображение, содержащееся в этом файле, выводится в элементе управления image.

  • Нажатие кнопки Вычислить запускает на выполнение процедуру

    CommandButtonl_Click


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

  • Определяет число точек, в которых будут табулироваться процентные ставки.
  • Последовательно находит размеры выплат для очередной процентной ставки, меняющейся от начального значения до конечного с указанным шагом. Результаты вычислений выводит на рабочем листе и в двумерный массив ЭлементыСписка, число строк которого равно числу процентных ставок. В первый его столбец выводятся процентные ставки, а во второй -величины соответствующих выплат.
  • На основе массива ЭлементыСписка заполняется список, предварительно очищенный от ранее введенных в него элементов.
    В соответствии с установленным переключателем из группы диаграмма при помощи процедуры график строится выбранная диаграмма.
  • <
    Практика

    Рис. У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

    ' Назначение клавише функции кнопки Вычислить

    '

    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

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

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

  • Выбрать команду Вставка, Диаграмма (Insert, Chart).

  • В появившемся диалоговом окне первого шага мастера диаграмм при помощи списков Тип (Chart type) и Вид (Chart sub-type) отобразить требуемый рисунок диаграммы.

  • Нажать клавишу , тем самым копируя содержимое экрана в буфер обмена.

  • Вызвать какой-нибудь графический редактор. Лучше всего тот, к которому вы привыкли и имеете опыт работы с ним. Если у вас нет никаких особых привязаностей к конкретному графическому редактору, вызовите, например, редактор Paint, который входит в стандартный комплект программ, поставляемых с Windows. Он, конечно, слабоват и обладает не ахти какими возможностями, но их с лихвой хватает для решаемой нами задачи. Для вызова редактора Paint выберите в Windows команду Пуск, Программы, Стандартные, Графический редактор Paint (Start, Programs, Accessories, Paint).

  • Появится окно редактора Paint. Нажмите комбинацию клавиш +, что приведет к вставке в редактор Paint графического образа экрана, скопированного ранее в буфер обмена.

  • Нас интересует картинка не всего экрана, а только часть, где изображен выбранный нами тип диаграммы. Этот тип надо выделить - нажмите кнопку Выделение (Selection), а потом при нажатой правой кнопке мыши выделите требуемый фрагмент.

  • Нажмите комбинацию клавиш +. Выделенный фрагмент будет записан в буфер обмена.

  • Выберите команду Файл, Создать (File, New). Так как, скорее всего, графическая копия всего экрана нам больше не потребуется, в появившемся диалоговом окне редактора Paint с информационном сообщением о том, надо ли сохранять файл, нажмите кнопку Нет (No).

  • Появится пустое окно редактора Paint. Нажмите комбинацию клавиш +, что приведет к вставке в редактор Paint графического образа вырезанного фрагмента экрана, скопированного ранее в буфер обмена.

  • Используя команду Рисунок, Атрибуты (Image, Attributes) или маркеры изменения размера рисунка, можно подобрать размеры рисунка так, чтобы они совпадали со вставленным в редактор фрагментом экрана.

  • Выберите команду Файл, Сохранить как (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, которое устанавливает ширину каждой колонки списка. По результату табуляции программа должна построить диаграмму, выбранную из группы Диаграмма.

    Теория



    Функция ППЛАТ (РМТ) вычисляет величину постоянной периодической выплаты ренты (например, регулярных платежей по займу) при постоянной процентной ставке.

    Синтаксис:

    ППЛАТ(ставка; кпер; нз; бз; тип)

    Аргументы:


    ставка

    Процентная ставка за период

    кпер

    Общее число периодов выплат

    нз

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

    бз

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

    тип

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




    Цель урока



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

    В процессе разработки данного приложения вы на практике освоите:

  • Конструирование пользовательского интерфейса

  • Создание приложения, работающего с несколькими диалоговыми окнами

  • Поиск информации в базе данных на рабочем листе

  • Редактирование записей в базе данных на рабочем листе

  • Удаление ненужных записей из базы данных на рабочем листе

  • Архивацию данных на рабочем листе

  • Программирование фильтрации данных

  • Программирование сортировки данных

  • Программирование создания сводных таблиц

  • Построение диаграмм по сводным таблицам

  • Добавление пользователем новых элементов в поле со списком во время выполнения программы



    ЕЩЕ РАЗ О СОСТАВЛЕНИИ БАЗЫ ДАННЫХ

  • УРОК 10. ТЕМА: ЕЩЕ РАЗ О СОСТАВЛЕНИИ БАЗЫ ДАННЫХ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 10.

    Тема: Еще раз о составлении базы данных



    ПХЯ У 10 3 Диалоговое окно Регистрация туристов фирмы "С нами не соскучишься"

    пХЯ. У 10.3. Диалоговое окно Регистрация туристов фирмы "С нами не соскучишься"


    ПХЯ У 10 3 Диалоговое окно Регистрация туристов фирмы



    ПХЯ У10 1 Рабочий лист БазаДанных

    пХЯ. У10.1. Рабочий лист БазаДанных


    ПХЯ У10 1 Рабочий лист БазаДанных



    ПХЯ У10 10 Автоматическое расширение элементов раскрывающегося списка

    пХЯ. У10.10. Автоматическое расширение элементов раскрывающегося списка

    ПХЯ У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

    ПХЯ У10 2 Рабочий лист Архив

    пХЯ. У10.2. Рабочий лист Архив

    ПХЯ У10 2 Рабочий лист Архив
    После загрузки программа сама будет создавать свой интерфейс, отображать название окна приложения и если на рабочих листах нет заголовков полей, то создавать их. Интерфейс программы будет состоять из нескольких диалоговых окон.

    Диалоговое окно

    Назначение

    Форма

    Регистрация туристов фирмы "С нами не соскучишься" (Рисунок У10.3)

    Для заполнения рабочего листа БазаДан-ных

    UserForm1

    Поиск (Рисунок У10.4)

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

    UserForm3

    Перерегистрация туристов фирмы "С нами не соскучишься" (Рисунок У1 0.5)

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

    UserForm2

    Фильтрация (Рисунок У10.6)

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

    UserForm4



    ПХЯ У10 4 Диалоговое окно Поиск

    пХЯ. У10.4. Диалоговое окно Поиск


    ПХЯ У10 4 Диалоговое окно Поиск



    ПХЯ У10 5 Диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься"

    пХЯ. У10.5. Диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься"


    ПХЯ У10 5 Диалоговое окно Перерегистрация туристов фирмы



    ПХЯ У10 6 Диалоговое окно Фильтрация

    пХЯ. У10.6. Диалоговое окно Фильтрация

    ПХЯ У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.Сводная

    ПХЯ У10 7 Рабочий лист СводнаярЮАКХЖЮ

    пХЯ. У10.7. Рабочий лист Сводная



    ПХЯ У10 8 Сообщение о неудачном поиске клиента

    пХЯ. У10.8. Сообщение о неудачном поиске клиента

    ПХЯ У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 9 Диалоговое окно Все чего душа пожелает Прием товара
    Единицу измерения товара следует вводить при помощи раскрывающегося списка. Первоначально, в списке задать две единицы измерения: кг и штук. При появлении товара с новой единицей измерения, например литр, первый раз эта единица измерения вводится в раскрывающийся список вручную, после чего программа должна автоматически расширить список используемых единиц измерения, добавив в него введенную величину.

    Практика



    В этом уроке строится приложение с пользовательским интерфейсом по заполнению и обработке базы данных туристической фирмы "С нами не соскучишься". База данных состоит из двух рабочих листов: БазаДанных (рис. У 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



    РЮАКХЖЮ = ActiveSheet PivotTables("Отчет")

    рЮАКХЖЮ = 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:="Сводная

    РЮАКХЖЮ As PivotTable

    рЮАКХЖЮ As PivotTable

    Dim Диапазон As Range

    Set Сводная

    РЮАКХЖЮ 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 Сводная

    РЮАКХЖЮ!R1C1" '

    рЮАКХЖЮ!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 Сводная

    РЮАКХЖЮ" Then Sheets("СводнаяТаблица") Delete

    рЮАКХЖЮ" Then Sheets("СводнаяТаблица").Delete

    End If
    Next Лист

    ' Создается новый рабочий лист с именем Сводная

    РЮАКХЖЮ

    рЮАКХЖЮ.


    РЮАКХЖЮ"

    рЮАКХЖЮ"

    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,
    возвращающее диапазон с данными сводной таблицы, что позволяет избежать необходимости явного описания диапазона, по которому строится диаграмма.
  • Процедура сохранитьКак активизирует встроенное диалоговое окно Сохранение документа.
  • Процедура закрыть закрывает приложение.


  • РЮАКХЖЮ '

    рЮАКХЖЮ '


    Worksheets.Add

    ActiveSheet.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, которая закрывает диалоговое окно Поиск.



  • РЮАКХЖЮ"

    рЮАКХЖЮ"

    n = Worksheets("БазаДанных").Range("A2")
    .CurrentRegion.Rows.Count
    '

    '

    ' Определение диапазона, по которому будет строиться

    ' сводная таблица (Списки) и
    где она будет расположена (Назначение).

    ' Эти диапазоны записываются в виде строковых выражений

    Списки = "БазаДанных!R1C1:R" & CStr(n) & "С8"

    Назначение = "[" & ИмяКниги & "]Сводная

    РЮАКХЖЮ () '

    рЮАКХЖЮ () '


    ' Процедура построения сводной таблицы

    '

    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(ИмяКниги)

    ' Удаляются ранее созданные рабочие листы с именем .Сводная

    Самостоятельное задание



    Построить приложение, учитывающее движение товара на складе магазина "Все, чего душа пожелает". В диалоговом окне приема товара на склад (рис. У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

    Цель урока



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

    Конструируя данное приложение, вы на практике освоите следующие операции:

  • Удаление рисунка из элемента управления

  • Выполнение учета количества щелчков по элементу управления

  • Управление видимостью границ элемента управления

  • Создание игрового поля



    ИГРА В КРЕСТИКИ И НОЛИКИ

  • УРОК 11. ТЕМА: ИГРА В КРЕСТИКИ И НОЛИКИ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 11.

    Тема: Игра в крестики и нолики



    Практика



    В редакторе форм создадим диалоговое окно крестики нолики

    (рис. У11.1). Поле игры будут образовывать девять элементов управления Caption (надпись). Для видимости границ элементов управления Caption установите свойство BorderStyle равным fmBorderStyleSingle.

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

    Практика
    Рис. У11.1. Диалоговое окно Крестики — нолики в редакторе форм

    Итак, в нашей игре первый ход за пользователем. Ход осуществляется двойным щелчком по игровому полю. Если игровое поле пусто, то в нем отображается крестик. Компьютер мгновенно отвечает на ход игрока, постановкой нолика в другое игровое поле и т. д. О результате игры компьютер информирует пользователя. При желании сыграть еще одну игру с компьютером, нажмите кнопку переиграть, которая очистит игровые поля. На рис. У11.2 приведен вид партии в крестики—нолики после второго шага игры.

    Практика
    Рис. У11.2. Пример партии игры в крестики—нолики после второго шага игры

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

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

    Стратегия компьютера в игре крестики—нолики очень проста:

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

  • Если игрок на очередном ходе угрожает поставить подряд три крестика, а у компьютера есть возможность помешать этому, поставив нолик, он это делает.

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

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

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



    UserForm Initialize



  • Активизирует диалоговое окно.

    Очищает все надписи от рисунков и текста, обнуляет все переменные.



  • Нажатие кнопки Переиграть запускает на выполнение процедуру

    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 1 Диалоговое окно Крестики — нолики в редакторе форм

    Рисунок У11.1. Диалоговое окно Крестики — нолики в редакторе форм

    У11 1 Диалоговое окно Крестики — нолики в редакторе форм
    Итак, в нашей игре первый ход за пользователем. Ход осуществляется двойным щелчком по игровому полю. Если игровое поле пусто, то в нем отображается крестик. Компьютер мгновенно отвечает на ход игрока, постановкой нолика в другое игровое поле и т. д. О результате игры компьютер информирует пользователя. При желании сыграть еще одну игру с компьютером, нажмите кнопку переиграть, которая очистит игровые поля. На Рисунок У11.2 приведен вид партии в крестики—нолики после второго шага игры.

    У11 2 Пример партии игры в крестики—нолики после второго шага игры

    Рисунок У11.2. Пример партии игры в крестики—нолики после второго шага игры

    У11 2 Пример партии игры в крестики—нолики после второго шага игры
    Крестик и нолик, которые выводятся на игровом поле, содержатся в файлах cross.bmp и ou.bmp, а их образы можно создать при помощи любого графического редактора.
    В связи с небольшим числом возможных стратегий в этой игре, составляя программу можно пойти по пути наименьшего сопротивления: а именно, применить подход простого перебора вариантов возможных действий. Если бы в игре было большое число стратегий, то этот подход был бы неприменим, т. к. программа не смогла бы играть в режиме реального времени.

    Стратегия компьютера в игре крестики—нолики очень проста:

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

    UserForm Initialize

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

    CommandButtonl_Click

    Очищает все надписи от рисунков и текста, обнуляет все переменные.

    Нажатие кнопки выход запускает на

    выполнение процедуру

    CoramandButton2_Click

    Закрывает диалоговое окно.

    От процедуры

    Labell_DblClick

    до

    Label9 DblClick

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

    Strategy 1

    и

    Strategy

    Генерируют первый и последующие ходы соответственно.

    Проверка

    Проверяет, нет ли в игре победителей.

    НачальноеСостояние

    Очищает все надписи от рисунков и текста, обнуляет все переменные.

    Состояние

    В массиве Статус отмечаются расставленные в ячейках игрового — 10, а пусто — 0. Процедура Состояние находит суммы элементов массива на диагоналях, в строках и столбцах.

    Диагональ!

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

    Диагональ 2

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

    Бок, Верх

    Определяет в зависимости от Состояние, надо ли компьютеру ходить и, если надо, то в какую ячейку.



    У11 3 Пример сообщения о результате игры

    Рисунок У11.3. Пример сообщения о результате игры

    У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. Диалоговое окно Крестики — Нолики


    У11 4 Диалоговое окно Крестики — Нолики



    Самостоятельное задание



    Разработать программу игры крестики—нолики, в которой в зависимости от установок параметров игры первый ход может делать либо компьютер, либр игрок (рис. У11.4). Игрок также может выбрать, что он ставит в игровые поля: крестики или нолики. Программа ведет учет числа побед как игрока, так и компьютера. Программа также подсчитывает число ничейных партий.

    Самостоятельное задание
    Рис. У11.4. Диалоговое окно Крестики — Нолики

    Цель урока



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

    Конструируя данное приложение, вы освоите на практике:

  • Построение многостраничных диалоговых окон

  • Построение линии тренда

  • Применение метода offset для вывода данных на рабочем листе

  • Считывание данных из каждой конкретной ячейки диапазона



    ЛИНИЯ ТРЕНДА

  • УРОК 12. ТЕМА: ЛИНИЯ ТРЕНДА

  • ЦЕЛЬ УРОКА

  • ТЕОРИЯ

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 12.

    Тема: Линия тренда



    Практика

    В редакторе форм создадим диалоговое окно линейная регрессия (рис. У12.1). Это окно состоит из двух вкладок тренд и параметры (рис. У12.2).

    Практика
    Рис. У12.1. Вкладка Тренд диалогового окна Линейная регрессия

    Практика
    Рис. У12.2. Вкладка Параметры диалогового окна Линейная регрессия

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



    UserForm Initialize


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

  • Нажатие кнопки ок запускает на выполнение процедуру

    CommandButtonl Click

    При выборе переключателя с повторениями производит расчет по процедуре трендсповто-рениями (вторая задача), а при выборе переключателя Без повторений - по процедуре Обыч-ныйтренд (первая задача).

    Нажатие кнопки выход запускает на выполнение процедуру

    CommandButton2 Click

    Закрывает диалоговое окно.

    OptionButton1_Click

    и

    OptionButton2_Click

    Обеспечивает скрытие и отображение в диалоговом окне надписи повторения и соответствующего поля.

    ОбычныйТренд


  • В поля Независимая величина (в данном Случае Температура) и Зависимая величина (объем продаж) вводит ссылки на диапазоны, по которым строится линия тренда. Исходя из рис. У 12.3 В Поле Независимая величина вводится ссылка на диапазон А2:А7, а в поле Зависимая величина — В2 : В7 .
  • Проверяет, располагаются ли данные только в столбцах, либо только в строках. Также проверяет, располагаются ли данные в столбцах с или D (эти два столбца зарезервированы программой для вывода результатов расчета). Если располагаются, то отображается соответствующее сообщение.

  • На рабочий лист вводятся функции рабочего листа НАКЛОН, ОТРЕЗОК и КОРРЕЛ, по которым вычисляются параметры линии тренда и коэффициент корреляции.

  • При помощи процедуры диаграмма строится диаграмма и линия тренда.




  • Практика
    Рис. У 12.3. Результат решения первой задачи


    ТрендСПовторениями В поля Независимая величина (в данном случае температура) и зависимая величина (объем продаж) вводит ссылки на диапазоны, по которым строится линия тренда. Исходя из рис. У 12. 4 в поле Независимая величина вводится ссылка на диапазон А2:А9, в поле Зависимая величина — В1:Н1, 3 в поле Повторения — В2:Н9
    В остальном процедура действует аналогично процедуре обычныйТренд за исключением того, что перед вычислением параметров уравнения тренда она:
  • Находит число повторений каждой наблюдаемой величины, общее число всех наблюдений и выводит эти результаты в диапазоны, сопряженные с диапазоном, введенным в поле повторения .
    Преобразует наблюдения в таблицу из двух столбцов с учетом повторения наблюдений.

  • Диаграмма

    Строит диаграмму и линию тренда по диапазону, заданному в аргументе диапазон.

    <
    Практика

    Рис. У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



    Результат решения первой задачи

    Рисунок У 12.3. Результат решения первой задачи

    Результат решения первой задачи
    ТрендСПовторениями
    В поля Независимая величина (в данном случае температура) и зависимая величина (объем продаж) вводит ссылки на диапазоны, по которым строится линия тренда. Исходя из Рисунок У 12. 4 в поле Независимая величина вводится ссылка на диапазон А2:А9, в поле Зависимая величина — В1:Н1, 3 в поле Повторения — В2:Н9
    В остальном процедура действует аналогично процедуре обычныйТренд за исключением того, что перед вычислением параметров уравнения тренда она:
  • Находит число повторений каждой наблюдаемой величины, общее число всех наблюдений и выводит эти результаты в диапазоны, сопряженные с диапазоном, введенным в поле повторения .
  • Преобразует наблюдения в таблицу из двух столбцов с учетом повторения наблюдений.
  • Диаграмма

    Строит диаграмму и линию тренда по диапазону, заданному в аргументе диапазон.



    У12 1 Вкладка Тренд диалогового окна Линейная регрессия

    Рисунок У12.1. Вкладка Тренд диалогового окна Линейная регрессия


    У12 1 Вкладка Тренд диалогового окна Линейная регрессия



    У12 2 Вкладка Параметры диалогового окна Линейная регрессия

    Рисунок У12.2. Вкладка Параметры диалогового окна Линейная регрессия

    У12 2 Вкладка Параметры диалогового окна Линейная регрессия
    Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.
    UserForm Initialize

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

    CommandButtonl Click

    При выборе переключателя с повторениями производит расчет по процедуре трендсповто-рениями (вторая задача), а при выборе переключателя Без повторений - по процедуре Обыч-ныйтренд (первая задача).

    Нажатие кнопки выход запускает на выполнение процедуру

    CommandButton2 Click

    Закрывает диалоговое окно.

    OptionButton1_Click

    и

    OptionButton2_Click

    Обеспечивает скрытие и отображение в диалоговом окне надписи повторения и соответствующего поля.

    ОбычныйТренд

  • В поля Независимая величина (в данном Случае Температура) и Зависимая величина (объем продаж) вводит ссылки на диапазоны, по которым строится линия тренда. Исходя из Рисунок У 12.3 В Поле Независимая величина вводится ссылка на диапазон А2:А7, а в поле Зависимая величина — В2 : В7 .
  • Проверяет, располагаются ли данные только в столбцах, либо только в строках. Также проверяет, располагаются ли данные в столбцах с или D (эти два столбца зарезервированы программой для вывода результатов расчета). Если располагаются, то отображается соответствующее сообщение.
  • На рабочий лист вводятся функции рабочего листа НАКЛОН, ОТРЕЗОК и КОРРЕЛ, по которым вычисляются параметры линии тренда и коэффициент корреляции.
  • При помощи процедуры диаграмма строится диаграмма и линия тренда.






  • У12 4 Результат решения второй задачи

    Рисунок У12.4. Результат решения второй задачи

    У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



    Самостоятельное задание

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

    Температура и объемы продажи

    Таблица 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
    Отличием второй задачи от первой является то, что таблица данных состоит не из двух строк, в которые введены значения зависимой и независимой переменных, что, как вы уже знаете, в первой задаче позволило найти решение как графически, так и при помощи функций рабочего листа НАКЛОН, ОТРЕЗОК и КОРРЕЛ, Теодор решил, что это несущественное различие. Достаточно только написать программу, которая преобразует вторую таблицу к виду первой таблицы, а по полученной таблице программа сможет найти и уравнение тренда, и коэффициент корреляции, как и в первом случае.




    Теория



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

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

    На основе своих наблюдений Сосулькин заметил, что объем продажи мороженого зависит, кроме прочих факторов, от температуры на улице. Объемы продаж эскимо "За ухо не оторвешь" за первые шесть дней торговли приведены в табл. 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
    Отличием второй задачи от первой является то, что таблица данных состоит не из двух строк, в которые введены значения зависимой и независимой переменных, что, как вы уже знаете, в первой задаче позволило найти решение как графически, так и при помощи функций рабочего листа НАКЛОН, ОТРЕЗОК и КОРРЕЛ, Теодор решил, что это несущественное различие. Достаточно только написать программу, которая преобразует вторую таблицу к виду первой таблицы, а по полученной таблице программа сможет найти и уравнение тренда, и коэффициент корреляции, как и в первом случае.

    Цель урока



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

    Конструируя данное приложение, вы узнаете на практике, что такое:

  • Передача информации между элементами управления при обработке события Click

  • Управление видимостью рисунков

  • Управление цветом элементов управления



    Практика



    Трус, Балбес и Бывалый построили небольшой магазинчик "Придорожный лопух, 24 часа" у деревне Неелово на трассе Москва—Санкт-Петербург. Работу в магазинчике они разбили на две смены по 12 часов. В начале очередной недели они вместе составляют график своего дежурства на неделю, в котором подсчитывается число рабочих смен каждого компаньона. Через месяц они решили автоматизировать процесс создания расписания. С этой целью они разработали приложение, процесс создания которого обсуждается ниже.

    В редакторе форм создадим диалоговое окно магазин придорожный лопух, 24 часа (рис. У13.1).

    Кроме этого, в любом графическом редакторе, например Paint, создадим файл ball.bmp с изображением красного шара и фоном рисунка того же цвета, что и цвет диалогового окна.

    Расписание составляется очень просто:

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

    Практика
    Рис. У13.1. Диалоговое окно Магазин Придорожный лопух, 24 часа

  • Для более наглядного представления надписи, соответствующие сменам с О до 12 часов, имеют белый цвет фона, а надписи, соответствующие сменам с 12 до 24 часов, — желтый цвет фона.

    Практика
    Рис. У13.2. Заполнение диалогового окна

    Магазин Придорожный лопух, 24 часа

  • Ввод имени дежурного в смену производится перемещением указателя на надпись соответствующей смены и щелчком кнопкой мыши. Программа автоматически вставляет имя дежурного в надпись смены (рис. У13.2).

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

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

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


    UserForm Initialize


  • Активизирует диалоговое окно.
  • Очищает все надписи и задает свойства элементов управления Image .

    Устанавливает тип границы и цвет фона надписей.

  • Нажатие кнопки ок запускает на выполнение процедуру

    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



    У13 1 Диалоговое окно Магазин Придорожный лопух 24 часа

    Рисунок У13.1. Диалоговое окно Магазин Придорожный лопух, 24 часа


    У13 1 Диалоговое окно Магазин Придорожный лопух 24 часа
  • Для более наглядного представления надписи, соответствующие сменам с О до 12 часов, имеют белый цвет фона, а надписи, соответствующие сменам с 12 до 24 часов, — желтый цвет фона.




  • У13 2 Заполнение диалогового окна

    Рисунок У13.2. Заполнение диалогового окна

    У13 2 Заполнение диалогового окна
    Магазин Придорожный лопух, 24 часа
  • Ввод имени дежурного в смену производится перемещением указателя на надпись соответствующей смены и щелчком кнопкой мыши. Программа автоматически вставляет имя дежурного в надпись смены (Рисунок У13.2).
  • Удалить имя дежурного из смены можно, указав на пустую надпись в группе компаньон и выполнив щелчок, а затем переместив указатель на надпись смены, из которой требуется удалить имя дежурного, и также щелкнув кнопкой мыши.
  • Подсчет числа рабочих смен каждого из компаньонов производится нажатием на кнопку ок.
  • Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.

    UserForm Initialize

  • Активизирует диалоговое окно.
  • Очищает все надписи и задает свойства элементов управления Image .
  • Устанавливает тип границы и цвет фона надписей.
  • Нажатие кнопки ок запускает на выполнение процедуру

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

    СОСТАВЛЕНИЕ РАСПИСАНИЯ

  • УРОК 13. ТЕМА: СОСТАВЛЕНИЕ РАСПИСАНИЯ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА

  • САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ


  • Урок 13.

    Тема: Составление расписания



    Цель урока



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

    Конструируя данное приложение, вы на практике узнаете, как осуществить:

  • Считывание файла последовательного доступа в поле

  • Запись в файл последовательного доступа

  • Считывание и запись в файл прямого доступа

  • Работу с пользовательскими типами данных

  • Создание простейшего текстового редактора

  • Создание заставки приложения



    Файл последовательного доступа

    Файл последовательного доступа

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

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

    Итак, в редакторе форм создадим диалоговое окно Файл последовательного доступа (Рисунок У 14.1).

    Файл произвольного доступа

    Файл произвольного доступа

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

    Практика

    Практика



    РАБОТА С ФАЙЛАМИ

  • УРОК 14. ТЕМА: РАБОТА С ФАЙЛАМИ

  • ЦЕЛЬ УРОКА

  • ПРАКТИКА
  • Файл последовательного доступа

  • Файл произвольного доступа

  • Создание заставки приложения

  • Урок 14.

    Тема: Работа с файлами



    Создание заставки приложения

    Создание заставки приложения

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

    Создание заставки приложения
    Рисунок У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

    Метод AdvancedFilter

    Метод AdvancedFilter

    Метод 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— Лондон.



    Метод AutoFill

    Метод AutoFill

    Метод 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).



    Метод AutoFilter

    Метод AutoFilter

    Метод 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") .



    Метод Consolidate

    Метод Consolidate

    Метод 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) позволяет установить связь между исходными данными и итоговым диапазоном так, что результаты будут обновляться при изменении данных. В данном случае сбросим этот флажок.


  • Метод DataSeries

    Метод 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).



    Метод Find

    Метод Find

    Метод 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).

    Метод GoalSeek

    Метод GoalSeek

    Метод 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") .


  • Метод Sort Сортировка позволяет

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

    Синтаксис:

    Объект.Sort(keyl, orderl, key2, order2, key3, order3, header, orderCus-tom,
    matchCase, orientation)

    Аргументы:
    Объект

    Метод Sort Сортировка позволяет

    Диапазон, который будет сортироваться

    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") .



    Метод 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") .

    Метод Sort

    Рис. 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).

    Метод Sort

    Рис. 3.18. Диалоговое окно Сортировка диапазона

    Метод Sort

    Рис. 3.19. Результат сортировки



    Метод Subtotal

    Метод Subtotal

    Метод 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).

    Метод Subtotal
    Рисунок 3.20. Отчет о продажах компьютеров

    Шаг 1

    Выделим ячейки списка, в данном случае диапазон A1:C16. Выберем команду Данные, Промежуточные итоги (Data, Subtotal). На экране отобразится диалоговое окно Промежуточные итоги (Subtotal) (Рисунок 3.21).

    Метод Subtotal
    Рисунок 3.21. Диалоговое окно Промежуточные итоги

    Метод Subtotal
    Рисунок 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 устанавливает отображаемый уровень детализации.

    Метод Subtotal
    Рисунок 3.23. Результат добавлению показателя средней реализации компьютеров по месяцам к уже существующим промежуточным итогам на рабочем листе

    Шаг7

    Для удаления промежуточных итогов следует выделить данные с этими итогами, выполнив команду Данные, Промежуточные итоги (Data, Subtotal) и нажать кнопку Убрать все (Remove All) в появившемся диалоговом окне Промежуточные итоги (Subtotal). На VBA тот же результат в данном примере достигается применением следующих инструкций

    Range ("A1:C24") .Select Selection . RemoveSubtotal

    Метод Subtotal
    Рисунок 3.24. Вывод промежуточных итогов без детализации

    МЕТОДЫ ОБЪЕКТА RANGE, ИСПОЛЬЗУЮЩИЕ КОМАНДЫ EXCEL

  • ГЛАВА 3. МЕТОДЫ ОБЪЕКТА RANGE, ИСПОЛЬЗУЮЩИЕ КОМАНДЫ EXCEL

  • МЕТОД DATASERIES

  • МЕТОД AUTOFILL

  • МЕТОД AUTOFILTER

  • МЕТОД ADVANCEDFILTER

  • МЕТОД CONSOLIDATE

  • МЕТОД FIND

  • МЕТОД GOALSEEK

  • МЕТОД SORT

  • МЕТОД SUBTOTAL


  • Глава 3.

    Методы объекта Range, использующие команды Excel

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



    Объект Outline

    Объект Outline

    Объект 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-й кв. вычисляется итоговая информация по продаже компьютеров.

    Объект Outline
    Рисунок 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

    Объект Outline
    Рисунок 4.7. Диалоговое окно Структура документа

    Объект Outline
    Рисунок 4.8. Структурированная таблица с детализацией

    ШагЗ

    Если структуризация листа не требуется, то ее можно отменить, выбрав команду Данные, Группа и структура, Удалить структуру (Data, Group and Outline, Clear Outline). Тот же результат достигается следующей инструкцией:

    Selection. ClearOutline

    Объект Outline
    Рисунок 4.9. Структурированная таблица без детализации

    Объект Scenario

    Объект 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. СЦЕНАРИИ И ОПРЕДЕЛЕНИЕ СТРУКТУРЫ ДАННЫХ

  • ОБЪЕКТ SCENARIO

  • ОБЪЕКТ OUTLINE


  • Глава 4.

    Сценарии и определение структуры данных



    ДИАГРАММЫ

  • ГЛАВА 5. ДИАГРАММЫ

  • ОБЪЕКТЫ CHART и CHARTOBJECT

  • СВОЙСТВА ОБЪЕКТА CHART

  • МЕТОДЫ ОБЪЕКТА CHART

  • ЛИНИЯ ТРЕНДА


  • Глава 5.

    Диаграммы



    Линия тренда

    Линия тренда

    С помощью диаграммы легко можно анализировать тренды и делать прогнозы. Вручную линия тренда на диаграмме добавляется с помощью команды Диаграмма, Добавить линию тренда (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) определяет, надо ли отображать квадрат коэффициента корреляции на диаграмме. Установим этот флажок, тем самым обеспечив вывод квадрата коэффициента корреляции на диаграмму.




  • Методы объекта Chart

    Методы объекта 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.

    Объекты Chart и ChartObject

    Объекты Chart и ChartObject

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

    В Excel различаются два вида диаграмм: внедренная на рабочий лист и созданная на специальном листе для диаграмм. Итак, семейство sheets (листы) включает в себя семейства: worksheets (рабочие листы) и charts (листы диаграмм). Объектами семейства charts являются листы диаграмм, но это семейство не включает в себя диаграммы, непосредственно встроенные в рабочие листы. Такие диаграммы принадлежат семейству chartobjects. Таким образом, объект ChartObject встроен В Объект Worksheet, a Chart — В workbook. Иерархия этих объектов показана на Рисунок 5.1. Свойства и методы этих объектов в основном аналогичны.

    ПХЯ 5 1 Иерархия объектов Chart и ChartObject

    пХЯ. 5.1. Иерархия объектов Chart и ChartObject

    ПХЯ 5 1 Иерархия объектов Chart и ChartObject


    ПХЯ 5 10 Вкладка Тип диалогового окна Линия тренда

    пХЯ. 5.10. Вкладка Тип диалогового окна Линия тренда


    ПХЯ 5 10 Вкладка Тип диалогового окна Линия тренда



    ПХЯ 5 11 Вкладка Параметры диалогового окна Линия тренда

    пХЯ. 5.11. Вкладка Параметры диалогового окна Линия тренда

    ПХЯ 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 11 Вкладка Параметры диалогового окна Линия тренда
    Рисунок 5.12. Линия тренда объема продаж

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

    пХЯ. 5.2. Пример диаграммы
    Шаг 0

    Выделите диапазон, на основе которого будет строиться диаграмма (Рисунок 5.3). Этот диапазон вводится в аргумент source. В данном примере аргументу source присваивается значение

    Range ("A1:B11") .

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

    Chart Wizard) чтобы отобразить на

    Нажмите кнопку Мастер диаграмм ( 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.5. Вкладка Диапазон данных диалогового окна второго шага работы мастера диаграмм


    ПХЯ 5 5 Вкладка Диапазон данных диалогового окна второго шага работы мастера диаграмм



    ПХЯ 5 6 Вкладка Ряд диалогового окна второго шага работы мастера диаграмм

    пХЯ. 5.6. Вкладка Ряд диалогового окна второго шага работы мастера диаграмм

    ПХЯ 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 Вкладка Заголовки диалогового окна третьего шага работы мастера диаграмм

    пХЯ. 5.7.Вкладка Заголовки диалогового окна третьего шага работы мастера диаграмм

    ПХЯ 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 Диалоговое окно четвертого шага работы мастера диаграмм

    пХЯ. 5.8. Диалоговое окно четвертого шага работы мастера диаграмм

    ПХЯ 5 8 Диалоговое окно четвертого шага работы мастера диаграмм


    ПХЯ 5 9 Построение линии тренда для объема продаж по неделям

    пХЯ. 5.9. Построение линии тренда для объема продаж по неделям


    ПХЯ 5 9 Построение линии тренда для объема продаж по неделям



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

    Свойства объекта 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 — в противном случае



    Метод PivotTableWizard

    Метод 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).

    Объект PivotTable

    Объект PivotTable

    Сводные таблицы являются одним из наиболее мощных средств Excel для анализа данных, помещенных в таблицы или списки. Сводные таблицы позволяют группировать данные и производить их анализ. Создавая сводные таблицы, пользователь оперирует именами полей, которые должны помещаться в ее строках и столбцах. Возможно также задание поля страницы, превращающего сводную таблицу в подшивку из нескольких страниц. Иерархически сводная таблица входит в рабочий лист. Все сводные таблицы рабочей книги образуют семейство pivotTabies (сводные таблицы), которое содержит в себе семейство pivotFieids (поля сводной таблицы) всех полей, входящих в сводную таблицу. Объект Pivotitem (элемент сводной таблицы) является конкретным элементом объекта pivotFieid. Все объекты Pivotitem образуют семейство Pivotitems. На Рисунок 6.1 показана иерархия этих семейств.

    Преобразования свободной таблицы

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

    ActiveSheet . PivotTables
    (Сводная


    Иерархия семейства объектов PivotTabies PivotFieids и Pivotitems

    Рисунок 6.1. Иерархия семейства объектов PivotTabies, PivotFieids и Pivotitems

    Иерархия семейства объектов PivotTabies PivotFieids и Pivotitems
    Семейство PivotTabies имеет единственный метод item, возвращающий элемент этого семейства, т. е. конкретную сводную таблицу.
    Синтаксис:

    Item(Index)

  • Index — имя или номер возвращаемого элемента семейства PivotFieids
  • Из свойств семейства PivotTabies отметим только свойство Count, возвращающее число элементов этого семейства.



    Сводная таблица после

    Рисунок 6.10. Сводная таблица после перемещения поля Месяц из столбцов в строки Сводная таблица после
    Рисунок 6.11. Сводная таблица после группировки магазинов Альфа и Бета

    Сводная таблица после

    Сводная таблица со скрытой детализацией элементов группы магазинов Альфа и Бета

    Рисунок 6.12. Сводная таблица со скрытой детализацией элементов группы магазинов Альфа и Бета


    Сводная таблица со скрытой детализацией элементов группы магазинов Альфа и Бета



    Отчет о продаже компьютеров сети из трех магазинов

    Рисунок 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 : ="Сводная


    Четвертое диалоговое окно мастера сводных таблиц

    Рисунок 6.7. Четвертое диалоговое окно мастера сводных таблиц


    Четвертое диалоговое окно мастера сводных таблиц



    Сводная таблица Преобразования свободной таблицы

    Рисунок 6.8. Сводная таблица



    Сводная таблица после удаления поля Месяц

    Рисунок 6.9. Сводная таблица после удаления поля Месяц

    Сводная таблица после удаления поля Месяц
    Перемещение поля

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

    ActiveSheet . PivotTables ("Сводная


    СВОДНЫЕ ТАБЛИЦЫ

  • ГЛАВА 6. СВОДНЫЕ ТАБЛИЦЫ

  • ОБЪЕКТ PIVOTTABLE

  • МЕТОД PIVOTTABLEWIZARD

  • ПРЕОБРАЗОВАНИЕ СВОБОДНОЙ ТАБЛИЦЫ


  • Глава 6.

    Сводные таблицы



    PivotSelect

    Таблица!" ) . _ PivotSelect "Месяц", xlButton
    ActiveSheet. PivotTables ("СводнаяТаблица!") . _
    PivotFields ("Месяц") .Orientation = xlHidden




    PivotSelect

    Таблица!") . _ PivotSelect "Месяц [Все] ", xlLabelOnly With ActiveSheet .
    PivotTables ( "СводнаяТаблица!").
    PivotFields ("Месяц") .Orientation = xlRowField .Position = 1
    End With


    Группировка полей

    Поля сводной таблицы можно группировать. Например, объединим магазины Альфа и Бета в одну группу. Для этого надо выделить поля этих магазинов и выбрать команду Данные, Группа и структура, Группировать (Data, Group and Outline, Group) (Рисунок 6.11). Программно тот жерезультат получается при помощи следующих двух инструкций:

    ActiveSheet . PivotTables ( "Сводная


    ActiveSheet PivotTables

    Таблица1 " ActiveSheet . PivotTables ( "СводнаяТаблица! " ) . AddFields RowFields : ="Магазин" , ColumnFields : ="Месяц"
    ActiveSheet . PivotTables ( "СводнаяТаблица! " } . PivotFields ("Стоимость") .Orientation = xlDataField

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

    ActiveSheet . PivotTables ( "СводнаяТаблица! " ) . PivotSelect "", xlDataAndLabel
    ActiveSheet . PivotTables ("СводнаяТаблица!") . Ref reshTable




    PivotSelect

    Таблица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




    Дополнительные элементы управления

    Дополнительные элементы управления

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

  • Выбрать команду Сервис, Дополнительные элементы (Tools, Additional Controls).
  • В появившемся на экране окне Дополнительные элементы (Additional Controls) (Рисунок 7.27) в списке Доступные элементы (Available Controls) установить флажок напротив добавляемого элемента.
  • Нажать кнопку ОК.
  • Удаление ненужного элемента управления из панели элементов почти аналогично добавлению, а именно, надо:

  • Выбрать команду Сервис, Дополнительные элементы (Tools, Additional Controls).
  • В появившемся на экране окне Дополнительные элементы (Additional Controls) (Рисунок 7.27) в списке Доступные элементы (Available Controls) снять флажок напротив удаляемого элемента.
  • Нажать кнопку ОК.


  • Флажок и выключатель

    Флажок и выключатель

    Элемент управления checkBox (флажок) создается с помощью кнопки Флажок (Checkbox) (Рисунок 7.21). Этот элемент управления предоставляет пользователю возможность выбора. Флажок обычно имеет два состояния: установленное и сброшенное, но может настраиваться на выбор из трех альтернатив. Флажок имеет те же свойства value, Enabled, visible и Capture, что и переключатель. Кроме того, флажок обладает уникальным свойством Triplestate, позволяющим производить выбор из трех альтернатив. Свойство Triplestate может принимать два значения: False (выбор из двух альтернатив .True и False) и True (выбор из трех альтернатив True, False и Null).

    Инициализация и отображение диалогового окна

    Инициализация и отображение диалогового окна

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

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

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

    ЭЛЕМЕНТЫ УПРАВЛЕНИЯ И ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА

  • ГЛАВА 7. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ И ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА

  • ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
  • Режим конструктора

  • Установка свойств элемента управления

  • РЕДАКТОР КОДА

  • ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА USERFORM
  • Семейство Controls

  • Создание пользовательской формы

  • ОБЩИЕ СВОЙСТВА ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

  • СОГЛАШЕНИЯ ОБ ИМЕНАХ

  • ОБЩИЕ МЕТОДЫ и СОБЫТИЯ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

  • ОБЪЕКТ DATAOBJECT

  • ПОЛЕ

  • НАДПИСЬ

  • КНОПКА
  • Список

  • Заполнение списка

  • Выбор нескольких элементов из списка

  • ПОЛЕ СО СПИСКОМ

  • ПОЛОСА ПРОКРУТКИ И СЧЕТЧИК

  • ПЕРЕКЛЮЧАТЕЛЬ

  • РАМКА

  • ФЛАЖОК и ВЫКЛЮЧАТЕЛЬ

  • РИСУНОК

  • ССЫЛКИ НА ЯЧЕЙКИ И ДИАПАЗОНЫ

  • НАБОР СТРАНИЦ

  • НАБОР ВКЛАДОК

  • ДОПОЛНИТЕЛЬНЫЕ ЭЛЕМЕНТЫ УПРАВЛЕНИЯ

  • ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫБОРА ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

  • ИНИЦИАЛИЗАЦИЯ и ОТОБРАЖЕНИЕ ДИАЛОГОВОГО ОКНА

  • ЗАКРЫТИЕ ДИАЛОГОВОГО ОКНА

  • ОТОБРАЖЕНИЕ ВСТРОЕННЫХ ДИАЛОГОВЫХ ОКОН

  • Глава 7.

    Элементы управления и пользовательская форма



    Элементы управления

    Элементы управления

    VBA обладает встроенным набором элементов управления. Используя этот набор и редактор форм не трудно создать любой пользовательский интерфейс, который будет удовлетворять всем требованиям, предъявляемым к интерфейсу в среде Windows. В данной главе дан обзор встроенных элементов управления VBA. Элементы управления являются объектами. Поэтому, как любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели инструментов Элементы управления (Control Toolbox) (Рисунок 7.1). На этой панели представлены кнопки, позволяющие конструировать элементы управления, а также кнопки вызова окна свойств, перехода в режим конструктора и редактор кода.

    Кнопка

    Кнопка

    Кнопка
    Элемент управления СommandButton (кнопка) создается с помощью кнопки Кнопка (CommandButton) (Рисунок 7.11). Элемент управления CommandButton в основном используется для инициирования выполнения некоторых действий, вызываемых нажатием кнопки, например запуск программы или остановка ее выполнения, печать результатов и т. д.

    Набор страниц

    Набор страниц

    Набор страниц
    Элемент управления MultiPage (набор страниц) создается с помощью кнопки Набор страниц (MultiPage) (Рисунок 7.25). Этот элемент управления реализует многостраничные диалоговые окна. Заголовки страниц отображаются на вкладках. Переход от страницы к странице осуществляется выбором вкладки посредством щелчка кнопкой мыши.

    Набор вкладок

    Набор вкладок

    Набор вкладок
    Элемент управления Tabstrip (набор вкладок) создается с помощью кнопки Набор вкладок (TabStrip) (Рисунок 7.26). Он позволяет создать несколько вкладок в диалоговом окне. Объект TabStrip содержит в себе семейство Tabs, представляющее собой набор всех вкладок. Объект Tabstrip и семейство таБз обладают теми же свойствами и методами, что и объект MuitiPage и семейство Pages .

    Надпись

    Надпись

    Надпись
    Элемент управления Label (надпись) создается с помощью кнопки Надпись (Label) панели элементов управления (Рисунок 7.10). В основном Label используется для отображения надписей, например заголовков, не имеющих свойства Caption. Надпись не может быть изменена пользователем, но код программы во время ее выполнения может управлять текстом надписи.

    Объект DataObject

    Объект 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

    Перейдем теперь к обсуждению каждого из элементов управления по отдельности.



    Общие методы и события элементов управления

    Общие методы и события элементов управления

    Перечислим основные общие методы элементов управления.

    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 ()
  • fmCtrlMask или 2 ()
  • fmAltMask или 4 ()
  • 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 ()
  • fmCtrlMask или 2 ()
  • fmAltMask или 4 ()


  • Общие свойства элементов управления

    Общие свойства элементов управления

    Общие свойства элементов управления
    Приведем основные общие свойства элементов управления.

    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 позволяет отображать программно на экране встроенные диалоговые окна в 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)



    Переключатель

    Переключатель

    Переключатель
    Элемент управления ОptionButton (переключатель) создается с помощью кнопки Переключатель (OptionButton) (Рисунок 7.17). Он позволяет выбрать один из нескольких взаимоисключающих параметров или действий. Переключатели обычно отображаются группами, обеспечивая возможность выбора альтернативного варианта.

    Поле со списком

    Поле со списком

    Поле со списком
    Элемент управления СотbоВох (поле со списком) создается с помощью кнопки Поле со списком (СотЬоВох) (Рисунок 7.15). Элемент управления СотЬоВох применяется для хранения списка значений. Он сочетает в себе функциональные возможности списка ListBox и поля TextBox. В отличииее от ListBox, в элементе управления СотЬоВох отображается только один элемент списка. Кроме того, у него отсутствует режим выделения нескольких элементов списка, но он позволяет вводить значение, используя поле ввода, как это делает элемент управления TextBox.

    Свойства Объекта СотЬоВох, такие как Listlndex, ListCount, Enabled, List и методы clear, Removeitem и Additem аналогичны соответствующим свойствам и методам списка ListBox. Кроме того, у него есть ряд уникальных свойств.

    Поле

    Поле

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

    Полоса прокрутки и счетчик

    Полоса прокрутки и счетчик

    Полоса прокрутки и счетчик
    Элемент управления scrollBar (полоса прокрутки) создается с помощью кнопки Полоса прокрутки (ScrollBar) (Рисунок 7.16).

    Пользовательская форма UserForm

    Пользовательская форма UserForm

    Пользовательская форма 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

    Печатает изображение формы



    Последовательность выбора элементов управления

    Последовательность выбора элементов управления

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

  • Находясь в редакторе Visual Basic выбрать команду Вид, Последовательность перехода (View, Tab Order).
  • В появившемся диалоговом окне Последовательность перехода (Tab Order) с помощью клавиш Вниз (Move Down) и Вверх (Move Up) изменить порядок выделенного элемента управления в зависимости от потребности (Рисунок 7.29).


  • Рамка

    Рамка

    Рамка
    Элемент управления Frame (рамка) создается с помощью кнопки Рамка (Frame) (Рисунок 7.20). Он используется для визуальной группировки элементов управления. Основным свойством рамки является Capture, отображающее надпись рамки.



    Редактор кода

    Редактор кода

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

    Click

    Щелчок

    DblClick

    Двойной щелчок

    GotFocus

    Кнопка в фокусе

    LostFocus

    С кнопки снят фокус

    Код обработки события записывается на листе модуля. Для активизации модуля в том месте, где надо ввести код по обработке события, связанного с выделенным элементом управления, или отредактировать уже написанный код достаточно нажать кнопку Исходный текст (View Code) панели инструментов Элементы управления (Control Toolbox).

    Нажатие на кнопку Исходный текст (View Code) активизирует модуль с именем лист1, т. е. модуль, относящийся к рабочему листу, на котором создана кнопка (Рисунок 7.4). Вся рабочая книга, а также каждый рабочий лист, диаграмма или форма имеют связанные с ними модули кода. Кроме того, можно создать модули кода для макросов и модули класса.

    Режим конструктора

    Режим конструктора

    Режим конструктора
    Для удобства работы с элементами управления в период их конструирования в Excel введен режим конструктора, который активизируется нажатием кнопки

    Режим конструктора (Design Mode) панели инструментов Элементы управления (Control Toolbox). В режиме конструктора отключена реакция элемента управления на события. Поэтому при включенном режиме конструктора можно видоизменять элемент управления и задавать его свойства. На Рисунок 7.2 показано создание элемента управления CommandButton (кнопка) на рабочем листе. После того как пользователь решит, что созданный элемент управления имеет тот вид, который ему нужен, и все требуемые свойства элемента управления установлены, он должен отключить режим конструктора повторным нажатием кнопки Режим конструктора (Design Mode).

    с помощью кнопки Рисунок

    Рисунок

    с помощью кнопки Рисунок
    Элемент управления 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

    Семейство Controls

    Семейство Controls

    Доступ к семейству всех элементов управления, расположенных в пользовательской форме UserForm, осуществляется с помощью семейства controls. Например, чтобы скрыть все элементы управления формы UserForm, можно использовать код, в котором свойству visible элемента управления, определяющему, отображается ли этот элемент на экране или нет, устанавливается значение False:

    For Each Элемент in UserForml.Controls

    Элемент.Visible = False Next Control



    Соглашения об именах

    Соглашения об именах

    При создании формы или элемента управления, 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



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

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

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

    Шаг 1

    Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Visual Basic) для того, чтобы перейти в редактор Visual Basic.

    Шаг 2

    Выберите команду Вставить User Form (Insert UserForm). В редакторе Visual Basic появятся:
  • Окно с пользовательской формой
  • Панель инструментов Панель элементов (Toolbox) (Рисунок 7.6).


  • Список

    Список

    Список
    Элемент управления ListBox (список) создается с помощью кнопки Список (ListBox) (Рисунок 7.12). Элемент управления ListBox применяется для хранения списка значений. Из списка пользователь может выбрать одно или несколько значений, которые в последующем будут использоваться в тексте программы.

    Ссылки на ячейки и диапазоны

    Ссылки на ячейки и диапазоны

    Ссылки на ячейки и диапазоны
    Элемент управления RefEdit (редактирование ссылок) создается с помощью кнопки RefEdit (Рисунок 7.24). Элемент управления RefEdit обычно используется для ввода ссылок на ячейки или диапазоны. Основным свойством элемента управления RefEdit является Text, возвращающее строку, введенную в поле ввода этого элемента управления.

    Установка свойств элемента управления

    Установка свойств элемента управления

    Установка свойств элемента управления
    Для установки свойств элемента управления вручную при его конструировании необходимо выделить элемент управления и нажать кнопку Свойства (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 устанавливает, отображается ли элемент управления с тенью или без нее.

    Выбор нескольких элементов из списка

    Выбор нескольких элементов из списка

    Выбор нескольких элементов из списка
    Свойство MuitiSelect позволяет устанавливать режим, при котором допустим выбор нескольких элементов из списка. Свойство selected предоставляет возможность проверить, выбран ли элемент с указанным индексом. На Рисунок 7.14 показан выбор нескольких элементов из списка. Приведем пример использования этих свойств при вычислении среднего значения выбранных в списке элементов.

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

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

    Закрытие диалогового окна
    В VBA диалоговые окна работают в режиме модального диалога. Это означает, что пользователь, прежде чем перейти к выполнению действий, не связанных с текущим активным диалоговым окном, должен его закрыть. Закрытие диалогового окна производится методом Hide. Следующая процедура является примером процедуры закрытия диалогового окна. Эта процедура активизируется при нажатии кнопки CommandButton2 диалогового окна UserForm1 и выполняет только одну инструкцию, осуществляющую закрытие этого диалогового окна.

    Private Sub CommandButton2_Click() '

    ' Процедура закрытия диалогового окна '

    UserForm1.Hide
    End Sub

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



    Заполнение списка

    Заполнение списка

    Заполнение списка
    Заполнить список можно одним из следующих способов.

    Поэлементно, если список состоит из одной колонки (Рисунок 7.13)

    With ListBoxl
    .Addltem "Июнь"
    .Addltem "Июль"
    .Addltem "Август"
    .Listlndex = 0
    End With



    Изменение и создание вручную изображения на кнопке

    Изменение и создание вручную изображения на кнопке

    Вручную можно изменить изображение любой кнопки. В Excel имеется коллекция из 42 встроенных кнопок. Кроме того, при помощи встроенного редактора можно создать любой рисунок на поверхности кнопки и изменить уже существующий. Для этого надо воспользоваться следующим алгоритмом.
    1 Шаг Выберите команду Вид, Панели инструментов, Настройка (View,
    Toolbars, Customize) или переместите указатель на любую панель 1 инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).
    Шаг 2 Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и выберите кнопку, которую следует видоизменить. Нажмите кнопку Изменить выделенный объект (Modify selection). Выберите команду Выбрать значок для кнопки (ChangeButton Image) и один из значков в появившемся меню (Рисунок 8.10). Нажмите кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь изображение на кнопке изменилось.


    Назначение вручную макроса кнопке

    Назначение вручную макроса кнопке

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

    Шаг 1

    Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).

    Шаг 2

    Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и выберите элемент управления, который требуется связать с макросом. Нажмите кнопку Изменить выделенный объект (Modify selection). В появившемся меню выберите команду Назначить макрос (Assign Macro) (Рисунок 8.8).



    Объект CommandBar и семейство CommandBars

    Объект CommandBar и семейство CommandBars

    Объект CommandBar и семейство CommandBars используются для программирования строк меню и панелей инструментов. В семействе CommandBars хранятся все строки меню и панели инструментов конкретного приложения.

    Семейство CommandBars содержится в объекте Application. Оно представляет собой панели команд. В свою очередь каждый объект CommandBar содержит семейство commandBarControls, состоящее из всех элементов управления данной панели инструментов. Свойство controls объекта CommandBar возвращает семейство CommandBarControls. Элементы семейства CommandBarControis относятся к одному из трех типов.

    CommandBar But ton

    Кнопка или элемент меню, вызывающий выполнение команды или подпрограммы

    CommandBarComboBox

    Сложно организованные меню, такие как поле ввода, раскрывающийся список или поле со списком

    CommandBarPopUp

    Меню или вложенное меню

    На Рисунок 8.1 показана иерархическая схема объекта CommandBar.

    ПХЯ 8 1 Иерархическая схема объекта CommandBar

    пХЯ. 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 10 Диалоговое окно со значками

    пХЯ. 8.10. Диалоговое окно со значками

    ПХЯ 8 10 Диалоговое окно со значками
    Если необходимо создать пользовательское изображение на кнопке или подкорректировать уже существующее, шаг 2 алгоритма должен быть следующим.

    ПХЯ 8 11 Диалоговое окно Редактор кнопок

    пХЯ. 8.11. Диалоговое окно Редактор кнопок

    ПХЯ 8 11 Диалоговое окно Редактор кнопок
    Шаг 2

    Раскройте вкладку Команды (Commands) диалогового окна Настройка (Customize) и выберите кнопку, которую следует видоизменить. Нажмите кнопку Изменить выделенный объект (Modify selection). Выберите команду Изменить значок на кнопке (Edit Button Image).

    ШагЗ

    Появится диалоговое окно Редактор кнопок (Edit Button) (Рисунок 8.11). Используя средства этого редактора можно создать любое изображение на поверхности кнопки. Нажмите кнопку OK диалогового окна Редактор кнопок (Edit Button) и кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь изображение на кнопке изменилось.



    ПХЯ 8 2 Пользовательский интерфейс

    пХЯ. 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. Интерфейс с пользовательской строкой меню

    ПХЯ 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



    ПХЯ 8 4 Диалоговое окно Настройка

    пХЯ. 8.4. Диалоговое окно Настройка

    ПХЯ 8 4 Диалоговое окно Настройка
    ШагЗ

    В появившемся диалоговом окне Создание панели инструментов в поле Панель инструментов (Toolbars) введите имя новой панели инструментов, например моя панель (Рисунок 8.5).



    ПХЯ 8 5 Диалоговое окно Создание панели инструментов

    пХЯ. 8.5. Диалоговое окно Создание панели инструментов

    ПХЯ 8 5 Диалоговое окно Создание панели инструментов
    Шаг 4

    Нажмите кнопку ОК. Это приведет к появлению новой панели инструментов (Рисунок 8.6). Пусть вас не смущает ширина панели инструментов. Она будет автоматически расширяться по мере ее заполнения элементами управления.



    ПХЯ 8 6 Новая панель инструментов и диалоговое окно Настройка

    пХЯ. 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 Новая панель инструментов Моя панель

    пХЯ. 8.7. Новая панель инструментов Моя панель

    ПХЯ 8 7 Новая панель инструментов Моя панель


    ПХЯ 8 8 Меню с командой Назначить макрос

    пХЯ. 8.8. Меню с командой Назначить макрос

    ПХЯ 8 8 Меню с командой Назначить макрос
    ШагЗ

    Появится диалоговое окно Назначить макрос (Assign Macro) (Рисунок 8.9). В списке Имя макроса (Macro Name) выберите имя макроса, назначаемое элементу управления. Нажмите кнопку ОК диалогового окна Назначить макрос (Assign Macro) и кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь макрос назначен кнопке.



    ПХЯ 8 9 Диалоговое окно Назначить макрос

    пХЯ. 8.9. Диалоговое окно Назначить макрос

    ПХЯ 8 9 Диалоговое окно Назначить макрос


    Пример создания панели инструментов пользователя

    Пример создания панели инструментов пользователя

    Приведем пример проекта, который создает интерфейс приложения, состоящего из строки меню и одной панели инструментов. В панель инструментов входят две кнопки и раскрывающийся список. На поверхности одной из кнопок выводится рисунок, а другой — надпись (Рисунок 8.2).

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

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

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

    ПРОГРАММИРОВАНИЕ ПАНЕЛИ ИНСТРУМЕНТОВ

  • ГЛАВА 8. ПРОГРАММИРОВАНИЕ ПАНЕЛИ ИНСТРУМЕНТОВ

  • ОБЪЕКТ COMMANDBAR и СЕМЕЙСТВО COMMANDBARS

  • СЕМЕЙСТВО COMMANDBARCONTROLS и ОБЪЕКТ COMMANDBARCONTROL

  • ПРИМЕР СОЗДАНИЯ ПАНЕЛИ ИНСТРУМЕНТОВ ПОЛЬЗОВАТЕЛЯ

  • ПРИМЕР СОЗДАНИЯ СТРОКИ МЕНЮ ПОЛЬЗОВАТЕЛЯ

  • СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКОЙ ПАНЕЛИ ИНСТРУМЕНТОВ ВРУЧНУЮ

  • УДАЛЕНИЕ ЭЛЕМЕНТА УПРАВЛЕНИЯ из ПАНЕЛИ ИНСТРУМЕНТОВ ВРУЧНУЮ

  • УДАЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКОЙ ПАНЕЛИ ИНСТРУМЕНТОВ ВРУЧНУЮ

  • НАЗНАЧЕНИЕ ВРУЧНУЮ МАКРОСА КНОПКЕ

  • ИЗМЕНЕНИЕ и СОЗДАНИЕ ВРУЧНУЮ ИЗОБРАЖЕНИЯ НА КНОПКЕ


  • Глава 8.

    Программирование панели инструментов

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



    РЮАКХЖЮ 8 1 Названия панелей инструментов

    рЮАКХЖЮ 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 и объект 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
    Устанавливает режим отображения (видимость) на экране кнопки


    Создание пользовательской панели инструментов вручную

    Создание пользовательской панели инструментов вручную

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

    Шаг 1

    Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).

    Шаг 2

    В появившемся диалоговом окне Настройка (Customize) нажмите кнопку Создать (New) (Рисунок 8.4).



    Удаление элемента управления из панели инструментов вручную

    Удаление элемента управления из панели инструментов вручную

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

    Шаг 1

    Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).

    Шаг 2

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

    ШагЗ

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

    Application. CommandBars ("Моя панель") .Controls (4) .Delete



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

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

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

    Шаг 1

    Выберите команду Вид, Панели инструментов, Настройка (View, Toolbars, Customize) или переместите указатель на любую панель инструментов и сделайте щелчок правой кнопкой мыши, а затем выберите команду Настройка (Customize).

    Шаг 2

    Раскройте вкладку Панели инструментов (Toolbars) диалогового окна Настройка (Customize). Выделите пользовательскую панель и сбросьте соответствующий флажок, а затем нажмите кнопку Удалить (Delete). Программно тот же результат достигается инструкцией:

    Application. CommandBars ("Моя панель") .Delete



    Объект Balloon

    Объект 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). Надписи выводятся в виде нумерованного списка. Выбор надписей программой игнорируется. Зато установка флажка приводит к программному отклику. В данном случае в виде отображения диалогового окна с соответствующим сообщением. В качестве помощника выбран Скрепыш, который используется по умолчанию. Для Скрепыша установлена не прерывная анимация до тех пор, пока окно помощника отображается на экране.

    Объект Balloon
    Рисунок 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

    Объект Balloon
    Рисунок 9.3. Второй пример окна помощника

    ПРОГРАММИРОВАНИЕ СРЕДСТВ ДЛЯ РАБОТЫ

  • ГЛАВА 9. ПРОГРАММИРОВАНИЕ СРЕДСТВ ДЛЯ РАБОТЫ
    СО СПРАВОЧНОЙ ИНФОРМАЦИЕЙ

  • СТРУКТУРА ПОМОЩНИКА

  • ТИПЫ ПОМОЩНИКА

  • СВОЙСТВА ОБЪЕКТА ASSISTANT

  • ОБЪЕКТ BALLOON


  • Глава 9.

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

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



    Структура помощника

    Структура помощника

    Помощник программируется на VBA при помощи объекта Assistant. Структура объекта Assistant приведена на Рисунок 9.1. Важной особенностью объекта является то, что это единичный объект, не являющийся элементом никакого семейства объектов. В каждый момент времени можно вывести только одного помощника. Но помощника можно видоизменять по ходу работы программы. Объект Balloon представляет собой окно помощника, содержащее список разделов справки, связанных с помощником. В этот список могут входить надписи и флажки. Все надписи, входящие в объект Balloon, образует семейство BalloonLabeis, а все флажки - семейство BalloonCheckBoxes.

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

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

    Свойства объекта 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 (отображается помощник со справкой, при нажатии клавиши ) и False (в противном случае)

    Filename

    Возвращает полное имя файла (т. е. с указанием папки, где находится файл) для активного помощника. Имена файлов помощников имеют расширение act. Обычно Windows-файлы помощников располагаются В папке \Program Files\Microsoft Office\0ffiсе\Actors

    GuessHelp

    Допустимые значения: True (отображается помощник с наиболее подходящей справкой при нажатии клавиши ) и False (в противном случае)

    Sounds

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

    TipOfDay

    Допустимые значения: True (помощник отображает сообщение при запуске приложения) и False (в противном случае)

    Visible

    Допустимые значения: True (помощник отображается на экране) и False (в противном случае)



    Типы помощника

    Типы помощника

    Типы помощника
    Всего имеется 9 типов помощников. По умолчанию используется помощник с именем скрепыш (Clippit). Отображением помощника на экране управляет свойство Visible объекта Assistant. Свойство Filename объекта Assistant позволяет изменить вид помощника. А свойство Name возвращает имя текущего помощника.

    Перечислим используемые в VBA типы помощников.
    Внешний вид Название (рус.)


    Содержание Назад Вперед

        Программирование: Языки - Технологии - Разработка


    

        Программирование: Языки - Технологии - Разработка