Самоучитель VBA
Что такое VBA
Что такое VBAVBA — относительно легкий язык программирования. Он прост в освоении и позволяет быстро получать ощутимые результаты — конструировать профессиональные приложения, решающие практически все задачи, встречающиеся в среде 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
Иерархия встроенных объектов VBA
Рисунок 1.1. Иерархия встроенных объектов VBA
Полная ссылка на объект состоит из ряда имен вложенных последовательно друг в друга объектов. Разделителями имен объектов в этом ряду являются точки, ряд начинается с объекта Application и заканчивается именем самого объекта. Например, полная ссылка на ячейку AI рабочего листа лист1 рабочей книги с именем Архив имеет вид:
Application.Workbooks("Архив")
.Worksheets("Лист1").Range("Al")
Приводить каждый раз полную ссылку на объект совершенно не обязательно. Обычно достаточно ограничиться только неявной ссылкой на объект.
В неявной ссылке, в отличие от полной, объекты, которые активны в данный момент, как правило, можно опускать. В рассмотренном случае, если ссылка на ячейку AI дана в программе, выполняемой в среде Excel, то ссылка на объект Application может быть опущена, т. е. достаточно привести относительную ссылку:
Workbooks("Архив").Worksheets("Лист1").Range("A1")
Если рабочая книга Архив является активной, то ссылку можно записать еще короче:
Worksheets("Лист1").Range("A1")
Если и рабочий лист лист! активен, то в относительной ссылке вполне достаточно ограничиться упоминанием только диапазона A1:
Range("A1")
Окно Просмотр объектов
Рисунок 1.10. Окно Просмотр объектов
Окно Просмотр объектов (Object Browser) состоит из трех основных частей:
Окно проекта
Рисунок 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).
Список компонентов можно выводить на экран нажатием комбинации клавиш
Отображение списка компонентов, логически завершающих вводимую инструкцию,, является одним из интеллектуальных качеств редактора кода. Этим качеством интеллектуальные ресурсы редактора кода не исчерпываются. Другим его такого рода качеством является автоматическое отображение на экране сведений о процедурах, функциях, свойствах и методах после набора их имени (Рисунок 1.6).
Отображаемые сведения о вводимой процедуре
Рисунок 1.6. Отображаемые сведения о вводимой процедуре
Автоматическое отображение на экране сведений о процедурах, функциях, свойствах и методах после ввода их имени происходит только при установленном флажке Краткие сведения (Auto Quick Info) вкладки Редактор (Editor) диалогового окна Параметры (Options), отображаемого на экране после выбора команды Сервис, Параметры (Tools, Options) (см. Рисунок 1.4).
Описанную выше всплывающую подсказку можно также выводить на экран нажатием комбинации клавиш
Редактор кода также производит автоматическую проверку синтаксиса набранной строки кода сразу после нажатия клавиши
Редактор кода обладает еще одной мощной интеллектуальной возможностью, увеличивающей эффективность работы пользователя. Если курсор расположить на ключевом слове языка VBA, имени процедуры, функции, свойства или метода и нажать клавишу
Работа от примера является одним из краеугольных принципов миропозна-ния и творчества. Стиль работы от примера очень ярко отображен в принципе чайника. Несмотря на всю его шутливость и кажущуюся абсурдность, в нем сформулирован многовековой опыт работы, который очень часто приводит к быстрым и эффективным результатам. Попытаемся описать принцип чайника следующим образом. У программиста спросили, как надо вскипятить воду, если на кухне есть спички, газовая плита, водопроводный кран и пустой чайник, стоящий на кухонном столе. "Тривиально! — ответил программист. - Налейте в чайник воду, зажгите горелку газовой плиты и поставьте на нее чайник." Тогда программисту задают следующий вопрос: "На кухонном столе стрит чайник с водой, горелка газовой плиты зажжена. Как вскипятить чайник?" "Элементарно! - отвечает программист. — Надо просто вылить воду из чайника, погасить горелку и мы оказываемся в условиях задачи, которая только что была успешно решена!"
Окно редактирования форм и панель инструментов Панель элементов
Рисунок 1.7. Окно редактирования форм и панель инструментов Панель элементов
Используя панель инструментов Панель элементов из незаполненной формы, можно сконструировать любое требуемое для приложения диалоговое окно. Размещение нового управляющего элемента в форме осуществляется следующей последовательностью действий:
Команды меню Формат
Рисунок 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
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell
Режимы работы редактора
Таблица 1.1. Режимы работы редактора кода| Кнопка | Режим работы |
| Отдельная процедура | |
| Все процедуры модуля |
Методы создающие объекты Shape
Методы, создающие объекты ShapeРассмотрим методы, создающие новые элементы семейства shapes. Вручную объекты Shape создаются при помощи панели инструментов Рисование (Drawing).
| AddShape | Возвращает объект Shape. Синтаксис: AddShape (Type, Left, Top, Width, Height) Аргументы: msoShapeCube (куб), msoShapeRectangle (ПРЯМОУГОЛЬНИК), msoShapeOval (овал), msoShapeSmileyFace (улыбающееся лицо) ; |
Графические объекты прямоугольник овал и улыбающееся лицо
Рисунок 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) Аргументы: |
||
| AddTextbox |
Возвращает объект shape, являющийся надписью. Синтаксис: AddTextbox (Orientation, Left, Top, Width, Height) Аргументы: |
||
Графические объекты линии и текстовое поле
Рисунок 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) Аргументы: |
||
| AddPicture |
(рисунок связан с файлом, на основе которого создан) и False (в противном случае) |
||
WordArtобъект
Рисунок 10.3. 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 — текстовое поле |
||
| 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, нижняя граница массива равняется нулю |
||
| Тип |
Тип данных массива |
||
ReDim R(l To 10)
Допустимо повторное использование инструкции ReDim для изменения числа элементов и размерностей массива.
Допустимые имена
Допустимые именаВ VBA пользователь определяет имена переменных, функций, процедур, типов, постоянных и других объектов. Вводимые пользователем имена должны отражать суть обозначаемого объекта так, чтобы делать программу легко читаемой. В VBA имеются следующие ограничения на имена:
!, #, @, $.
процентная
ставка х_начзнач
предпочтительнее использовать следующие имена, которые легче воспринимаются, благодаря выделению некоторых символов, входящих в них, разумным использованием верхнего регистра
ПроцентнаяСтавка
х_НачЗнач
Функции и процедуры для работы с массивами
Функции и процедуры для работы с массивамиПри работе с массивами бывает полезно применять следующие функции и процедуры.
| Array (СписокАргументов) |
Создает массив типа variant. Аргумент спи-сокАргументов представляет разделенный запятыми список значений, присваиваемых элементам массива. Пример: Dim День As Variant День = Array ("Пн", "Вт", "Ср", "Чт", "Пт") |
||
| IsArray (ИмяПеременной) |
Возвращает True, если переменная содержит массив; в противном случае возвращается False. Функцию IsArray используют дляпроверки значений переменных типа variant, содержащих массивы |
||
| LBound (ИмяМассива [, Размерность]) и Ubound (ИмяМассива |
Возвращают минимальное и максимальное допустимые значения указанной размерности. Аргументы: |
||
| [, Размерность]) |
|
||
| 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) Аргументы: |
||
| Right |
Возвращает строку, состоящую из заданного числа последних символов исходной строки. Синтаксис: Right (string, length) Аргументы: |
||
| Mid |
Возвращает подстроку строки, содержащую указанное число символов. Синтаксис: Midlstring, start [, length]) Аргументы: |
||
| Len |
Возвращает число символов строки. Синтаксис: Len (Строка) |
||
| Функция |
Возвращаемое выражение |
||
| LTrim |
Возвращает копию строки без пробелов в начале. Синтаксис: LTrim (Строка) |
||
| Rtrim |
Возвращает копию строки без пробелов в конце. Синтаксис: RTrim (Строка) |
||
| Trim |
Возвращает копию строки без пробелов в начале и в конце Синтаксис: Trim (Строка) |
||
| Space |
Возвращает строку, состоящую из указанного числа пробелов. Синтаксис: Space (Число) |
||
| String |
Возвращает строку, состоящую из указанного числа повторений одного и того же символа. Синтаксис: String (number, character) Аргументы: |
||
| StrComp |
Возвращает результат сравнения двух строк. Синтаксис: StrComp(stringl, string2 [, compare]) Аргументы: |
||
| InStr |
Возвращает позицию первого вхождения одной строки внутри другой строки. Синтаксис: InStr ( [start, ] stringl, st'ring2 [ , compare]) Аргументы: |
||
Функции преобразования форматов
Функции преобразования форматовПреобразование строки в число и обратно осуществляют следующими функциями.
| Val (строка) |
Возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа |
||
| Str (число) |
Возвращает значение типа variant (String), являющееся строковым представлением числа |
||
Чтобы представить числовое значение как дату, время, денежное значение или в специальном формате, следует использовать функцию Format.
| Format |
Возвращает значение типа variant (string), содержащее выражение, отформатированное согласно инструкциям, заданным в описании формата. Синтаксис: Format (Выражение [, Формат [, ПервыйДеньНедели [ , ПерваяНеделяГода] ] ]) |
||
| 0 |
Резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у числа, представленного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится о, функция отображает эту цифру аргумента, если нет — в этой позиции отображается нуль |
||
| # |
Резервирует позицию цифрового разряда. Отображает цифру или ничего не отображает. Если у числа, представленного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится #, функция отображает эту цифру аргумента, если нет — в исходной позиции не отображается ничего. Действие данного символа аналогично действию о, за исключением того, что лидирующие нули не отображаются |
||
| . |
Резервирует позицию десятичного разделителя. Указание точки в строке формата определяет, сколько разрядов необходимо отображать слева и справа от десятичной точки |
||
| % |
Резервирует процентное отображение числа |
||
| , |
Разделитель разряда сотен от тысяч |
||
| |
Разделитель часов, минут и секунд в категории форматов Время (Time) |
||
| / |
Разделитель дня, месяца и года в категории форматов Дата (Date) |
||
| E+, E-, e+, e- |
Разделитель мантиссы и порядка в экспоненциальном формате |
||
| Функция |
Тип, в который преобразуется выражение |
||
| 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, использует меньше памяти и может быть полезна в следующих случаях:
| 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 (время) |
||
| 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] ) DateDif f (interval, datel, date2[, firstdayofweek [, f irstweekof year] ] ) Аргументы: |
||
| Функция |
Возвращаемое значение |
||
| DatePart DateAdd TimeSerial DateSerial TimeValue |
Возвращает значение типа variant (Integer) , содержащее указанный компонент даты. Синтаксис: DatePart (interval, date [, firstdayofweek[, firstweekofyear] ] ) Возвращает значение типа Variant ( Date ) , содержащее дату, к которой добавлен указанный временной интервал. Синтаксис: DateAdd'(interval, number, date) Аргументы: Синтаксис: TimeSerial (hour, minute, second) Аргументы: Аргументы: 05/17/60: Дата = DateSerial (1960, 5, 17) Преобразует строку в формат времени |
||
Функции выбора
Функции выбораКроме перечисленных выше основных категорий функций в VBA имеются также функции выбора, которые дублируют некоторые аспекты операторов условного перехода. Ниже приведены эти функции.
| Функция |
Возвращаемое значение |
||
| lit Choose Switch |
Возвращает одну из двух альтернатив. Синтаксис: Синтаксис: Choose (индекс, вариант-1[, вариант-2, ... [, вариант-п] ] ) Синтаксис: 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
удобно использовать комментарии, т. е.
КомментарииРаботая с.программой, удобно использовать комментарии, т. е. фрагменты текста программы, не являющиеся программными кодами и игнорируемые компилятором. Комментарии выполняют две важные функции:
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 имеется три соответствующих уровня переменных:
Операции VBA
Операции VBAВ программах на 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}
Операторы перехода и выбора
Операторы перехода и выбораПеречислим операторы перехода и выбора 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 предназначена для описания типа данных переменной на уровне модуля или процедуры. Например, следующая инструкция описывает переменную с типом integer.
Dim N As Integer
Инструкция Dim предназначена также для описания объектного типа переменных. Далее приводится описание переменной для нового экземпляра рабочего листа.
Dim X As New Worksheet
Если при описании объектной переменной не используется ключевое слово New, то для использования объекта, на который ссылается переменная, существующий объект должен быть присвоен переменной с помощью инструкции Set.
Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefTnn, по умолчанию переменная получает тип variant. Для обязательного описания всех переменных надо поместить в начале модуля инструкцию option Explicit. Использование этой инструкции полезно при отладке программ, т. к. она позволяет легче отслеживать возможную путаницу в именах при наборе программы.
ОСНОВЫ ПРОГРАММИРОВАНИЯ НА VBA
Глава 11.
Основы программирования на VBA
Переход в подпрограмму и возвращение из подпрограммы
Переход в подпрограмму и возвращение из подпрограммыВ VBA от первоначальных версий BASIC сохранилась конструкция подпрограммы GoSub- Return, которая в настоящее время редко используется. Для полноты изложения вкратце напомним синтаксис этой инструкции.
Синтаксис:
GoSub строка
строка
Return
Аргумент строка может быть любой меткой строки или номером строки. В качестве метки строки может быть любая комбинация символов, начинающаяся с буквы и заканчивающаяся двоеточием.
Допускается использование инструкций GoSub и Return в любом месте процедуры, но GoSub и соответствующая инструкция Return должны находиться в одной процедуре. Подпрограмма может содержать несколько инструкций Return. Первая обнаруженная инструкция Return приводит к передаче управления назад к инструкции, непосредственно следующей за последней выполненной инструкцией GoSub.
Перенос строки
Перенос строкиРасположение символов (пробел) + (Знак подчеркивания) в конце строки обеспечивает то, что последующая строка является продолжением предыдущей. При этом надо помнить, что:
у = 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 |
||
Синтаксис элемента СписокАргументов:
[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 |
||
Синтаксис:
[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.
Алгоритм Евклида состоит в следующем:
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 и другой, определяемый пользователем тип или объектный тип |
||
' Тип, определенный пользователем
Туре Студент '
' Элементы типа данных
'
Фамилия 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 |
||
Синтаксис:
#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]) Аргументы: |
||
| Процедура |
Выводит на экран диалоговое окно, содержащее сообщение, |
||
| MsgBox |
устанавливает режим ожидания нажатия кнопки пользователем, а затем возвращает значение типа integer, указывающее, какая кнопка была нажата. Синтаксис: MsgBox (prompt [, buttons] [, title] [, helpfile, context]) Аргументы: |
||
Встроенные функции 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, а значит имело место явное описание переменной Ссуда, то компилятор указал бы на переменную ссуда с латинской буквой с, как на неописанную, и эта, трудно отслеживаемая ошибка, была бы быстро найдена.
Логические ошибки
Логические ошибки
Логические ошибки труднее всего обнаружить и устранить. Эти ошибки не приводят к прерыванию выполнения программы, т. е. визуально все идет гладко и выглядит так, как будто программа работает безупречно. Но это только кажущаяся идиллия, т. к. программа выдает неверные результаты. Локализация логических ошибок связана с тщательным анализом алгоритма программы с привлечением средств отладки VBA (Рисунок 12.8).
Ошибки компиляции
Ошибки компиляцииОшибки компиляции возникают, если VBA не может интерпретировать введенный код. Например, при некорректном вводе числа скобок, неправильном имени, неполном вводе инструкции и т. д. Некоторые из этих ошибок обнаруживаются VBA при завершении набора строки с инструкцией в редакторе кода и после нажатия клавиши
Ошибки выполнения
Ошибки выполнения
Ошибки выполнения возникают после успешной компиляции программы при ее выполнении. Причинами таких ошибок могут быть, например:
Отладка программ
Отладка программ
При написании программ пользователь независимо от его опыта допускает те или иные ошибки. Кто-то из мудрых совершенно верно подметил, что только тот, кто ничего не делает, не совершает ошибок. Позвольте перефразировать эту жизненную мудрость для изучаемого в данной книге предмета следующим образом: в программах не делал ошибок только тот, кто никогда не писал их. Итак, ошибки — это объективная неизбежность или реальное воплощение этой неизбежности. Какие же бывают ошибки и как с ними бороться? Условно ошибки можно поделить на три типа: ошибки компиляции, выполнения и логические ошибки.
Перехват и обработка ошибок
Перехват и обработка ошибок
Из диалогового окна 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 |
Останавливает выполнение процедуры. Допустимые синтаксисы: |
||
Свойства объекта Err
| Number |
Возвращает код ошибки |
||
| Source |
Имя текущего проекта VBA |
||
| Description |
Возвращает строковое выражение, содержащее текст сообщения об ошибке |
||
| HelpFile |
Полное имя (включая диск и путь) файла справки VBA |
||
| HelpContext |
Контекстный идентификатор файла справки VBA, соответствующий ошибке с кодом, указанным в свойстве Number |
||
| LastDLLError |
Содержит системный код ошибки для последнего вызова библиотеки динамической компоновки (DLL) |
||
| Clear |
Очищает все значения свойств объекта Err. Метод clear используется для явной очистки значений свойств объекта Err после завершения обработки ошибки. Это необходимо, например, при отложенной обработке ошибки, которая задается инструкцией on Error Resume Next |
||
| Raise |
Создает ошибку выполнения. Используется при моделировании ситуаций ошибки. Синтаксис: Raise number, source, description, helpfile, helpcontext Аргументы: |
||
Пошаговое выполнение программ
Пошаговое выполнение программРедактор VBA позволяет выполнять пошаговую отладку программы. Ее можно выполнить либо при помощи панели инструментов Отладка (Debug), либо меню Отладка (Debug), которое включает команды и соответствующие комбинации клавиш (Рисунок 12.9). Если панель инструментов Отладка (Debug) не отображена на экране, то ее можно отобразить, выполнив команду Вид, Панели инструментов, Отладка (View, Toolbars, Debug).
ПРОЦЕДУРЫ ОБРАБОТКИ ОШИБОК И ОТЛАДКА ПРОГРАММ
Глава 12.
Процедуры обработки ошибок и отладка программ
Разработка процедур предотвращающих появление ошибок
Разработка процедур, предотвращающих появление ошибокПри составлении приложений важно предусмотреть, чтобы программа анализировала возможные ошибки, возникающие при ее выполнении по вине пользователя, и информировала его об этом, подсказывая, что конкретно он сделал неправильно. При этом возможно два подхода:
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), предоставляет пользователю возможность:
s=0: For i=1 to 5: s=s+i^2: Next i: MsgBox s
?х
х = 15
Наиболее употребляемые инструкции и функции при работе с файлами
Наиболее употребляемые инструкции и функции при работе с файламиПриведем наиболее часто употребляемые инструкции и функции для работы с файлами.
| ChDir |
Изменяет текущую папку. Синтаксис: ChDir путь |
||
| ChDrive |
Изменяет текущий диск. Синтаксис: ChDrive диск Например, ChDrive "D" |
||
| CurDir |
Функция возвращает текущую папку |
||
| FileAttr |
Возвращает значение типа Long, представляющее режим файла, открытого с помощью инструкции open. Возвращаемые значения: 1 (для режима input), 2 (output), 4 (Random), 8 (Append) и 32 (Binary). Синтаксис: FileAttr (НомерФайла, Тип) |
||
| GetAttr |
Возвращает значение типа integer, определяющее атрибуты файла, каталога или папки. Значение, возвращаемое функцией GetAttr, является суммой констант, приведенных в табл. 13.1. Синтаксис: GetAttr (путь) |
||
| SetAttr |
Устанавливает атрибуты файла. Синтаксис: SetAttr pathname, attributes Атрибуты в аргументе attributes определяются как сумма констант из табл. 13.1 |
||
| FileCopy |
Копирует файл. Синтаксис: FileCopy source, destination Аргументы: |
||
| FileDateTime |
Функция возвращает дату и время последнего изменения файла. Синтаксис: FileDateTime (путь ) |
||
| Kill |
Удаляет существующий файл. Синтаксис: Kill путь В аргументе путь допустимо использование символой (*) и (?) для удаления нескольких файлов по маске. |
||
| MkDir |
Создает новую папку. Синтаксис: MkDir путь |
||
| RmDir |
Удаляет существующую папку. Синтаксис: RmDir путь |
||
Объект FileSearch
Объект FileSearch
Объект FileSearch обладает функциональными возможностями диалогового окна Открытие документа (Open), отображаемого на экране_посредством выбора команды Файл, Открыть (File, Open). Объект FileSearch входит в объект Application и иерархически включает в себя (Рисунок 13.1):
Открытие и закрытие файла
Открытие и закрытие файлаОбсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.
| Open |
Разрешает выполнение операций ввода/вывода при работе с файлом. Синтаксис: Open Путь For Режим [Access Доступ] [Блокировка] As [ # ] НомерФайла [Lеn=Длина] |
||
| 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) Аргументы: Допустимые значения: msoSortOrderAscending и msoSort Order Descending |
||
| NewSearch |
Устанавливает критерии, используемые при поиске по умолчанию |
||
| 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.
Работа с файлами
Работа с файлом произвольного доступа
Работа с файлом произвольного доступаПриведем инструкции ввода/вывода информации при работе с файлом произвольного доступа, а также инструкции определения длины файла и текущей позиции указателя в файле.
| Put |
Записывает содержимое переменной в файл произвольного доступа. Синтаксис: Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной |
||
| Get |
Читает данные из открытого файла произвольного доступа в переменную. Синтаксис: Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной |
||
| Seek |
Функция возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open. Синтаксис: Seek (НомерФайла) |
||
| LOF |
Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Оpen . Для определения размера закрытого файла следует использовать функции FileLen. Синтаксис: LOF (НомерФайла) |
||
| FileLen |
Возвращает значение типа Long, содержащее размер файла в байтах. Синтаксис: FileLen (Путь ) |
||
В противоположность файлам последовательного доступа, в файлах произвольного доступа запись является встроенным элементом. Файл произвольного доступа — это файл, упорядоченный по записям, что позволяет быстро переместиться на любую запись, минуя предыдущие.
При создании файла произвольного доступа указывается максимальная длина каждой записи. Само собой разумеется, что в любую запись можно вводить данные, занимающие не все место, выделенное для записи, но нельзя ввести данные, требующие больше места, чем допустимая длина записи. Лишняя информация будет просто усекаться.
На практике бывает удобно создавать отдельный файл, в котором хранится информация о структуре файла произвольного доступа: структура записи, ее длина и заголовки полей.
Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды 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 #НомерФайла, [СписокВывода] |
||
| Write |
Записывает неформатированные данные в файл последовательного доступа. В отличие от инструкции Print, инструкция write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Синтаксис: 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 содержит следующие элементы: |
||
| Функция Input |
Возвращает значение типа string, содержащее символы из файла, открытого в режиме input или Binary. Функция input считывает данные, записываемые в файл с помощью инструкции Print # или Put. Синтаксис: Input (Число, [#] НомерФайла) |
||
| ФУНКЦИЯ EOF |
Функция возвращает значение True при достижении конца файла. Синтаксис: EOF (НомерФайла} При последовательном считывании информации из файла часто используется следующий цикл: Do While Not EOF(l) Loop или, для тех пользователей, кто предпочитает инструкцию While - Wend инструкции Do While - Loop, следующий эквивалентный цикл: While Not EOF (I) Wend |
||
Туре Студенты
' Фамилия 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.
Пользовательские объекты
Пример создания класса
Пример создания классаРассмотрим пример создания класса Вектор, моделирующего двумерный вектор. У объектов класса вектор будут определены три свойства: координата абсциссы, координата ординаты и длина вектора (это свойство является свойством только для чтения). Кроме того, для объектов класса вектор будут определены два метода, первый из которых возвращает вектор, являющийся результатом покомпонентного произведения вектора на число, а второй — результат скалярного произведения двух векторов.
Итак, в модуле класса, у которого установлено свойство 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). При создании классов надо предусмотреть его инициализацию, описание свойств и методов, которыми будет наделен объект.
Опишем процесс создания класса в виде следующей последовательности шагов:
Что такое 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 JetMicrosoft 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 создается при помощи метода 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.
| 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) |
| Update |
Сохраняет вставки и изменения, произведенные в объекте Recordset При помощи методов AddNew и Edit |
| CancelUpdate |
Отменяет все изменения объекта Recordset, выполненные При помощи методов AddNew и Edit |
| 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 |
dbDriverNoPrompt, dbDriver Prompt, dbDrive r Complete, dbDriverCompleteRequired |
||
| Readonly |
Допустимые значения: True (база данных открывается только для чтения) и значение False (по умолчанию, база данных открывается как для чтения, так и для записи) |
||
| Connect |
Дополнительный аргумент, содержащий сведения о подключении, в том числе и пароли |
||
Например, для открытия базы данных с ядром Microsoft Jet можно использовать следующие две инструкции:
Dim БазаДанных As Database
Set БазаДанных = РабочаяОбласть
.OpenDatabase (Name:="C: \Пример.mdb",
Options:=True)
Порядок работы при объектном доступе к данным
Порядок работы при объектном доступе к даннымПри извлечении информации с помощью объектного доступа к данным надо:
Пример приложения
Пример приложенияРассмотрим работу с базой данных на примере следующего простого приложения, в котором используются все основные операции с записями. База данных находится в файле студенты.mdb, созданным в Access, и состоит из одной таблицы ПервыйКурс. В таблице имеются четыре поля: Фамилия, Группа, предмет и Оценка. При запуске приложения на экране отображается диалоговое окно Студенты первого курса.
РАБОТА С ВНЕШНИМИ БАЗАМИ ДАННЫХ
Глава 15.
Работа с внешними базами данных
База данных о студентах
Рисунок 15.1. База данных о студентах
Иерархия объектов DАО
Рисунок 15.10. Иерархия объектов DАО
Для возможности использования объектов доступа необходимо задать ссылку на библиотеку DАО 3.5. Для этого в редакторе VBA необходимо выбрать команду Сервис, Ссылки (Tools, References) и в появившемся диалоговом окне Ссылки (References) установить флажок напротив элемента Microsoft DAO 3.5 Object Library
Диалоговое окно Студенты первого курса
Рисунок 15.11. Диалоговое окно Студенты первого курса
Приводимая ниже программа:
' Переменные уровня модуля
'
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
Откроется диалоговое окно Создание запроса: выбор столбцов (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
Результат запроса
Рисунок 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) |
||
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
Часть II.
Практические приемы программирования на VBA
Практика
ПрактикаУ1 1 Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка
Рисунок У1.1. Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка
Конечно, редактор кода заботится о вас, создавая инструкции заголовка и окончания процедуры. Но не требуйте от него невозможного, а именно, чтобы он телепатически прочитал ваши мысли и ввел их в виде кода в тело процедуры. Код в тело процедуры кроме вас никто вводить не будет. Как это ни печально, но вы должны вводить их вручную, при этом используя интеллектуальные качества редактора кода и средства визуального программирования, которые существенно упростят процесс создания программы.
'
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 |
|
||
| Нажатие кнопки Отмена запускает на выполнение процедуру CommandButton2 Click |
Закрывает диалоговое окно. |
||
На экране появится диалоговое окно игры. Игрок вводит в поле Банк сумму денег, и потом, выбирая соответствующий переключатель в группе выбор, загадывает орел или Решка. Нажатие кнопки Бросание монеты приводит к подбрасыванию компьютером монеты. Текущий счет игрока отображается в поле Банк. В поле партия выводится номер текущей партии, а в полях максимум и минимум выводятся максимальный и минимальный счет игрока втечение предыдущих партий. На Рисунок У 1.3 приведено диалоговое окно орел-решка на 30-м ходе игры при начальном банке в 100 единиц. Отображаемая информация в диалоговом окне Орел-Решка показывает, что 30 партий изнурительной игры принесли игроку выигрыш только в 2 единицы. Если бы игрок не жадничал и остановил игру на 18 ходе, то его выигрыш был бы в два раза больше. А если бы игрок струсил, когда стал проигрывать, и вышел из игры на 3 ходе, то его проигрыш составил бы 3 единицы.
У1 2 Возможное сообщение о неправильном вводе данных в поле Банк
Рисунок У1.2. Возможное сообщение о неправильном вводе данных в поле Банк
У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 можно моделировать бросание игральной кости.
Цель урока
В уроке разрабатывается приложение, решающее задачу расчета маргинальной процентной ставки при постоянных выплатах в течение согласованного срока. Конструируя данное приложение, вы освоите:
Практика
Для решения задачи нахождения текущего объема вклада и нахождения маргинальной процентной ставки с помощью редактора пользовательских форм создадим Диалоговое окно Маргинальная процентная ставка (рис. У2.1).
Рис. У2.1. Диалоговое окно Маргинальная процентная ставка
Обсудим, как приведенная ниже программа решает перечисленные выше задачи и что происходит в программе.
| UserForm Initialize | |
| |
| ||
| Нажатие кнопки вычислить запускает на выполнение процедуру CommandButton1_Click | |
|
| | ||
| Нажатие кнопку отмена запускает на выполнение процедуру 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 включен, осталось решить данную задачу вручную на рабочем листе и посмотреть на записанный макрос.
Решите задачу в соответствии со следующим алгоритмом:
Перечисленные выше действия будут переведены 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 по следующему алгоритму:
Перечисленные выше действия будут переведены 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 1 Диалоговое окно Маргинальная процентная ставка
Рисунок У2.1. Диалоговое окно Маргинальная процентная ставка
Обсудим, как приведенная ниже программа решает перечисленные выше задачи и что происходит в программе.
| UserForm Initialize |
|
||
| Нажатие кнопки вычислить запускает на выполнение процедуру CommandButton1_Click |
|
||
| Нажатие кнопку отмена запускает на выполнение процедуру CommandButton2_Click |
Закрывает диалоговое окно. |
||
У2 2 Сообщение о некорректном вводе данных
Рисунок У2.2. Сообщение о некорректном вводе данных
У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 включен, осталось решить данную задачу вручную на рабочем листе и посмотреть на записанный макрос.
Решите задачу в соответствии со следующим алгоритмом:
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 по следующему алгоритму:
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.5) для реализации следующих задач:
Рис. У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.
Тема: Работа со списком
Самостоятельное задание
Интересной особенностью приводимой процедуры инициализации userForm_initiaiize является то, что заголовок диалогового окна вводится программно при помощи свойства Caption, а не вручную при помощи окна Свойства (Properties).Стоит также отметить небольшой недостаток этой программы, связанный с тем, что в ней не построен обработчик ошибок. Хотя на первый взгляд кажется, что в программе обработчик ошибок совсем не нужен, это не так. Ошибка может возникнуть, например при вычислениях, если выводимый в списке массив данных содержит как числа, так и строковые константы.
В качестве самостоятельного задания составьте программу нахождения среднего балла студентов, выбранных из списка в диалоговом окне Средний балл (рис. УЗ.2). Список заполните из данных, введенных из диапазона на рабочем листе с помощью свойства RowSource объекта ListBox. Фамилии студентов пусть будут расположены в столбце А, а их оценки в столбце в диапазона с данными о студентах. Создайте в программе обработчик ошибок, который будет проверять, являются ли данные из второго столбца списка с оценками студентов числами. Если хотя бы одно из этих данных не является числом, программа должна проинформировать об этом пользователя с просьбой исправить найденную некорректность. Обратите внимание также на то, чтобы в диалоговом окне средний балл надписи на кнопках ок и Отмена для большей презентабельности были выведены полужирным шрифтом увеличенного размера.
Рис. УЗ.2. Диалоговое окно Средний балл
Цель урока
В уроке разрабатывается приложение, решающее задачу расчета амортизации в зависимости от выбранного метода: стандартного или А;-кратного учета амортизации. На примере данного приложения вы узнаете, что такое:
ПХЯ У4 1 Диалоговое окно Расчет амортизации
пХЯ. У4.1. Диалоговое окно Расчет амортизации
Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.
| UserForm Initialize |
|
||
ПХЯ У4 2 Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета
пХЯ. У4.2. Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета
| SpinButton1_ Change |
Изменяет значение счетчика, которое вводится в i поле Кратность метода . |
||
| OptionButton2_Click |
Отображает в диалоговом окне надпись кратность ; метода и соответствующие ей поле и счетчик. |
||
| OptionButton2_Click |
Скрывает в диалоговом окне надпись кратность метода и соответствующие ей поле и счетчик. |
||
| Нажатие кнопки вычислить запускает на выполнение процедуру CoramandButton1_Click |
|
||
ПХЯ У4 3 Сообщения о несогласованности вводимых данных
пХЯ. У4.3. Сообщения о несогласованности вводимых данных
ПХЯ У4 4 Отчет выводимый на рабочем листе программой расчета амортизации
пХЯ. У4.4. Отчет, выводимый на рабочем листе программой расчета амортизации
| Нажатие кнопки отмена запускает на выполнение процедуру CommandButton2_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" '
' Функция кнопки Отмена выполняется по нажатию клавиш
' или на русской клавиатуре
CommandButton2.Accelerator = "J"
UserForml.Show
'
End Sub
При написании программ с внедренными графическими объектами лучше всего воспользоваться средством MacroRecorder.
Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Выполните построение объекта WordArt по следующему алгоритму:
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.6).
Рисунок У4.6. Диалоговое окно Значение или график при выборе переключателя График
Практика
Для решения задачи нахождения вычисления амортизации оборудования по стандартному методу или методу к-кратного учета с помощью редактора пользовательских форм создадим диалоговое окно Расчет амортизации (рис. У4.1).
Рис. У4.1. Диалоговое окно Расчет амортизации
Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.
| UserForm Initialize | Устанавливает для счетчика минимальное значение, равное 2, и шаг изменения значений счетчика, также равный 2, для убыстрения прокрутки ; счетчика. Промежуточные значения вводятся в i поле Кратность метода не с помощью счетчика, i а посредством клавиатуры.
| |
| ||
Рис. У4.2. Диалоговое окно Расчет амортизации при выбранном переключателе Метод k кратного учета
| SpinButton1_ Change | Изменяет значение счетчика, которое вводится в i поле Кратность метода . | ||||
| OptionButton2_Click | Отображает в диалоговом окне надпись кратность ; метода и соответствующие ей поле и счетчик. | ||||
| OptionButton2_Click | Скрывает в диалоговом окне надпись кратность метода и соответствующие ей поле и счетчик. | ||||
| Нажатие кнопки вычислить запускает на выполнение процедуру CoramandButton1_Click | Удаляет с рабочего листа все ранее созданные графические объекты и внедряет объект WordArt. Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (рис. У 4. 4).
| |
| ||
а)
б)Рис. У4.3. Сообщения о несогласованности вводимых данных
Рис. У4.4. Отчет, выводимый на рабочем листе программой расчета амортизации
Нажатие кнопки отмена запускает на выполнение процедуру CommandButton2_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" '
' Функция кнопки Отмена выполняется по нажатию клавиш
' или на русской клавиатуре
CommandButton2.Accelerator = "J"
UserForml.Show
'
End Sub
При написании программ с внедренными графическими объектами лучше всего воспользоваться средством MacroRecorder.
Итак, для активизации MacroRecorder выберите команду Сервис, Макрос, Начать запись (Tools, Macro, Record New Macro) и запустите MacroRecorder на запись. После задания всех параметров в появившемся диалоговом окне Запись макроса (Record Macro) и нажатия кнопки ОК появится плавающая панель инструментов с кнопкой Остановить запись (Stop Recording). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Выполните построение объекта 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.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, ...) - запускает макрос Расчет Вызывает перевычисление функции пользователя при изменении значений параметров. Например, функция Квадрат будет автоматически пересчитывать результат на рабочем листе при изменении значения аргумента: Function Квадрат (х) Application . Volatile Квадрат = х^2 End Function Временно приостанавливает работу приложения без остановки работы других программ. Синтаксис: Wait (Time) Application. Wait "17:00:00" Устанавливает выполнение специфицированной процедуры при нажатии заданной комбинации клавиш. Синтаксис: OnKey(Key, Procedure) |
||
| Методы |
Выполняемые действия |
||
| OnRepeat и OnUndo |
Application. OnKey "^{+}", "Амортизация" Application. ОпКеу "+^ {RIGHT}", "ПроцентнаяСтавка" Определяет процедуру, выполняемую при выборе команды Правка, Повторить (Edit, Repeat) и Правка, Отменить (Edit, Undo) соответственно. |
||
| Методы |
Выполняемые действия |
||
| OnTime Quit |
Синтаксис: OnRepeat (Text, Procedure) OnUndo (Text, Procedure) Назначает выполнение процедуры на определенное время. Синтаксис: OnTime (EarliestTime, Procedure, LatestTime, Schedule) Application. OnTime Now +_ TimeValue ("00:00:15"), "Очистка" Закрывает приложение. Например: Application. Quit |
||
Методы объекта Workbook и семейства Workbooks
Методы объекта Workbook и семейства Workbooks| Методы |
Выполняемые действия |
||
| Activate | Активизирует рабочую книгу так, что ее первый рабочий лист становится активным. Например: Workbook. Activate |
||
| Add | Создает новый объект для семейства Workbooks. Синтаксис: Add (Template) SheetsInNewWorkbook |
||
| Protect | Защищает рабочую книгу от внесения в нее изменений. Синтаксис: Protect (Password, Structure, Windows) ActiveWorkbook. Protect Password:= "ВинниПух" |
||
| Unprotect |
Снятие защиты с рабочей книги. Синтаксис: Unprotect (Password) ActiveWorkbook. Unprotect Password := "ВинниПух " |
||
| Close |
Закрытие рабочей книги |
||
| Open |
Открытие существующей рабочей книги |
||
| OpenText |
Открытие текстового файла, содержащего таблицу данных |
||
| Save |
Сохранение рабочей книги |
||
| SaveAs |
Сохранение рабочей книги в другом файле. Синтаксис: SaveAs (Filename) ActiveBook. SaveAs Filename := "НоваяВерсия" |
||
| SaveAsCopy |
Сохранить рабочую книгу в другом файле, оставляя рабочую книгу в памяти с прежним именем. Синтаксис: SaveAs (Filename, FileFormat) ActiveBook. SaveAsCopy Filename := "ЗапаснаяВерсия" |
||
| PrintPreview |
Предварительный просмотр |
||
| Printout |
Печать содержимого рабочей книги |
||
| SendMail |
Отсылка почты используя встроенные средства Microsoft Mail (MAPI). Синтаксис: SendMail (Recipients, Subject, ReturnReceipt ) Optional Variant. 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 (Аргументы) |
Нахождение суммы значений из ячеек диапазона |
||
Объект 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| Событие | Когда возникает событие |
| NewWorkbook | При создании новой рабочей книги |
| WorkbookActivate | При активизации рабочей книги |
| WorkbookBeforeClose | Перед закрытием рабочей книги |
| WorkbookBeforePrint | Перед печатью рабочей книги |
| WorkbookBeforeSave | Перед сохранением рабочей книги |
| WorkbookNewSheet | При добавлении нового листа в рабочую книгу |
| WorkbookOpen | При открытии рабочей книги |
| WorkbookDeactivate | Когда активная книга теряет фокус |
В иерархии 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 | Когда рабочий лист теряет фокус |
В иерархии Excel объект worksheet идет сразу после объекта workbook и представляет рабочий лист.
Приведем несколько наиболее часто используемых свойств и методов объекта Worksheet.
События объекта Worksheet Событие
События объекта Worksheet| Событие | Когда возникает событие |
| BeforeClose | При закрытии рабочей книги |
| BeforePrint | Перед печатью рабочей книги |
| BeforeSave | Перед сохранением рабочей книги |
| Deactivate | Когда рабочая книга теряет фокус |
| NewSheet | При добавлении нового листа |
| Open | При открытии рабочей книги |
| SheetActivate | При активизации любого рабочего листа |
| Sheet Deactivate | Когда рабочий лист теряет фокус |
В иерархии 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) .AddComment .Text Text:= "Чрезвычайно важно!" & Chr(10) & "Про это никак нельзя забыть ! " .Visible = True End With |
||

Рисунок 2.1. Пример отображения примечания на рабочем листе
| Font |
Возвращает объект Font (шрифт). Объект Font имеет следующие свойства: |
||
| |
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. В отличие от обыкновенной формулы рабочего листа, формула диапазона вводится на рабочем листе не посредством нажатия на клавишу 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 |
Горизонтальное выравнивание. Допустимые значения: |
||
| Vertical Alignment |
Вертикальное выравнивание. Допустимые значения: |
||
| Orientation |
Ориентация. Допускается либо угол поворота текста в градусах от —90° до 90°, либо одно из допустимых значений: |
||
| ShrinkToFit |
Допустимые значения: True (автоматическое изменение шрифта так, чтобы текст помещался в ячейку) и False (в противном случае) |
||
| Address |
Возвращает адрес ячейки. Синтаксис: Address (rowAbsolute, coluimAbsolute, referenceStyle, external, relativeTo) Аргументы: 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) |
||
| Cut |
Копирует диапазон с удалением в указанный диапазон или в буфер обмена, Синтаксис: Cut (destination) |
||
| 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 ) Аргументы: |
||
| Select |
Выделение диапазона |
||
| PasteSpecial |
Специальная вставка из буфера обмена. Синтаксис: BasteSpecial (paste, operation, skipBlanks, transpose) Аргументы: Worksheets ( "Лист1 " ) . Range ( "С1 : С5 " ) . Сору Worksheets ("Лист1") .Range ("D1: D5") . PasteSpecial operation : =xlAdd Метод PasteSpecial программирует выполнение на рабочем листе команды Правка, Специальная вставка (Edit, Paste Special). Аргументы метода PasteSpecial соответствуют установкам диалогового окна Специальная вставка (Paste Special), отображаемого с помощью этой команды (Рисунок 3.2) |

Рисунок 2.2. Диалоговое окно Специальная вставка
| AddComment |
Добавляет примечание к диапазону. Синтаксис: AddComment (Text) |
||
Свойства объекта 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 |
Возвращает имя инсталлированных на компьютере средств работы с электронной почтой. Допустимые значения: If Application. MailSystem <> xlMAPI Then MsgBox "Microsoft Mail неинсталлирован" End If |
||
Свойства объекта Worksheet и семейства Worksheets
Свойства объекта Worksheet и семейства Worksheets| Методы |
Выполняемые действия |
||
| Name | Возвращает имя рабочего листа. В следующем примере первому листу активной рабочей книги присваивается имя Итоги за декабрь : Worksheets (1) . Visible = "Итоги за декабрь" |
||
| Add |
Создает новый рабочий лист. Синтаксис: Add (Before, After, Count, Type) Например: ActiveWorkbook . Worksheets . Add — вставляется новый лист перед активным листом активной рабочей книги |
||
| Delete |
Удаляет рабочий лист. Например: Worksheets (1) . Delete - удаляется первый рабочий лист из активной рабочей книги |
||
| |
Защищает рабочий лист от внесения в него изменений Синтаксис: Protect (Password, DrawingObjects, Contents, Scenarios, User Inter faceOnly) |
||
| |
Active Sheet .Protect Password: =" Секрет" , DrawingObjects :=True, Contents :=True, Scenarios : =True |
||
| Unprotect |
Снятие защиты с рабочего листа. Синтаксис: Unprotect (Password) ActiveSheet . Protect Password: ="Секрет" |
||
| Copy |
Копирование рабочего листа в другое место рабочей книги. Синтаксис: Copy (Before, . After) В следующем примере Лист1 активной рабочей книги копируется после ЛистЗ той же рабочей книги: Worksheets ( "Лист1") .Сору after :=Worksheets ("ЛистЗ"') |
||
| Move |
Перемещение рабочего листа в другое место рабочей книги. Синтаксис: Move (Before, After) В примере Лист1 активной рабочей книги перемещается перед ЛистЗ той же рабочей книги: Worksheets ( "Лист1" ) .Move Before : =Worksheets ("Лист3") |
||
Задание групп строк и столбцов с помощью объекта Range
Задание групп строк и столбцов с помощью объекта RangeЕсли в диапазоне указываются только имена столбцов или строк, то объект Range задает диапазон, состоящий из указанных столбцов или строк. Например, Range ("А: с") задает диапазон, состоящий из столбцов А, в и с, а Range {"2: 2") - из второй строки. Другим способом работы со строками и столбцами являются методы ROWS (строки) и Columns (столбцы), возвращающие коллекции строк и столбцов. Например, столбцом А является columns (1), а второй строкой - ROWS (2).
Цель урока
В уроке разрабатывается приложение, позволяющее находить корни уравнения в зависимости от параметра, а также строить диаграмму, демонстрирующую зависимость корня от параметра. Конструируя данное приложение, вы научитесь:
ПХЯ У5 1 Диалоговое окно Нелинейное уравнение с параметром
пХЯ. У5.1. Диалоговое окно Нелинейное уравнение с параметром
О решаемом уравнении предполагается, что оно преобразовано к виду, когда только левая часть зависит от неизвестной и параметра. Правая же часть -постоянна. При вводе левой части уравнения в поле ввода элемента управления RefEdit вместо переменной х надо давать ссылку на ячейку В2, а вместо параметра — А2. Кроме того, формула должна быть составлена по тем же правилам, по которым пишутся формулы рабочего листа. Например, для упомянутого выше уравнения в поле надо ввести:
=В2^3-В2-А2
либо эквивалентную формулу с абсолютными ссылками на ячейки.
Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.
| UserForm_Initialize |
|
||
| Нажатие кнопки вычислить запускает на выполнение процедуру CommandButtonl_Click |
|
||
| Нажатие кнопки отмена запускает на выполнение процедуру CommandButton2 _Click |
11 . Закрывает диалоговое окно. |
||
| Процедура ПостроениеГрафика |
12. Строит график. |
||
ПХЯ У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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте диаграмму по следующему алгоритму:
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 | | ||||
| Нажатие кнопки отмена запускает на выполнение процедуру 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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте диаграмму по следующему алгоритму:
Перечисленные выше действия будут переведены 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.3), которое позволит:
Рис. У5.3. Диалоговое окно Уравнение с двумя параметрами
Теория
В этом разделе решается уравнение
х3 - х - b = 0
при различных величинах параметра Ь, изменяющихся от начального до конечного значения с указанным шагом. При каждом конкретном значении параметра корень уравнения находится методом Goaiseek. Для нахождения корней уравнения при различных значениях параметра, эти значения вводятся в диапазон ячеек рабочего листа, формулы левых частей уравнений в другой диапазон, третий диапазон отводится под неизвестную. В диапазон с неизвестными вводятся начальные приближения корня, а потом последовательно перебирая соответствующие ячейки из этих трех диапазонов методом GoalSeek находятся соответствующие корни.
Цель урока
В уроке разрабатывается приложение, позволяющее управлять размерами диалогового окна и вычислять текущий объем вклада при равномерных выплатах и постоянной процентной ставке. Конструируя данное приложение, вы узнаете, как:
Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно и при помощи метода drag-and-drop по поверхности диалогового окна.
Перемещение элемента управления при помощи операции draganddrop
Перемещение элемента управления при помощи операции drag-and-drop
Рассмотрим диалоговое окно новые похождения колобка (Рисунок У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
Тема: Управление размером и перемещением элементов управления
Цель урока
В этом уроке разрабатывается приложение, позволяющее при помощи диалогового окна заполнять базу данных. Конструируя данное приложение, вы сможете освоить следующие операции:
Практика
Для заполнения базы данных на рабочем листе с помощью редактора пользовательских форм создадим диалоговое окно Регистрация туристов фирмы "Эх, прокачу!" (рис. У7.1).
Рис. У7.1. Диалоговое окно Регистрация туристов фирмы "Эх, прокачу!"

Рис. У7.2. База данных о туристах на рабочем листе
Рис. У7.3. Пояснительное текстовое поле, появляющееся при выборе переключателя О программе
При инициализации диалогового окна программа проверяет, есть ли заголовки у полей создаваемой базы данных о регистрации туристов. Если этих заголовков нет, то программа автоматически создает их, снабжая примечаниями, имеющими пояснительный текст о содержании полей (рис. У7.2). Выбор переключателя о программе приведет к отображению на экране текстового поля с пояснениями к данной программе. Снятие этого флажка удаляет данное поле (рис. У7.3). Обратите внимание, что у окна приложения пользовательское имя Регистрация. База данных туристов.
Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.
| UserForm Initialize | Устанавливает текст заголовка окна приложения.
| |
| ||
| Нажатие кнопки вычислить запускает на выполнение процедуру CommandButton1_Click | Вводит их в первую пустую строку.
| |
| ||
| Нажатие кнопки Отмена запускает на выполнение процедуру CommandButton2_Click | Закрывает диалоговое окно. Устанавливает заголовок приложения, используемый по умолчанию, т. е. удаляет пользовательский заголовок приложения, созданный при активизации формы. | ||||
| SpinButtonl_Change | Вводит значение в поле продолжительность тура. | ||||
ToggleButtonl 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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте примечания по следующему алгоритму. Кроме того, для того чтобы разобраться, как программируется закрепление области на рабочем листе, в этот алгоритм входит также и закрепление первой строки рабочего листа.
Перечисленные выше действия будут переведены 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). Теперь все производимые действия будут записываться до тех пор, пока не будет нажата эта кнопка. Постройте текстовое поле по алгоритму:
Программа составлена Андреем Гарнаевым для регистрации клиентов туристической фирмы.
Перечисленные выше действия будут переведены 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), в котором:
Рис. У7.4. Диалоговое окно Регистрация клиентов отеля "Хромая кобыла"
ЗАПОЛНЕНИЕ БАЗЫ ДАННЫХ
Урок 7.
Тема: Заполнение базы данных
Цель урока
В данном уроке разрабатывается приложение, которое позволяет по введенному уравнению, начальным и конечным значениям аргументов, а также по шагам их изменения построить поверхность. Кроме того, используя полосы прокрутки можно изменить ориентацию пространственного местоположения поверхности. В процессе создания данного приложения вы узнаете, как:
ПОСТРОЕНИЕ ПОВЕРХНОСТИ
Урок 8.
Тема: Построение поверхности
Практика
В данном приложении строится поверхность по введенным в диалоговое окно построение поверхности (рис. У8.1) начальным, конечным значениям аргументов и их шагах изменения. Уравнение поверхности также вводится в программу из диалогового окна. Уравнение должно быть составлено в соответствии с правилами, по которым строятся функции рабочего листа, но в качестве аргументов в нем следует использовать х и у вместо ссылок на ячейки. Программа сама переведет эти аргументы в ссылки на ячейки. После табуляции введенной функции программой и построения поверхности на рабочем листе (рис. У8.2), эта поверхность также отображается в объекте управления image, расположенном в диалоговом окне построение поверхности (рис. У8.3). Управляя полосами прокрутки можно изменить ориентацию поверхности на рабочем листе.
Рис. У8.1. Диалоговое окно Построение поверхности
Рис. У8.2. Результат построения поверхности на рабочем листе
Рис. У8.3. Диалоговое окно Построение поверхности с рисунком построенной поверхности
Обсудим, как приведенная ниже программа решает описанную задачу и что происходит в ней.
| UserForm_Initialize | Устанавливает, чтобы отображаемая картинка поверхности в диалоговом окне помещалась целиком и пропорционально в пределах элемента управления Image, а также чтобы левый верхний угол рисунка совпадал с левым верхним углом элемента управления Image.
| |
| ||
| Нажатие кнопки Построение запускает на выполнение процедуру CornmandButton1_Click | Изменяет ориентацию надписи оси 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. Диапазон с данными и результат построения объемного графика на рабочем листе
Цель урока
В разрабатываемом в данном уроке приложении решается задача нахождения размера постоянных платежей по выданной в долг сумме на фиксированный срок под фиксированные проценты. Приложение рассчитывает размер выплат для различных процентных ставок, изменяющихся от начальной до конечной величины с указанным шагом. Кроме того, приложение строит диаграмму, показывающую зависимость величины выплат от процентной ставки.
ПЕРИОДИЧЕСКИЕ ВЫПЛАТЫ
ПОСТРОЕНИЕ ДИАГРАММ
Урок 9.
Тема: Периодические выплаты. Построение диаграмм
Практика
В данном приложении решается задача нахождения размера постоянных платежей по выданной в долг сумме на фиксированный срок под фиксированные проценты. Приложение рассчитывает размер выплат для различных процентных ставок, изменяющихся от начальной до конечной с указанным шагом.
Рис. У9.1. Диалоговое окно Периодических выплат
Кроме того, приложение строит диаграмму, показывающую зависимость величины выплат от процентной ставки. Тип диаграммы можно задать, выбирая переключатель из группы диаграмма диалогового окна Периодических выплат (рис. У9.1). Результат табуляции зависимости размера выплат от процентной ставки выводится в элемент управления ListBox диалогового окна и на рабочий лист (рис. У9.2).
Рис. У9.2. Отчет, создаваемый приложением на рабочем листе
Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.
| UserForm Initialize | Устанавливает изначально переключатель гистограмма. Проверяет наличие на диске файла, отображаемого в элементе управления image при данном выборе переключателя. Если такого файла нет, то информирует об этом пользователя, но тем не менее программа продолжает свою работу без загрузки отсутствующего файла. Если файл есть, изображение, содержащееся в этом файле, выводится в элементе управления image.
| |
| ||
| Нажатие кнопки Вычислить запускает на выполнение процедуру CommandButtonl_Click | В соответствии с установленным переключателем из группы диаграмма при помощи процедуры график строится выбранная диаграмма.
| |
| ||

Рис. У9.3. Пример сообщения о несогласованности данных
OptionButton1_Click, OptionButton2_Click и OptionButton3_Click |
Выбирает переключатель гистограмма, график или Круговая группы Диаграмма. Проверяет наличие на диске файла, отображаемого в элементе управления image при данном выборе переключателя. Если такого файла нет, то информирует об этом пользователя, и программа продолжает свою работу без загрузки отсутствующего файла. Если файл имеется, то изображение, содержащееся в этом файле, выводится в элементе управления Image . |
||
График |
Удаляет с рабочего листа все ранее построенные диаграммы. Строит диаграмму на рабочем листе. Аргументами процедуры являются ТипГрафика и его Формат. |
||
' Процедура вычисления выплат по ссуде
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
При разработке данного приложения может возникнуть только одно затруднение: Откуда взять подходящие картинки, отображаемые в группе диаграмма диалогового окна Периодических выплат?
Но, к счастью, это только кажущаяся, можно сказать виртуальная, загвоздка. Эти картинки присутствуют в диалоговом окне первого шага мастера диаграмм. Таким образом, задача сводится к простому экстрагированию их оттуда. Для этого достаточно:
Самостоятельное задание
Построить приложение с диалоговым окном диаграмма (рис. У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 3 Диалоговое окно Регистрация туристов фирмы "С нами не соскучишься"
пХЯ. У 10.3. Диалоговое окно Регистрация туристов фирмы "С нами не соскучишься"
ПХЯ У10 1 Рабочий лист БазаДанных
пХЯ. У10.1. Рабочий лист БазаДанных
ПХЯ У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.3) |
Для заполнения рабочего листа БазаДан-ных |
UserForm1 |
||
| Поиск (Рисунок У10.4) |
Производит поиск клиента по фамилии. В фамилии клиента допустимо использовать символ <*> вместо группы любых символов, символ > вместо любого одного символа. В результате поиска, в случае отсутствия подходящих клиентов выдается соответствующее сообщение. Если подходящие клиенты найдены, в раскрывающемся списке выводится список их фамилий и имен. Выбрав требуемого клиента и нажав кнопку Редактировать, пользователь переходит к этапу редактирования информации о клиенте |
UserForm3 |
||
| Перерегистрация туристов фирмы "С нами не соскучишься" (Рисунок У1 0.5) |
В него загружается информация о найденном клиенте. Допустимо любое редактирование информации с последующей заменой старой информации о клиенте на новую в базе данных. Также возможна запись информации в архив и ее удаление из базы данных. |
UserForm2 |
||
| Фильтрация (Рисунок У10.6) |
В зависимости от выбранного переключателя отображает только оплаченные или только не оплаченные путевки. |
UserForm4 |
||
ПХЯ У10 4 Диалоговое окно Поиск
пХЯ. У10.4. Диалоговое окно Поиск
ПХЯ У10 5 Диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься"
пХЯ. У10.5. Диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься"
ПХЯ У10 6 Диалоговое окно Фильтрация
пХЯ. У10.6. Диалоговое окно Фильтрация
Перейдем к рассмотрению кнопок панели инструментов пользовательского меню.
| Кнопка |
Назначение |
||
| Регистрация |
Активизирует диалоговое окно Регистрация туристов фирмы "С нами не соскучишься" |
||
| Поиск и редактирование |
Активизирует диалоговое окно Поиск |
||
| Фильтр и его отмена |
Создает в заголовках полей базы данных раскрывающиеся списки со средствами фильтрации данных. Повторное нажатие на кнопку удаляет эти списки |
||
| Фильтрация оплаченных путевок |
Активизирует диалоговое окно Фильтрация |
||
| Сортировка |
Сортирует данные в алфавитном порядке по направлениям туров |
||
| Сводная -таблица |
Создает на отдельном рабочем листе сводную таблицу, в которой подсчитывает суммарную продолжительность оплаченных и неоплаченных путевок по каждому из направлений туров |
||
| b |
Сохраняет данные по принципу команды Сохранить (Save) |
||
| я |
Сохраняет данные по принципу команды Сохранить как (Save as) |
||
Перейдем теперь к тексту программы. В своей структуре она имеет несколько модулей. Проанализируем работу этой программы, последовательно обсудив каждый из ее модулей.
| Модуль Модуль 1 |
Описываются переменные уровня проекта. |
||
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 по умолчанию. |
||
'
' Процедура создания новой панели инструментов и новое меню при
' открытии рабочей книги
'
' При открытии рабочей книги панели инструментов Форматирование
' и Стандартная скрываются и отображается новый заголовок окна приложения
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. Сообщение о неудачном поиске клиента
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 |
|
||
'
' Процедура записи на рабочий лист Архив
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 |
|
||
' Процедура фильтрации по критерию
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.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 |
Описываются переменные уровня проекта. |
||
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 |
возвращающее диапазон с данными сводной таблицы, что позволяет избежать необходимости явного описания диапазона, по которому строится диаграмма. Процедура закрыть закрывает приложение. |
||

Рис. У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) и обеспечивает ввод набранных в нем данных в рабочий лист БазаДанных. Нажатие кнопки Отмена активизирует процедуру 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). Нажатие кнопки отмена активизирует процедуру 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 |
Нажатие кнопки отмена активизирует процедуру ConmandButton2_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 |
Нажатие кнопки Отмена активизирует процедуру 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 PivotTableDim Диапазон 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("СводнаяТаблица").DeleteEnd 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 |
возвращающее диапазон с данными сводной таблицы, что позволяет избежать необходимости явного описания диапазона, по которому строится диаграмма. |
||
РЮАКХЖЮ '
рЮАКХЖЮ '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) и обеспечивает ввод набранных в нем данных в рабочий лист БазаДанных. |
||
' В переменную НомерСтроки вводится номер первой пустой строки
' рабочего листа БазаДанных
НомерСтроки = 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). |
||
РЮАКХЖЮ"
рЮАКХЖЮ"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.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.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. Пример сообщения о результате игры
' Переменные уровня модуля
'
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. Диалоговое окно Крестики — Нолики
Цель урока
В данном уроке разрабатывается приложение с многостраничным диалоговом окном, в котором по вводимым данным строится линия тренда и определяются ее коэффициенты. Линия тренда находится как в случае однократного, так и многократного наблюдения событий.
Конструируя данное приложение, вы освоите на практике:
ЛИНИЯ ТРЕНДА
Урок 12.
Тема: Линия тренда
Практика
В редакторе форм создадим диалоговое окно линейная регрессия (рис. У12.1). Это окно состоит из двух вкладок тренд и параметры (рис. У12.2).
Рис. У12.1. Вкладка Тренд диалогового окна Линейная регрессия
Рис. У12.2. Вкладка Параметры диалогового окна Линейная регрессия
Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.
| UserForm Initialize | В начальном состоянии выбран переключатель Без повторений, что обеспечивает скрытие надписи повторения соответствующим полем.
| |
| ||
| Нажатие кнопки ок запускает на выполнение процедуру CommandButtonl Click | При выборе переключателя с повторениями производит расчет по процедуре трендсповто-рениями (вторая задача), а при выборе переключателя Без повторений - по процедуре Обыч-ныйтренд (первая задача). | ||||
| Нажатие кнопки выход запускает на выполнение процедуру CommandButton2 Click | Закрывает диалоговое окно. | ||||
| OptionButton1_Click и OptionButton2_Click | Обеспечивает скрытие и отображение в диалоговом окне надписи повторения и соответствующего поля. | ||||
| ОбычныйТренд | | ||||

Рис. У 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 2 Вкладка Параметры диалогового окна Линейная регрессия
Рисунок У12.2. Вкладка Параметры диалогового окна Линейная регрессия
Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.
| UserForm Initialize |
|
||
| Нажатие кнопки ок запускает на выполнение процедуру CommandButtonl Click |
При выборе переключателя с повторениями производит расчет по процедуре трендсповто-рениями (вторая задача), а при выборе переключателя Без повторений - по процедуре Обыч-ныйтренд (первая задача). |
||
| Нажатие кнопки выход запускает на выполнение процедуру CommandButton2 Click |
Закрывает диалоговое окно. |
||
| OptionButton1_Click и OptionButton2_Click |
Обеспечивает скрытие и отображение в диалоговом окне надписи повторения и соответствующего поля. |
||
| ОбычныйТренд |
|
||
У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 |
||
Функция НАКЛОН определяет коэффициент наклона линейного тренда, а функция ОТРЕЗОК определяет точку пересечения линии линейного тренда с осью ординат.
Синтаксис:
НАКЛОН(известные_значения_у; известные_значения_х) ОТРЕЗОК(известные_значения_х; известные_значения_у) КОРРЕЛ(известные_значения_х; известные_значения_у)
Аргументы:
| известные значения у |
Массив известных значений зависимой наблюдаемой величины |
||
| известные значения х |
Массив известных значений независимой наблюдаемой величины. Если аргумент известные значения х опущен, то предполагается, что этот массив {1; 2; 3; ...} такого же размера, как и известные значения у |
||
Температура и объемы
Таблица 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; ...} такого же размера, как и известные значения у |
||
Таблица 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 |
Цель урока
В данном уроке разрабатывается приложение, автоматизирующее составление расписания с одновременным подведением итогов.
Конструируя данное приложение, вы узнаете на практике, что такое:
Практика
Трус, Балбес и Бывалый построили небольшой магазинчик "Придорожный лопух, 24 часа" у деревне Неелово на трассе Москва—Санкт-Петербург. Работу в магазинчике они разбили на две смены по 12 часов. В начале очередной недели они вместе составляют график своего дежурства на неделю, в котором подсчитывается число рабочих смен каждого компаньона. Через месяц они решили автоматизировать процесс создания расписания. С этой целью они разработали приложение, процесс создания которого обсуждается ниже.
В редакторе форм создадим диалоговое окно магазин придорожный лопух, 24 часа (рис. У13.1).
Кроме этого, в любом графическом редакторе, например Paint, создадим файл ball.bmp с изображением красного шара и фоном рисунка того же цвета, что и цвет диалогового окна.
Расписание составляется очень просто:
Рис. У13.1. Диалоговое окно Магазин Придорожный лопух, 24 часа
Рис. У13.2. Заполнение диалогового окна
Магазин Придорожный лопух, 24 часа
Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.
| UserForm Initialize | Устанавливает тип границы и цвет фона надписей.
| |
| ||
| Нажатие кнопки ок запускает на выполнение процедуру 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 2 Заполнение диалогового окна
Рисунок У13.2. Заполнение диалогового окна
Магазин Придорожный лопух, 24 часа
| UserForm Initialize |
|
||
| Нажатие кнопки ок запускает на выполнение процедуру 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.
Тема: Составление расписания
Цель урока
В данном уроке рассматриваются примеры работы с файлами последовательного и прямого доступа.
Конструируя данное приложение, вы на практике узнаете, как осуществить:
Файл последовательного доступа
Файл последовательного доступаПри последовательном доступе файл рассматривается как последовательность строк произвольной длины, разделенных специальными знаками. Чтение из файла и запись в файл производится построчно.
Приведенная ниже программа является примером создания простейшего текстового редактора, в который можно загрузить из файла уже существующий текст, отредактировать его и записать измененный текст в файл. Имя открываемого файла вводится в переменную имяФайла. Свободный номер для файла получается при помощи функции FreeFile и записывается в переменную Номер.
Итак, в редакторе форм создадим диалоговое окно Файл последовательного доступа (Рисунок У 14.1).
Файл произвольного доступа
Файл произвольного доступа
При последовательном доступе файл рассматривается как последовательность строк фиксированной длины, причем при открытии указывается длина строки. Благодаря этому становится возможным переход на любую запись по ее номеру.
Практика
ПрактикаРАБОТА С ФАЙЛАМИ
Урок 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 (расширенный фильтр) является более мощным и универсальным средством фильтрации, чем метод AutoFilter. Он позволяет использовать фильтрацию по большему числу критериев, причем допустимо применение критериев, включающих формулы. Кроме того, метод AdvancedFilter позволяет фильтровать список с выводом результата фильтрации как непосредственно на том месте, где он расположен, так и в новое специфицированное место. Вручную метод запускается посредством выбора команды Данные, Фильтр, Расширенный фильтр (Data, Filter, Advanced Filter).
Синтаксис:
Объект.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)
Аргументы:
| Action |
Допустимые значения:: xiFilterinPiace (фильтровать список на месте) и xiFiiterCopy (скопировать результат на новое место) |
||
| CriteriaRange |
Ссылка на диапазон с критериями |
||
| CopyToRange |
Если параметр Action принимает значение xiFiiter-сору, то он указывает диапазон, куда будет копироваться результат фильтрации |
||
| Unique |
Допустимые значения True (отбирается только один вариант записи из многократно встречающихся в списке) и False (отбираются все встречающиеся записи) |
||
| Шаг 1 |
Выделяем диапазон AI : G13, содержащий фильтруемую базу данных. (Рисунок 3.8). Прежде чем выбирать команду Данные, Фильтр, Расширенный фильтр (Data, Filter, Advanced Filter), необходимовыполнить предварительные построения по созданию диапазона критериев. Верхняя строка диапазона критериев должна содержать заголовки полей фильтруемых данных. При этом нет необходимости включать все заголовки и сохранять их порядок. В диапазон критериев также должны входить строки с условиями фильтрации. Все условия в диапазоне критериев, записанные под заголовком поля, относятся к этому полю. При применении расширенного фильтра допустима запись нескольких условий в строке диапазона критериев. Условия, расположенные в одной строке, рассматриваются как условия, объединенные логической операцией и (And) , а расположенные в нескольких — логической операцией или (Or) В данном случае под диапазон критериев отведем диапазон A16:G17. В базе данных выберем записи обо всех мужчинах, которые едут в Лондон. С этой целью в ячейку С17 диапазона критериев введем значение муж, а в ячейку D17— Лондон. |
||
Метод AutoFill
Метод AutoFill
Метод AutoFill (автозаполнение) автоматически заполняет ячейки диапазона элементами последовательности. Метод AutoFill отличается от метода DataSeries тем, что явно указывается диапазон, в котором будет располагаться прогрессия. Вручную этот метод эквивалентен расположению указателя мыши на маркере заполнения выделенного диапазона (в который введены значения, порождающие создаваемую последовательность) и протаскивании маркера заполнения вдоль диапазона, в котором будет располагаться создаваемая последовательность.
Синтаксис:
Объект.AutoFill(destination, type)
Аргументы:
| Объект |
Диапазон, с которого начинается заполнение |
||
| destination |
Диапазон, который заполняется |
||
| type |
Допустимые значения: xiFiilDefauit, xlFillSeries, xlFillCopy, xlFillFormats, xlFillValues, xlFillDays, xlFillWeekdays, xlFillMonths, xlFillYears, xlLinearTrend, xlGrowthTrend. По умолчанию xlFillDefault |
||
| Шаг 1 |
В ячейку AI введите первый член профессии, например 5. В ячейку А2 введите второй член профессии, например 7. Выделите диапазон А1:А2, содержащий два первых члена арифметической профессии. Расположите указатель мыши над маркером заполнения выделенного диапазона так, чтобы он превратился в черный крест (Рисунок 3.3). |
||
Метод 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 |
Допустимые значения: True (если на рабочем листе имеются отфильтрованные данные со скрытыми строками), False (в противном случае) |
||
| Свойство AutoFilterMode |
Допустимые значения: True (если на рабочем листе выведены раскрывающиеся списки метода AutoFilter), False (в противном случае) |
||
| Шаг 1 |
Выделяем диапазон A1 = E1, содержащий заголовки полей базы данных. Выберем команду Данные, Фильтр, Автофильтр (Data, Filter, AutoFilter). В результате в заголовках полей появятся раскрывающиеся списки (Рисунок 3.5). В этих раскрывающихся списках предлагаются варианты допустимой фильтрации. В методе AutoFilter за диапазон с названиями полей отвечает объект, к которому применяется метод. В данном случае метод AutoFilter надо Применить к диапазону Range ("A1: E1") . |
||
Метод Consolidate
Метод Consolidate
Метод consolidate (консолидация) применяется для объединения данных из нескольких диапазонов в одну итоговую таблицу, которые могут находиться на различных рабочих листах. Этот метод позволяет подвести итоги и обобщить однородные данные, размещенные в нескольких диапазонах. Вручную метод consolidate выполняется с помощью команды Данные, Консолидация (Data, Consolidate).
Синтаксис:
Объект.Consolidate(Sources, Function, TopRow, LeftColumn, CreateLinks)
Аргументы:
| Объект |
Диацазон, где будет построена итоговая таблица |
||
| Sources |
Массив ссылок в R1C1 -формате на диапазоны, по которым строится итоговая таблица. Ссылки должны содержать полные имена диапазонов с указанием имен рабочих листов, на которых они расположены |
||
| Function |
Функция, на основе которой строится итоговая таблица. Допустимые значения: |
||
| TopRow |
Допустимые значения: True (консолидация основывается на заголовках столбцов, консолидируемых диапазонов) и False (в противном случае) |
||
| LeftColumn |
Допустимые значения: True (консолидация основывается на заголовках строк, консолидируемых диапазонов) и False (в противном случае) |
||
Метод DataSeries
Метод DataSeriesМетод DataSeries (прогрессия) создает профессии. Вручную метод DataSeries выполняется с помощью команды Правка, Заполнить, Прогрессия (Edit, Fill, Series).
Синтаксис:
Объект.DataSeries(rowcol, type, date, step, stop, trend)
Аргументы:
| Объект |
Диапазон с начальными данными прогрессии. Метод DataSeries позволяет одновременно строить несколько однотипных профессий с одинаковым шагом, но различными начальными элементами |
||
| rowcol |
Задает, вводятся профессии по строкам или столбцам. Допустимые значения: |
||
| type |
Определяет тип прогрессии. Допустимые значения: |
||
| date |
Определяет тип последовательности дат, если параметр type принимает значение xlChronological. Допустимые значения: |
||
| step |
Шаг изменения прогрессии. По умолчанию 1 |
||
| stop |
Предельное значение прогрессии. По умолчанию строится прогрессия во всем выделенном диапазоне |
||
| trend |
Допустимые значения: True (создается арифметическая или геометрическая прогрессия) или False (создается список) |
||
| Шаг 1 |
О В ячейку AI вводим первый член прогрессии, например 1. В методе DataSeries за начальное значение прогрессии отвечает объект, к которому применяется метод. В данном случае метод DataSeries надо применить к диапазону Range ("A1") . О Выберите команду Правка, Заполнить, Прогрессия (Edit, Fill, Series), которая приведет к появлению диалогового окна Прогрессия (Series) (Рисунок 3.1). |
||
Метод Find
Метод Find
Метод Find (найти) используется для поиска ячейки, содержащей специфицированную информацию. Если метод Find не находит подходящей ячейки, он возвращает значение Nothing. Вручную метод Find вызывается командой Правка, Найти (Edit, Find).
Синтаксис:
Объект.Find(what, after, lookln, lookAt, searchOrder, searchDirection, matchCase, matchByte)
Аргументы:
| Объект |
Диапазон, где производится поиск |
||
| what |
Элемент, который ищется |
||
| after |
Первая ячейка, после которой производится поиск. Если аргумент опущен, то поиск производится во всем диапазоне |
||
| lookln |
Область поиска. Допустимые значения: |
||
| LookAt |
Допустимые значения: |
||
| searchDirection |
Направление поиска. Допустимые значения: |
||
| searchOrder |
Допустимые значения: |
||
Метод GoalSeek
Метод GoalSeek
Метод GoalSeek (подбор параметра) подбирает значение параметра (неизвестной величины), являющееся решением уравнения с одной переменной. Предполагается, что уравнение приведено к виду: правая часть является постоянной, не зависящей от параметра, который входит только в левую часть уравнения. Вручную метод GoalSeek выполняется с помощью команды Сервис, Подбор параметра (Tools, Goal Seek). Метод GoalSeek вычисляет корень, используя метод последовательных приближений, результат выполнения которого, вообще говоря, зависит от начального приближения. Поэтому для корректности нахождения корня надо позаботиться о корректном указании этого начального приближения.
Синтаксис:
Объект.GoalSeek(Goal, ChangingCell)
Аргументы:
| Объект |
Ячейка, в которую введена формула, являющаяся правой частью решаемого уравнения. В этой формуле роль параметра (неизвестной величины) играет ссылка на ячейку, указанную в аргументе ChangingCell |
||
| Goal |
Значение левой части решаемого уравнения, не содержащей параметра |
||
| ChangingCell |
Ссылка на ячейку, отведенную под параметр (неизвестную величину). Значение, введенное в данную ячейку до активизации метода Goaiseek, рассматривается как начальное приближение к искомому корню |
||
With Application
.Maxlterations = 1000
.MaxChange = 0.0001
End With
Вручную эти величины устанавливаются на вкладке Вычисления (Calculation) диалогового окна Параметры (Options), вызываемого командой Сервис, Параметры (Tools, Options).
Приведем соответствие между аргументами метода Goaiseek и нахождения корня уравнения х2 = 3 на рабочем листе вручную при помощи команды Сервис, Подбор параметра (Tools, Goal Seek).
| Шаг 1 |
|
||
Метод Sort Сортировка позволяет
Метод SortСортировка позволяет выстраивать данные в лексикографическом порядке по возрастанию или убыванию. Метод Sort осуществляет сортировку строк списков и баз данных, а также столбцов рабочих листов с учетом до трех критериев, по которым производится сортировка. Сортировка данных вручную совершается с использованием команды Данные, Сортировка (Data, Sort). .
Синтаксис:
Объект.Sort(keyl, orderl, key2, order2, key3, order3, header, orderCus-tom,
matchCase, orientation)
Аргументы:
Объект![]() |
Диапазон, который будет сортироваться |
||
| keyl |
Ссылка на первое упорядочиваемое поле |
||
| orderl |
Задает порядок упорядочивания. Допустимые значения: |
||
| key2 |
Ссылка на второе упорядочиваемое поле |
||
| order2 |
Задает порядок упорядочивания. Допустимые значения: |
||
| key3 |
Ссылка на второе упорядочиваемое поле |
||
| order3 |
Задает порядок упорядочивания. Допустимые значения: |
||
| header |
Допустимые значения: |
||
| orderCustom |
Пользовательский порядок сортировки. По умолчанию используется Normal |
||
| matchCase |
Допустимые значения: True (учитываются регистры) и False (регистры не учитываются) |
||
| orientation |
Допустимые значения: О xlTopToBottom (сортировка осуществляется сверху вниз, т. е. по строкам), П xlLeftToRight (слева направо, т. е. по столбцам) |
||
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 | Задает порядок упорядочивания. Допустимые значения: xlDescending (убывающий порядок) |
| |||
key2 | Ссылка на второе упорядочиваемое поле | ||||
order2 | Задает порядок упорядочивания. Допустимые значения: xlDescending (убывающий порядок) |
| |||
key3 | Ссылка на второе упорядочиваемое поле | ||||
order3 | Задает порядок упорядочивания. Допустимые значения: xlDescending (убывающий Порядок) |
| |||
header | Допустимые значения: xlGuess (Excel решает, имеется ли заголовок) |
| |||
orderCustom | Пользовательский порядок сортировки. По умолчанию используется Normal | ||||
matchCase | Допустимые значения: True (учитываются регистры) и False (регистры не учитываются) | ||||
orientation | Допустимые значения: О xlTopToBottom (сортировка осуществляется сверху вниз, т. е. по строкам), П xlLeftToRight (слева направо, т. е. по столбцам) | ||||
Например, диапазон А1:С20 рабочего листа лист! сортируется следующей командой в порядке возрастания так, что первоначальная сортировка происходит по первому столбцу этого диапазона, а второстепенная — по второму.
Worksheets("Лист").Range("Al:C20").Sort keyl:=Worksheets("Sheetl").Range("Al"), key2:=Worksheets("Sheetl").Range("Bl")
Приведем соответствие между аргументами метода Sort и сортировкой данных на рабочем листе вручную при помощи команды Данные, Сортировка (Data, Sort).
Шаг 1 |
Выделяем диапазон A1:G13, содержащий записи базы данных о туристах, которые должны быть отсортированы (рис. 3.17). В методе Sort за диапазон с записями, подлежащими сортировке, отвечает объект, к которому применяется метод. В данном случае метод sort надо применить к диапазону Range ("A1 :G13") . |
||

Рис. 3.17. Сортируемые списки
Шаг 2 |
Выберем команду Данные, Сортировка (Data, Sort). В результате появится диалоговое окно Сортировка диапазона (Sort) (рис. 3.18). |
||
Используя это окно, можно установить до трех критериев, по которым производится сортировка. Range ( "Al : G13 " ) . Sort Key1i : =Range ("02") , Order1 : =xlAscending, Key2:=Range("E2") , Order2:=xlAscending, Header:= xlYes |
|||
ШагЗ |
Нажатие кнопки OK приведет к сортировке записей по указанным критериям (рис. 3.19). |
||

Рис. 3.18. Диалоговое окно Сортировка диапазона
Рис. 3.19. Результат сортировки
Метод Subtotal
Метод Subtotal
Метод Subtotal добавляет промежуточные итоги в список данных, основываясь на изменениях в определенных полях данных. Промежуточные итоги позволяют обобщить данные. Метод Subtotal автоматически вставляет строки с промежуточными итогами, в которые введены формулы для подсчета итогов. Необходимо, чтобы до активизации этого метода данные были правильно отсортированы. В противном случае этот метод может привести к неверному выводу промежуточных итогов. Вручную метод subtotal вызывается командой Данные, Промежуточные итоги (Data, Subtotal).
Синтаксис:
Объект.Subtotal(GroupBy, Function, TotalList, Replace, PageBreaks, SummaryBelowData)
Аргументы:
| Объект |
Диапазон, для которого подводятся промежуточные итоги |
||
| GroupBy |
Номер поля, по которому вычисляются промежуточные итоги |
||
| Function |
Определяет функцию, по которой производится подсчет промежуточных итогов. Допустимые значения: |
||
| TotalList |
Массив целых чисел с номерами полей, по которым вычисляются промежуточные итоги, |
||
| Replace |
Допустимые значения: True (существующие промежуточные итоги будут замещены) и False (в противном случае) |
||
| PageBreaks |
Допустимые значения: True (после каждой группы будет вставлено по символу разрыва страницы) и False (в противном случае) |
||
| SummaryBelowData |
Определяет местоположение для вывода промежуточных итогов. Допустимые значения: П xlSummaryAbove (промежуточные итоги будут выведены над данными) П и xlSummaryBeiow (промежуточные итоги будут выведены под данными) |
||
Приведем соответствие между аргументами метода subtotal и подведением промежуточных итогов на рабочем листе вручную при помощи команды Данные, Промежуточные итоги (Data, Subtotal) на примере подсчета продаж компьютеров по месяцам и нахождения средних объемов продаж (Рисунок 3.20).
Рисунок 3.20. Отчет о продажах компьютеров
| Шаг 1 |
Выделим ячейки списка, в данном случае диапазон A1:C16. Выберем команду Данные, Промежуточные итоги (Data, Subtotal). На экране отобразится диалоговое окно Промежуточные итоги (Subtotal) (Рисунок 3.21). |
||

Рисунок 3.21. Диалоговое окно Промежуточные итоги
Рисунок 3.22. Результат выполнения команды Промежуточные итоги
| Шаг 2 |
В диалоговом окне Промежуточные итоги (Subtotal): |
||
| ШагЗ |
Нажмем кнопку ОК в диалоговом окне Промежуточные итоги (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). В этом диалоговом окне: |
||
| Шаг 5 |
Нажмем кнопку OK в диалоговом окне Промежуточные итоги (Subtotal), что приведет к добавлению показателя средней реализации компьютеров по месяцам к уже существующим промежуточным итогам на рабочем листе (Рисунок 3.23). На VBA тот же результат достигается применением следующих инструкций: Range ("A1:C20") .Select Selection. Subtotal GroupBy:=l, Function: =xlAverage, TotalList:=Array (3) , Replace : =False, PageBreaks : =False, SummaryBelowData : =True |
||
| Шаг 6 |
Вместе с промежуточными итогами метод Subtotal создает структуру, которая позволяет управлять отображением детализации таблицы. Управляющими элементами структуры являются кнопки, отображаемые на левой стороне рабочего листа с номерами уровней иерархии, и кнопки, помеченные знаками <+> и <— >. Нажатие на кнопку <+> или <— > позволяет отобразить или скрыть детализацию данного элемента структуры, а на кнопки с номером уровня — детализацию целого уровня. Отобразим, например, только промежуточные итоги без их детализации. Для этого надо нажать сначала кнопку 2, а затем 3 (Рисунок 3.24). На VBA тот же результат достигается применением следующих инструкций: ActiveSheet . Outline . ShowLevels RowLevels : =2 ActiveSheet . Outline . ShowLevels RowLevels : =3 Здесь свойство Outline рабочего листа возвращает объект Outline (структура), а свойство ShowLevels объекта outline устанавливает отображаемый уровень детализации. |
||

Рисунок 3.23. Результат добавлению показателя средней реализации компьютеров по месяцам к уже существующим промежуточным итогам на рабочем листе
| Шаг7 |
Для удаления промежуточных итогов следует выделить данные с этими итогами, выполнив команду Данные, Промежуточные итоги (Data, Subtotal) и нажать кнопку Убрать все (Remove All) в появившемся диалоговом окне Промежуточные итоги (Subtotal). На VBA тот же результат в данном примере достигается применением следующих инструкций Range ("A1:C24") .Select Selection . RemoveSubtotal |
||

Рисунок 3.24. Вывод промежуточных итогов без детализации
МЕТОДЫ ОБЪЕКТА RANGE, ИСПОЛЬЗУЮЩИЕ КОМАНДЫ EXCEL
Глава 3.
Методы объекта Range, использующие команды Excel
В данном разделе рассматриваются методы, использующие встроенные в Excel команды. Эти методы позволяют эффективно работать с диапазоном: заполнять его элементами по образцу, сортировать, фильтровать и консолидировать данные, строить итоговую таблицу и создавать сценарии, решать нелинейное уравнение с одной неизвестной.
Объект Outline
Объект Outline
В общем случае структура — это такой режим работы, который позволяет разбить данные на определенные уровни детализации, а также просматривать только заголовки и подзаголовки документа. Структура наиболее полезна при создании итоговых отчетов, где не требуется чрезмерная детализация. Структуру невозможно создавать на основе произвольной таблицы данных. Ее построение основывается на таблицах с иерархической структурой данных. Объект Outline (структура) по своей иерархии вкладывается в семейство рабочих листов worksheets. Свойство outline рабочего листа возвращает объект Outline. Вручную на рабочем листе структура создается с помощью команды Данные, Группа и структура, Создание структуры (Data, Group and Outline, Auto Outline).
Приведем основные свойства объекта outline.
| AutomaticStyles |
Допустимые значения: True (структура строится на основе автоматических стилей) и False (в противном случае) |
||
| SummaryColumn |
Возвращает местоположение итоговых столбцов. Допустимые значения: xiLef t (итоговые столбцы располагаются слева от столбцов, по которым подводятся итоги) и xiRight (итоговые столбцы располагаются слева) |
||
| SummaryRow |
Возвращает местоположение итоговых строк. Допустимые значения: xiAbove (итоговые строки располагаются выше строк, по которым подводятся итоги) и xiBelow (итоговые строки располагаются ниже) |
||
| ShowLevels |
Отображает указанное число уровней структуры по строкам и столбцам. Синтаксис: ShowLevels (RowLevels, ColumnLevels) Аргументы: |
||
| ClearOutline |
Удаляет структуру |
||
Рисунок 4.6. Отчет о продажах
| Шаг 1 |
Выберите команду Данные, Группа и структура, Настройка (Data, Group and Outline, Settings). На экране отобразится диалоговое окно Структура документа (Outline) (Рисунок 4.7): |
||
| Шаг 2 |
Теперь таблица отструктурирована (Рисунок 4.8). При выводе структуры по левому и верхнему краю рабочего листа отображаются кнопки, помеченные символами "+" и "-", которые управляют отображением и скрытием уровней детализации структуры, а также номеров уровней. Щелчок на кнопке со знаком плюс приводит к отображению детализации, а на кнопке со знаком минус — к скрытию детализации. Щелчком на кнопке с номером уровня детализации также можно управлять отображением и скрытием всего уровня.Нажмите кнопки со знаком минус — с тем, чтобы скрыть детализацию отчетной таблицы (Рисунок 4.9). Описанные выше действия соответствуют следующей единственной инструкции: ActiveSheet. Outline. ShowLevels RowLevels:=l, ColumnLevels : =1 |
||

Рисунок 4.7. Диалоговое окно Структура документа
Рисунок 4.8. Структурированная таблица с детализацией
| ШагЗ |
Если структуризация листа не требуется, то ее можно отменить, выбрав команду Данные, Группа и структура, Удалить структуру (Data, Group and Outline, Clear Outline). Тот же результат достигается следующей инструкцией: Selection. ClearOutline |
||
Рисунок 4.9. Структурированная таблица без детализации
Объект Scenario
Объект ScenarioОбъект scenario (сценарий) позволяет хранить несколько значений в одной ячейке. Каждое уникальное значение в ячейке или каждая уникальная группа значений для группы ячеек называется сценарием. Семейство scenarios (сценарии) содержит все сценарии рабочего листа. Вручную сценарии создаются с помощью команды Сервис, Сценарии (Tools, Scenarios).
Рассмотрим методы объекта Scenario.
| Add |
Добавляет новый сценарий. Синтаксис: Add (Name, ChangingCells, Values, Comment, Locked, Hidden) Аргументы: |
||
| Show |
Показывает сценарий посредством ввода значений сценария в изменяемые ячейки |
||
| ChangeScenario |
Изменяет группу изменяемых ячеек. Синтаксис: ChangeScenario (ChangingCells, Values) |
||
| Delete |
Удаляет сценарий |
| 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) |
||
СЦЕНАРИИ И ОПРЕДЕЛЕНИЕ СТРУКТУРЫ ДАННЫХ
Глава 4.
Сценарии и определение структуры данных
ДИАГРАММЫ
Глава 5.
Диаграммы
Линия тренда
Линия трендаС помощью диаграммы легко можно анализировать тренды и делать прогнозы. Вручную линия тренда на диаграмме добавляется с помощью команды Диаграмма, Добавить линию тренда (Chart, Add Trendline).
Все линии тренда, соответствующие данному ряду данных, образуют семейство Trendlines, элементами которого являются объекты Trendline (линия тренда).
Основными методами семейства Trendiines являются метод Add, добавляющий новый элемент в семейство, и метод item, возвращающий конкретный элемент семейства.
Приведем описание метода Add семейства Trendiines.
| Add |
Добавляет новый элемент в семейство Trendlines. Синтаксис: Add (Type, Order, Period, Forward, Backward, Intercept, DisplayEquation, DisplayRSquared, Name) |
||
Приведем соответствие между построением линии тренда вручную и аргументами метода Add семейства Trendiines.
| Шаг 1 |
|
||
| Шаг 2 |
На вкладке Тип (Туре) появившегося диалогового окна Линия тренда (Trendline) (Рисунок 5.10): |
||
| ШагЗ |
На вкладке Параметры (Options) диалогового окна Линия тренда (Trendline) (Рисунок 5.11) устанавливаются параметры линии тренда: |
||
Методы объекта 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-оси для трехмерных диаграмм |
||
| Axes |
Возвращает семейство Axes, предназначенное для установки различных свойств осей. Для возвращения уникальной оси необходимо использовать следующий синтаксис метода: Axes (Type, Group) Аргументы: xlCategory, xlSeries И xlValue xlSecondary With Charts (1) .Axes (xlCategory) .HasTitle = True . AxisTitle. Caption = "Доход" End With |
||
| SeriesCol lection |
Возвращает семейство объектов series или объект этого семейства. Синтаксис (для одного объекта из семейства): SeriesCollection ( Index) Синтаксис (для семейства объектов): SeriesCollection Charts (1) . SeriesCollection (1) .HasDataLabels = True |
||
| SetSourceData |
Устанавливает источник данных диаграммы. Синтаксис: SetSourceData (Source, PlotBy) ActiveChart . SetSourceData Source :=Sheets (1) .Range ("A1 : F1") , PlotBy:=xlRows |
||
| Export |
Экспортирует диаграмму в графический формат. Синтаксис: Export (FileName, FilterName, Interactive) |
||
| Location |
Передвигает диаграмму на новое место. Синтаксис: Location (Where, Name) (xlLocationAutomatic) |
||
| Add |
Создает новую диаграмму. Синтаксис: Add (Left, Top, Width, Height) |
||
| Delete |
Удаляет элемент семейства |
||
| CopyPicture |
Копирует диаграмму в буфер обмена как рисунок. Синтаксис: CopyPicture (Appearance, Format, Size) |
||
| BringToFront |
Отображает диаграмму на переднем плане |
||
| SendToBack |
Отображает диаграмму на заднем плане |
||
| Select |
Выбирает диаграмму |
||
Объекты Chart и ChartObject
Объекты Chart и ChartObjectExcel позволяет создавать высококачественные диаграммы. Существенную помощь при их построении оказывают встроенные форматы диаграмм, предоставляющие большой спектр графического представления наборов данных. Как вся диаграмма, так и ее отдельные элементы легко удаляются, изменяются и добавляются. Добавляя в диаграмму пояснительный текст, стрелки, заголовки, легенду, изменяя заливку, узоры, типы линий и обрамление, можно добиться того, чтобы диаграмма представляла данные в наиболее наглядном виде.
В Excel различаются два вида диаграмм: внедренная на рабочий лист и созданная на специальном листе для диаграмм. Итак, семейство sheets (листы) включает в себя семейства: worksheets (рабочие листы) и charts (листы диаграмм). Объектами семейства charts являются листы диаграмм, но это семейство не включает в себя диаграммы, непосредственно встроенные в рабочие листы. Такие диаграммы принадлежат семейству chartobjects. Таким образом, объект ChartObject встроен В Объект Worksheet, a Chart — В workbook. Иерархия этих объектов показана на Рисунок 5.1. Свойства и методы этих объектов в основном аналогичны.
ПХЯ 5 1 Иерархия объектов Chart и ChartObject
пХЯ. 5.1. Иерархия объектов Chart и ChartObject
ПХЯ 5 10 Вкладка Тип диалогового окна Линия тренда
пХЯ. 5.10. Вкладка Тип диалогового окна Линия тренда
ПХЯ 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.12. Линия тренда объема продаж
Выделите диапазон, на основе которого
пХЯ. 5.2. Пример диаграммы| Шаг 0 |
Выделите диапазон, на основе которого будет строиться диаграмма (Рисунок 5.3). Этот диапазон вводится в аргумент source. В данном примере аргументу source присваивается значение Range ("A1:B11") . |
||
Chart Wizard) чтобы отобразить на
xlLine, а аргументу Format — 1.
Нажмем кнопку Далее > (Next >) для перехода к следующему шагу построения диаграммы.
| Шаг 2 |
|
ПХЯ 5 5 Вкладка Диапазон данных диалогового окна второго шага работы мастера диаграмм
пХЯ. 5.5. Вкладка Диапазон данных диалогового окна второго шага работы мастера диаграмм
ПХЯ 5 6 Вкладка Ряд диалогового окна второго шага работы мастера диаграмм
пХЯ. 5.6. Вкладка Ряд диалогового окна второго шага работы мастера диаграмм
| ШагЗ |
|
||
ПХЯ 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 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 |
Допустимые значения: |
||
| 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 |
Тип источника данных. Допустимые значения: |
||
| SourceData |
Определяет вид источника данных в зависимости от значения аргумента SourceType: |
||
| 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 и имени файла, содержащего запрос |
||
Синтаксис 1:
Объект.PivotTabies
Возвращает семейство сводных таблиц. Здесь и во втором синтаксисе объект -рабочий лист.
Синтаксис 2:
Объект.PivotTables(Index)
Возвращает сводную таблицу из семейства сводных таблиц с именем или номером, указанным в аргументе index .
Объект PivotTable имеет следующие наиболее часто используемые методы.
| PivotFields |
Возвращает объект, являющийся либо единичным полем (синтаксис 1), либо семейством полей. Синтаксис 1: PivotFields (Index) |
||
| PivotSelect |
Выбирает элементы сводной таблицы. Синтаксис: PivotSelect (Name, Mode) Аргументы: G Name — строковое выражение, идентифицирующее выбранный элемент xlDataAndLabel, xlDataOnly, xlLabelOnly или xlOrigin |
||
| RefreshTable |
Обновляет данные. Дело в том, что в сводной таблице не происходит автоматического перерасчета при изменении исходных данных. Для перерасчета сводной таблицы вручную надо ее выделить и выбрать команду Данные, Обновить данные (Data, Refresh Data). Программно перерасчет сводной таблицы производится методом RefreshTable |
||
| AddFields |
Добавляет строки, столбцы и страницы в сводную таблицу. Синтаксис: AddFields (RowFields, ColumnFields, PageFields, AddToTable) Аргументы: |
||
| ColumnFields, RowFields, DataFields И PageFields |
Возвращает объект, являющийся либо единичным полем (синтаксис 1), либо семейством полей (синтаксис 2), который является столбцом (строкой, данными или страницей) сводной таблицы. Синтаксис 1: ColumnFields (Index) RowFields (Index) DataFields (Index) PageFields (Index) ColumnFields RowFields DataFields PageFields |
||
| VisibleFields и HiddenFields |
Возвращает объект, являющийся либо единичным полем (синтаксис 1), либо семейством полей (синтаксис 2), который в данный момент отображается (скрыт) в сводной таблице. Синтаксис 1: VisibleFields (Index) HiddenFields (Index) VisibleFields HiddenFields |
||
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 имеет единственный метод item, возвращающий элемент этого семейства, т. е. конкретную сводную таблицу.
Синтаксис:
Item(Index)
Сводная таблица после
Рисунок 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?) позволяет установить источник данных для сводной таблицы. Excel (Microsoft Excel List or Database), т. к. сводная таблица будет создаваться на основе одного списка активного рабочего листа. Нажмите кнопку Далее > (Next >) |
||
Первое диалоговое окно мастера сводных таблиц
Рисунок 6.3. Первое диалоговое окно мастера сводных таблиц
| Шаг 2
|
На экране появится второе диалоговое окно мастера сводных таблиц (Рисунок 6.4). В поле Диапазон (Range) введите ссылку, например AI :Е1б, на диапазон, по которому будет строиться сводная таблица. Нажмите кнопку Далее > (Next >). |
||
Второе диалоговое окно мастера сводных таблиц
Рисунок 6.4. Второе диалоговое окно мастера сводных таблиц
| ШагЗ
|
На экране появится третье диалоговое окно мастера сводных таблиц (Рисунок 6.5), в котором создается структура сводной таблицы. |
||
Третье диалоговое окно мастера сводных таблиц
Рисунок 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.
Сводные таблицы
PivotSelect
Таблица!" ) . _ PivotSelect "Месяц", xlButtonActiveSheet. PivotTables ("СводнаяТаблица!") . _
PivotFields ("Месяц") .Orientation = xlHidden
PivotSelect
Таблица!") . _ PivotSelect "Месяц [Все] ", xlLabelOnly With ActiveSheet .PivotTables ( "СводнаяТаблица!").
PivotFields ("Месяц") .Orientation = xlRowField .Position = 1
End With
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, кроме перечисленных стандартных элементов управления, имеется ряд дополнительных. Дополнительные элементы управления являются самостоятельными объектами, обладающие как общими для всех элементов управления свойствами и методами, так и присущими только им свойствами и методами. Для добавления дополнительных элементов управления на панель элементов необходимо:
Флажок и выключатель
Флажок и выключательЭлемент управления checkBox (флажок) создается с помощью кнопки Флажок (Checkbox) (Рисунок 7.21). Этот элемент управления предоставляет пользователю возможность выбора. Флажок обычно имеет два состояния: установленное и сброшенное, но может настраиваться на выбор из трех альтернатив. Флажок имеет те же свойства value, Enabled, visible и Capture, что и переключатель. Кроме того, флажок обладает уникальным свойством Triplestate, позволяющим производить выбор из трех альтернатив. Свойство Triplestate может принимать два значения: False (выбор из двух альтернатив .True и False) и True (выбор из трех альтернатив True, False и Null).
Инициализация и отображение диалогового окна
Инициализация и отображение диалогового окна
Инициализировать и отобразить диалоговое окно на экране очень просто. Инициализация производится при помощи процедуры обработки события Initilize формы userForm. Отображение диалогового окна на экране осуществляется методом show. Инструкцию с методом show обычно помещают в процедуру, которая связана с командой пользовательского меню, кнопкой панели инструментов или элементом управления, как правило кнопкой диалогового окна.
Простой инициализации или обычного отображения диалогового окна часто бывает недостаточно, т. к. это приводит к появлению на экране функционально ненастроенного диалогового окна. Такое диалоговое окно можно сравнить с каркасом дома. В таком доме жить неприятно и в него совсем не хочется въезжать. Для того чтобы жить в доме было приятно и удобно, прежде чем в него вселяться, надо сделать много отделочных работ. Также и при инициализации диалогового окна необходимо предусмотреть огромное количество на первый взгляд мелочей, но без которых работать с диалоговым окном неудобно. В частности, при отображении диалогового окна на-экране необходимо установить значения полей, применяемые по умолчанию, задать функции кнопок, назначить им комбинации клавиш, связать с элементами управления всплывающие подсказки, вывести в списках первоначально выводимые элементы списщв, задать первоначальную установку флажков, переключателей, вывести в элементы управления формы требуемые рисунки и т. д.
Приведем пример процедуры инициализации диалогового окна (Рисунок 7.30), в котором рассчитываются размеры периодических выплат при постоянной процентной ставке.
ЭЛЕМЕНТЫ УПРАВЛЕНИЯ И ПОЛЬЗОВАТЕЛЬСКАЯ ФОРМА
Глава 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) |
||
| StartDrag |
Инициирует операцию drag-and-drop для объекта DataObject. Синтаксис: ЦелаяПеременная = Object . StartDrag |
||
| GetText |
Возвращает текстовую строку из объекта Dataobject. Синтаксис: СтроковаяПёременная = object . GetText |
||
| PutlnClipboard |
Переносит данные из объекта DataObject в буфер обмена |
||
| GetFromClipboard |
Переносит данные из буфера обмена в объект DataObject |
||
Общие методы и события элементов управления
Общие методы и события элементов управленияПеречислим основные общие методы элементов управления.
| Add |
Позволяет добавить элемент управления во время выполнения программы |
||
| Move |
Перемещает элемент управления |
||
| Zorder |
Помешает объект до или после всех пересекающихся с ним объектов |
||
| SetFocus |
Устанавливает фокус на вызвавшем этот метод элементе управления. Часто применяется в программах обработки ошибок |
||
| Click |
Происходит, когда пользователь выбирает элемент управления с помощью одинарного щелчка кнопкой мыши |
||
| DblClick |
Происходит, когда пользователь выбирает элемент управления с помощью двойного щелчка кнопкой мыши |
||
| KeyPress |
Происходит, когда пользователь нажимает любую клавишу на клавиатуре, кроме функциональных и клавиш управления курсором |
||
| Change |
Происходит при изменении значения элемента управления |
||
| GotFocus И LostFocus |
Происходит, когда элемент управления получает или теряет фокус |
||
| Error |
Используется при уведомлении об ошибке |
||
Таблица 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 |
Возвращает код (значение) нажатой кнопки мыши. Допустимые значения: |
||
| Shift |
Возвращает код (значение) нажатой на клавиатуре клавиши. Допустимые значения: |
||
| X И Y |
Возвращает значение расстояния от левого или от верхнего края формы, рамки или страницы. При событии MouseMove этим расстоянием считается путь в направлении от левого верхнего угла элемента управления по горизонтали или вертикали |
||
Таблица 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 |
Устанавливает позицию указателя мыши относительно целевого объекта. Допустимые значения: |
||
| Effect |
Устанавливает операцию, производимую над объектом. Допустимые значения: |
||
| Shift |
Возвращает код (значение) нажатой на клавиатуре клавиши. Допустимые значения: |
||
Общие свойства элементов управления
Общие свойства элементов управления
Приведем основные общие свойства элементов управления.
| 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 |
Устанавливает тип границы. Допустимые значения: |
||
| 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 |
Устанавливает тип границы. Допустимые значения: |
||
| 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 |
||
Таблица 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 предоставляет пользователю возможность создавать диалоговые окна разрабатываемых приложений. Она служит базой пользовательского диалогового окна, на которой в зависимости от решаемой задачи размещают требуемые элементы управления.
Семейство userForms является семейством, компоненты которого представляют все загруженные формы UserForm в приложении. Как и все семейства, UserForms имеет свойства count (возвращает число компонентов в семействе) и item (возвращает определенный компонент семейства), а также метод Add (добавляет к семейству новый компонент).
Приведем основные свойства, методы и события пользовательской формы. Наиболее часто используемые свойства объекта UserForm.
| Name |
Возвращает имя пользовательской формы |
||
| Caption |
Возвращает текст, отображаемый в строке заголовка формы |
||
| BackColor |
Возвращает цвет фона формы |
||
| BorderStyle |
Устанавливает тип границы |
||
| Picture |
Указывает рисунок, отображаемый как фон формы |
||
| Left И Top |
Возвращают местоположение верхнего левого угла формы в пунктах |
||
| Height И Width |
Возвращают высоту и ширину формы в пунктах |
||
| StartUpPosition |
Возвращает значение, определяющее положение формы при ее первом отображении на экране. Допустимые значения: |
||
| Show |
Отображает форму на экране |
||
| Hide |
Закрывает форму |
||
| Move |
Изменяет положение и размер формы |
||
| PrintForm |
Печатает изображение формы |
||
Последовательность выбора элементов управления
Последовательность выбора элементов управления
Последовательность перехода от одного элемента управления к другому определяет порядок, в соответствии с которым активизируются эти элементы управления при нажатии клавиши <Таb>. Для установки последовательности перехода в пользовательской форме необходимо:
Рамка
Рамка
Элемент управления Frame (рамка) создается с помощью кнопки Рамка (Frame) (Рисунок 7.20). Он используется для визуальной группировки элементов управления. Основным свойством рамки является Capture, отображающее надпись рамки.
Редактор кода
Редактор кода
После установки свойств элемента управления или формы переходят к написанию кода, связанного с ними. Особое место в этом коде занимают процедуры обработки событий. У каждого элемента управления есть целый набор событий, обрабатывающих те или иные действия. Приведем некоторые из них:
| Click |
Щелчок |
||
| DblClick |
Двойной щелчок |
||
| GotFocus |
Кнопка в фокусе |
||
| LostFocus |
С кнопки снят фокус |
||
Нажатие на кнопку Исходный текст (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 |
Устанавливает масштабирование рисунка. Допустимые значения: |
||
| PictureAlignment |
Устанавливает расположение рисунка внутри объекта. Допустимые значения: |
||
| PictureTiling |
Допустимые значения: True (объект покрывается мозаикой из рисунка) и False (в противном случае) |
||
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 появятся: |
||
Список
Список
Элемент управления 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
Обсудим наиболее часто используемые методы и свойства объекта CommandBar. Начнем с его методов.
| Add Delete |
Создает новую панель команд и добавляет ее в семейство CommandBars Синтаксис: Add (Name, Position, MenuBar, Temporary) |
||
| ShowPopUp |
Отображает контекстную панель команд в специфицированном местоположении, если указаны координаты, либо в месте расположения указателя, если они опущены. Синтаксис: ShowPopUp (х, у) |
||
| Reset |
Восстанавливает в исходное состояние (по умолчанию) встроенную панель инструментов |
||
| Enabled |
Определяет возможность доступа к панели команд |
||
| Visible |
Определяет, видима ли строка панели команд. Например, скрыть панель инструментов Форматирование (Formatting) можно с помощью следующей инструкции: Application. CommandBars ("Formatting" ) .Visible = False Отобразить все панели инструментов можно с помощью следующей инструкции: Application. CommandBars .Visible = True |
||
| Controls |
Возвращает семейство commandBarControis, состоящее из всех элементов управления конкретной панели инструментов |
||
| Position |
Возвращает местоположение панели команд. Допустимые значения: |
||
| Protection |
Устанавливает защиту строки меню от изменений со стороны пользователя. Допустимые значения: msoBarNoProtection, msoBarNoCustomize, msoBarNoResize, msoBarNoMove, msoBarNoChangeVisible, msoBarNoChangeDock, msoBarNoVerticalDock и msoBarNoHorizontalDock |
||
ПХЯ 8 10 Диалоговое окно со значками
пХЯ. 8.10. Диалоговое окно со значками
Если необходимо создать пользовательское изображение на кнопке или подкорректировать уже существующее, шаг 2 алгоритма должен быть следующим.
ПХЯ 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. Пользовательский интерфейс
Каждая из кнопок связана с макросом таким образом, что их активизация приводит к выполнению соответствующего макроса. Кроме того, эти кнопки снабжены пояснительными надписями, которые отображаются в окне всплывающей подсказки. При закрытии приложения данная панель инструментов удаляется, а ее место занимают панели инструментов Стандартная (Standard) и Форматирование (Formatting).
В окне Проект — VBAProject (Project - VBAProject) выберите лист ThisWorkbook и наберите следующие две процедуры.
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
'
' Процедура создания новой панели инструментов при
' открытии рабочей книги
'
' При открытии рабочей книги панели инструментов Форматирование
' и Стандартная скрываются
'
'
With Application
.CommandBars("Formatting").Visible = False
.CommandBars("Standard").Visible = False End With
' Создание новой панели инструментов с именем
' МояПанельИнструментов, которая будет
' удаляться при закрытии приложения
'
With Application.CommandBars
.Add(Name:="МояПанельИнструментов",
Position:=msoBarTop, MenuBar:=False, Temporary:=True)
.Visible = True With .Controls
' Создание кнопки с рисунком
With .Add(Type:=msoControlButton, Id:=2950)
.TooltipText = "КнопкаДейства!" .OnAction = "Действо 1"
End With
'
' Создание кнопки с надписью
With .Add(Type:=msoControlButton, Id:=l)
.Caption = "Действо"
.TooltipText = "КнопкаДейства2"
.Style = msoButtonCaption
.OnAction = "Действо 2" End With
' Создание раскрывающегося списка
With .Add(Type:=msoControlDropdown)
.Addltem "Приедет", 1 .Addltem "Уедет", 2
.Addltem "Еще не решил", 3
.Listlndex = i
End With
End With
End With
End Sub
'
Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window)
' Процедура, отображающая панели инструментов Форматирование
' ' и Стандартная при закрытии приложения
'
With Application
.CommandBars("Formatting").Visible = True
.CommandBars("Standard").Visible = True
End With
End Sub
А на листе модуля введите следующие две процедуры, которые будут выполняться при нажатии на соответствующие кнопки.
Sub Действо1()
MsgBox "Результат действа 1"
End Sub
Sub Действо 2()
MsgBox " Результат действа 2"
End Sub
ПХЯ 8 3 Интерфейс с пользовательской строкой меню
пХЯ. 8.3. Интерфейс с пользовательской строкой меню
В окне Проект — VBA Project (Project - VBAProject) выберите лист Thisworkbook и введите на нем следующие две процедуры.
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
'
' Процедура создания новой строки меню при
' открытии рабочей книги. При закрытии приложения
' подданная строка удаттететея
'
With Application.CoimnandBars.Add(Name:="МоеМеню", MenuBar:=True, Temporary:=True) .Visible = True
With .Controls
'
' Создание меню Меню!
'
With .Add(Type:=msoControlPopup)
.Caption = "&Меню1" With .Controls
With .Add (Type :=msoControlButtoj")
.Caption = "Пункт&1" .OnAction = "АтьДва!"
End With
'
' Создание подменю Меню1
With -Add(Type:=msoControlPopup)
.Caption = "&ПодМеню1" With
.Controls
With .Add(Type:=msoControlButton)
.Caption = "Пункт&2" .OnAction = "АтьДва2"
End With
With .Add(Type:=msoControlButton)
.Caption = "Пункт&З"
.OnAction = "АтьДваЗ"
End With
End With
End With
End With
End With
'
' Создание меню Меню2
'
With .Add(Type:=msoControlPopup)
.Caption = "&Меню2" With .Controls
With .Add(Type:=msoControlButton)
.Caption = "Пункт&4"
.OnAction = "АтьДва4"
End With
End With
End With
End With
End With
End Sub
А на листе модуля введите следующие четыре процедуры, которые будут выполняться при выборе соответствующего пункта меню.
Sub АтьДва!()
MsgBox "Стой! Стоять! Буду стрелять!"
' End Sub
'
Sub АтьДва2 ()
MsgBox "Стой! Стоять! Стреляю в воздух!"
End Sub
Sub АтьДваЗ()
MsgBox "Стой! Стоять! Последний раз стреляю в воздух!"
End Sub
'
Sub АтьДва4()
MsgBox "Стой! Стоять! Стреляю!"
End Sub
ПХЯ 8 4 Диалоговое окно Настройка
пХЯ. 8.4. Диалоговое окно Настройка
| ШагЗ |
В появившемся диалоговом окне Создание панели инструментов в поле Панель инструментов (Toolbars) введите имя новой панели инструментов, например моя панель (Рисунок 8.5). |
||
ПХЯ 8 5 Диалоговое окно Создание панели инструментов
пХЯ. 8.5. Диалоговое окно Создание панели инструментов
| Шаг 4 |
Нажмите кнопку ОК. Это приведет к появлению новой панели инструментов (Рисунок 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 8 Меню с командой Назначить макрос
пХЯ. 8.8. Меню с командой Назначить макрос
| ШагЗ |
Появится диалоговое окно Назначить макрос (Assign Macro) (Рисунок 8.9). В списке Имя макроса (Macro Name) выберите имя макроса, назначаемое элементу управления. Нажмите кнопку ОК диалогового окна Назначить макрос (Assign Macro) и кнопку Закрыть (Close) диалогового окна Настройка (Customize). Теперь макрос назначен кнопке. |
||
ПХЯ 8 9 Диалоговое окно Назначить макрос
пХЯ. 8.9. Диалоговое окно Назначить макрос
Пример создания панели инструментов пользователя
Пример создания панели инструментов пользователяПриведем пример проекта, который создает интерфейс приложения, состоящего из строки меню и одной панели инструментов. В панель инструментов входят две кнопки и раскрывающийся список. На поверхности одной из кнопок выводится рисунок, а другой — надпись (Рисунок 8.2).
Пример создания строки меню пользователя
Пример создания строки меню пользователяПриведем пример проекта, который создает интерфейс приложения, состоящего из пользовательской строки меню. Пользовательская строка меню включает два пункта меню, причем первый пункт содержит в себе также раскрывающееся меню (Рисунок 8.3). Каждый пункт связан с макросом так, что при их выборе выполняется -соответствующий макрос. При закрытии приложения пользовательская строка меню удаляется.
ПРОГРАММИРОВАНИЕ ПАНЕЛИ ИНСТРУМЕНТОВ
Глава 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) |
||
| Caption |
Текстовая строка, отображаемая в заголовке |
||
| DescriptionText |
Возвращает описание элемента управления |
||
| Enabled |
Устанавливает, является ли допустимым выбранный пользователем элемент управления |
||
| FacelD |
Возвращает номер встроенной кнопки, используемой в качестве элемента управления. Если это свойство равно нулю, то возвращается пустой элемент управления |
||
| OnAction |
Возвращает имя макроса, выполняемого при активизации элемента управления |
||
| ShortcutText |
Возвращает комбинацию горячих клавиш, назначенных элементу управления |
||
| Style |
Только для объекта CommandBarButton. Устанавливает . внешний вид кнопки. Допустимые значения: |
||
| 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. Допустимые значения: |
||
| Button |
Устанавливает тип кнопок, отображаемых в окне помощника. Допустимые значения: |
||
| Callback |
Устанавливает имя процедуры, которая выполняется при отображении окна помощника |
||
| CheckBoxes |
Возвращает семейство BallooncheckBoxes, флажки окна помощника |
||
| Heading |
Возвращает заголовок окна помощника |
||
| Icon |
Возвращает тип значка, отображаемого в левом верхнем углу окна помощника. Допустимые значения: |
||
| Labels |
Возвращает семейство BalloonLabels, все надписи окна помощника |
||
| Text |
Возвращает текст, располагаемый в окне помощника между заголовком и надписями. |
||
В первом примере в окне помощника отображаются три надписи и два флажка (Рисунок 9.2). Надписи выводятся в виде нумерованного списка. Выбор надписей программой игнорируется. Зато установка флажка приводит к программному отклику. В данном случае в виде отображения диалогового окна с соответствующим сообщением. В качестве помощника выбран Скрепыш, который используется по умолчанию. Для Скрепыша установлена не прерывная анимация до тех пор, пока окно помощника отображается на экране.
Рисунок 9.2. Первый пример окна помощника
Sub ПримерПомощника()
Set МойПомощник = Assistant.NewBalloon
Assistant.Animation = msoAnimationSearching
With МойПомощник
.BalloonType = msoBalloonTypeNumbers
.Heading = "Советы дня"
.Text = "Народные мудрости"
.Labels(1).Text = "Под лежачий камень вода не течет"
.Labels(2).Text = "Капля воды камень точит"
.Labels(3).Text = "Жизнь с VBA стала веселей"
.CheckBoxes(1).Text = "Жить - хорошо"
.Checkboxes(2).Text = "А хорошо жить - еще лучше"
. Show Select Case True
Case . CheckBoxes (1) .Checked
MsgBox "Выбрали хорошую жизнь" Case
.CheckBoxes(2).Checked
MsgBox "Выбрали лучшую жизнь"
End Select
End With
End Sub
Во втором примере в окне помощника отображаются три надписи с кнопками (Рисунок 9.2). Теперь нажатие кнопки у надписи будет вызывать программный отклик. В данном случае в виде отображения диалогового окна с соответствующим сообщением. Для Скрепыша установлена непрерывная анимация, отличная от первого примера.
Sub ПримерЕщеОдногоПомощника()
Dim Номер As Integer
Set МойПомощник = Assistant.NewBalloon
Assistant.Animation = msoAnimationSaving
With МойПомощник
.BalloonType = msoBalloonTypeButtons
.Heading = "Советы дня"
.Text = "Народные мудрости"
.Labels(1).Text = "Под лежачий камень вода не течет"
.Labels(2).Text = "Капля воды камень точит"
.Labels(3).Text = "Жизнь с VBA стала веселей" Номер = .Show Snd With
Select Case Номер Case Is = 1
MsgBox "Вывод: пора начать читать книгу по VBA"
Case Is = 2
MsgBox "Вывод: если приложить достаточно усилий," & Chr(13) &
"то можно разобраться с любой проблемой" Case Is = 3
MsgBox "Что верно, то верно. Excel с VBA - это мощь"
End Select
End Sub
Рисунок 9.3. Второй пример окна помощника
ПРОГРАММИРОВАНИЕ СРЕДСТВ ДЛЯ РАБОТЫ
СО СПРАВОЧНОЙ ИНФОРМАЦИЕЙ
Глава 9.
Программирование средств для работы со справочной информацией
Для удобства работы с пользовательскими приложениями обычно их снабжают различной справочной информацией. Прекрасным средством отображения и работы со справочной информацией является помощник. Помощник может принимать образы различных героев, обладает выразительной мимикой, очень подвижен и разговорчив, но кроме того, он отличный и заботливый гид по приложению. В любой ситуации у него имеется подсказка, как правильно совершить то или иное действие, как преодолеть те или иные возникшие заковырки.
Структура помощника
Структура помощникаПомощник программируется на VBA при помощи объекта Assistant. Структура объекта Assistant приведена на Рисунок 9.1. Важной особенностью объекта является то, что это единичный объект, не являющийся элементом никакого семейства объектов. В каждый момент времени можно вывести только одного помощника. Но помощника можно видоизменять по ходу работы программы. Объект Balloon представляет собой окно помощника, содержащее список разделов справки, связанных с помощником. В этот список могут входить надписи и флажки. Все надписи, входящие в объект Balloon, образует семейство BalloonLabeis, а все флажки - семейство BalloonCheckBoxes.
Свойства объекта Assistant
Свойства объекта Assistant
Перечислим основные свойства объекта Assistant.
| Animation |
Управляет движением помощника на экране. Допустимы 34 значения, программирующие разовые движения помощника, и 8 значений, задающих его непрерывные движения. Отметим, что некоторые анимационные эффекты не работают для всех персонажей, но использование их не приводит к ошибкам, просто помощник остается в покое, не производя предписанное действие. Приведем значения свойства Animation, задающие непрерывные действия помощника: |
||
| AssistWithAlerts |
Допустимые значения: True (автоматическое отображение справочной информации при возникновении ситуации, приводящей к отображению предупреждения, например при удалении рабочего листа) и False (в противном случае) |
||
| AssistWithHelp |
Допустимые значения: True (отображается помощник со справкой, при нажатии клавиши |
||
| Filename |
Возвращает полное имя файла (т. е. с указанием папки, где находится файл) для активного помощника. Имена файлов помощников имеют расширение act. Обычно Windows-файлы помощников располагаются В папке \Program Files\Microsoft Office\0ffiсе\Actors |
||
| GuessHelp |
Допустимые значения: True (отображается помощник с наиболее подходящей справкой при нажатии клавиши |
||
| Sounds |
Допустимые значения: True (помощник воспроизводит звуковой сигнал, соответствующий информационному сообщению) и False (в противном случае) |
||
| TipOfDay |
Допустимые значения: True (помощник отображает сообщение при запуске приложения) и False (в противном случае) |
||
| Visible |
Допустимые значения: True (помощник отображается на экране) и False (в противном случае) |
||
Типы помощника
Типы помощника
Всего имеется 9 типов помощников. По умолчанию используется помощник с именем скрепыш (Clippit). Отображением помощника на экране управляет свойство Visible объекта Assistant. Свойство Filename объекта Assistant позволяет изменить вид помощника. А свойство Name возвращает имя текущего помощника.
Перечислим используемые в VBA типы помощников.
| Внешний вид | Название (рус.) |
Содержание Назад Вперед
Программирование: Языки - Технологии - Разработка
- Программирование
- Технологии программирования
- Разработка программ
- Работа с данными
- Методы программирования
- IDE интерфейс
- Графический интерфейс
- Программирование интерфейсов
- Отладка программ
- Тестирование программ
- Программирование на Delphi
- Программирование в ActionScript
- Assembler
- Basic
- Pascal
- Perl
- VBA
- VRML
- XML
- Ada
- Lisp
- Python
- UML
- Форт
- Языки программирования
