Основные объекты электронной таблицы Excel

advertisement
1
Особенности
применения
VBA
или «Быстрое» программирование
в
офисных
приложениях
Основные объекты электронной таблицы Excel.
Объектно ориентированное программирование предполагает использование свойств
объектов и событий происходящих на объектах или с ними. Поэтому вначале мы
посмотрим на основные объекты электронной таблицы с точки зрения возможности их
применения. Основной объект – само «Приложение» (“Application”). В тот момент, когда
мы открывает на компьютере электронную таблицу (не открывая еще ни одной рабочей
книги), мы начинаем работу с этим объектом. Как правило, ЭТ обычно открывается
вместе с рабочей книгой (файлом с расширеиием .xls). Это означает, что происходит
открытие объекта «Рабочая книга» (“Workbook”). Для этого объекта существует ряд
событий, которые мы уже можем использовать. Эти события представлены в таблице 6.
Таблица 7.
Activate
BeforeClose
BeforeSave
Deactivate
Open
SheetCalculate
SheetDeactivate
WindowActivate
WindowDeactivate
WindowResize
События «Рабочей книги» (“Workbook”)
Книга стала активной
Происходит перед закрытием книги
Происходит перед сохранением книги
Книга перестала быть активной
Книга открыта
Выполнен персчет листа книги
Лист книги перестал быть активным
Окно стало активным
Окно перестало быть активным
Размеры окна изменились
Из свойств «Рабочей книги» выделим следующие (Таблица 8)
Таблица 8.
Основные свойства «Рабочей книги
FullName
Полное имя файла, в котором хранится книга
Name
Только имя файла
Names
Коллекция всех определенных имен ячеек и диапазонов
Path
Путь, где находится имя файла
Sheets
Коллекция всех листов книги
Styles
Коллекция стилей, присоединенных к книге
И в таблице 9 Вы можете познакомиться основными методами
Таблица 9. Основные методы для «Рабочей книги».
Activate
Делает активным окно книги
Close
Закрывает книгу
Protect
Защищает книгу от внесения изменений с помощью пароля
Save
Сохраняет файл
SaveAs
Сохраняет файл под заданным именем
Unprotect
Снимает защиту с книги
Рабочая книга включает в себя коллекцию объектов «Лист книги» (“Worksheet”). Заметим,
что имя коллекции “Worksheets”, и у коллекции, как у отдельного объекта есть свои
свойства и методы.
2
Основные события для «Листа книги» – Activate (Лист стал активным), Calculate
(Произошел пересчет листа), Change-(Содержимое одной из ячеек изменилось), Deactivate
(Лист перестал быть активным), SelectionChange- (Изменилась выделенная область на
листе). Основные свойства и методы «Листа книги» представлены таблицами 10 и 11.
Когда Вы будете знакомиться с этими свойствами, Вы заметите, что некоторые свойства
одновременно являются и объектами. Речь идет, например о коллекциях Cells, Columns,
Names и др.
Таблица 10. Основные свойства «Листа книги»
Cells
Ячейки текущего листа. Возможно обращение к конкретным
ячейкам
Columns
Столбцы текущего листа.
EnableCalculation
Разрешает или запрещает пересчет
EnableSelection
Рзрешает или запрещает выделение
Index
Номер листа в коллекции
Name
Имя листа
Names
Коллекция всех имен ячеек и диавпазонов листа
Next
Возвращает следующий лист книги
PageSetup
Создает доступ к параметрам страницы
Previous
Возвращает предыдущий лист книги
ProtectContents
Определяет, защищено ли содержимое листа
Range
Диапазон ячеек
Rows
Колонки текущего листа
UsedRange
Использованный диапазон ячеек
Visible
Определяет видимость объекта на рабочем листе
Таблица 11. Основные методы для листа книги
Activate
Делает лист активным
Add
Добавляет листы в рабочую книгу
Calculate
Выполняет пересчет листа
Copy
Копирует лист между указанными листами
Delete
Удаляет лист
Move
Перемещает лист в указанную позицию
Protect
Установка защиты на лист
SaveAs
Запись листа в отдельный файл
Select
Выделяет лист
И теперь наступила пора перейти к основному объекту в электронной таблице -объекту
доступа к ячейкам и к данным в ячейках –Range. Обратите внимание, что имя этого
объекта не имеет перевода, хотя можно попытаться по смыслу перевести как «Регион»
или «Область». Это действительно очень многогранный объект, и одновременно
коллекция с очень большим количеством различных свойств методов. Сначала давайте
вспомним, что обращение к ячейкам через Range – объект реализуется несколькими
способами.
 Прямая адресация – Range (“A1:B3”),
 через имя диапазона – Range(“itogi”),
 через стандартный выделенный Range-объект: ActiveCell или Selection,
 через объект Cells(<номер строки>, <номер столбца>).
Последний вариант имеет серьезные отличия от остальных тем, что к нему нельзя
применить некоторые методы и невозможно изменить ряд свойств ячейки, но в этом
способе есть важное преимущество – номер строки и номер столбца могут быть именами
переменных, а это расширяет возможности программирования. Однако в последних
3
версиях VBA появился еще один способ обращения к ячейкам - одновременно через
диапазон и ячейку внутри этого диапазона - Range(Cells(i, j), Cells(k,m)). Важность
этого способа заключается в том, что здесь одновременно можно применять приемы
работы, допустимые и для Range и для Cells. Отметим, что i и k во внутренних скобках
означают соответственно верхнюю и нижнюю строку диапазона, а j и m – номера левого и
правого столбцов выбранной области. Основные свойства и методы Range представлены
в таблицах 12 и 13.
Таблица 12. Свойства объекта Range
Areas
Возвращает одноименную коллекцию, объекты которой
представляют в форме диапазона все выделенные области
Cells
Возвращает все ячейки листа, к любой из них можно обратиться
через номер строки или столбца
Characters
Возвращает массив символов, представляющих содержащийся в
ячейке текст
Column
Возвращает номер первого столбца, относящегося к заданному
диапазону
Columns
Представляет все столбцы диапазона
ColumnWidth
Ширина столбцов в диапазоне
Count
Возвращает число ячеек в диапазоне
EntireColumn
Возвращает Range – объект, представляющий столбец, которому
принадлежит указанная ячейка или диапазон
EntireRow
Возвращает Range – объект, представляющий строку, которому
принадлежит указанная ячейка или диапазон
Font
Доступ к параметрам шрифта
Formula
Возвращает, содержащуюся в ячейке константу или формулу в
виде строки
FormulaHidden
Если лист защищен, при истинности этого свойства формула
будет скрыта
FormulaR1C1
Возвращает, содержащуюся в ячейке или формулу в виде строки
формата “R1C1”
Hidden
Делает строку или столбец скрытым или открытым
HorizontalAlignment
Определяет режим горизонтального выравнивания содержимого
ячеек диапазона
Interior
Возвращает объект типа Interior(Интерьер)
Locked
Защищает или снимает защиту ячейки от изменеий при общей
защите листа
Offset
Возвращает Range – объект, полученный смещением исходного
диапазона на заданное число строк и столбцов
Resize
Возвращает Range – объект, полученный изменением размеров
исходного диапазона до заданного числа строк и столбцов
Row
Возвращает номер строки для первой строки диапазона
RowHeight
Высота строк в диапазоне
Rows
Представляет все строки диапазона
Value
Содержимое ячейки
VerticalAlignment
Определяет режим вертикального выравнивания в ячейках
диапазона
WrapText
Разрешает перенос непомещающихся строк
Таблица 13. Основные методы для объекта Range
4
Делает текущей заданную ячейку
Автоматическое заполнение диапазона
Выполняет автоподбор ширины столбцов
Удаляет содержимое ячеек полностью
Удаляет комментарии к ячекам
Удаляет только содержимое ячеек
Удаляет форматирование
Удаляет диапазон с соответствующим сдвигом
Вставляет диапазон с соответствующим сдвигом
Выделяет диапазон
Возвращает Range – объект, представляющий все ячейки
листа, удовлетворяющие заданным условиям
Отметим, что в таблицах 7 -13 представлены именно основные свойства и методы
объектов электронной таблицы. Для того, чтобы получить больше сведений об объектах
Excel необходимо воспользоваться справочной системой VBA.
Activate
AutoFill
AutoFit
Clear
ClearComments
ClearContents
ClearFormats
Delete
Insert
Select
SpecialCells
Использование справочной системы VBA.
Среда программирования VBA содержит в себе стандартную справочную систему,
которой Вы можете воспользоваться – для этого достаточно в меню нажать кнопку Help.
Но оказывается, что существуют еще способы получения эффективной справки по
свойствам и методам и синтаксису языка. Чтобы воспользоваться этим методом
необходимо, находясь в среде программирования, нажать клавишу F2 или
воспользоваться меню View/Object Browser. В этом случае откроется окно, содержащее
список всех объектов, свойств, методов, констант. Это окно разбито на несколько частей.
В верхней части расположен список библиотек. Используя этот список, Вы можете
выбрать обзор сведений для VBA или для всех офисных приложений, или для Excel или
даже для Вашего проекта. Вы также можете воспользоваться строкой поиска. Предлагаем
Вам перейти в это окно и выполнить следующее упражнение.
Упражнение 5
1. Выберите из списка библиотеку для Excel.
2. В левой части окна выберите коллекцию Worksheets. В правой части окна Вы
увидите список свойств, объектов и методов для этой коллекции.
3. Используя таблицы 10-11, определите какая из иконок, расположенная слева от
слов списка означает метод, свойство или событие.
4. После Вашего выбора в левой части окна Вы увидите перечень основных объектов
и их коллекций, а также классов констант. При выборе какого нибудь слова из
этого перечня в правой части окна Вы получите полный список методов, свойств и
событий для выбранного Вами объекта или коллекции.
5. В левой части окна выберите объект Worksheet. Сравните, на сколько изменился
список элементов справа для объекта, по сравнению с коллекцией.
6. Выбирая элементы из списка справа, посмотрите, как меняется подсказка в нижней
части листа. Если вы нажмете клавишу F1, то Вы сможете получить подробные
сведения по выбранному слову.
7. В левой части окна выберите элемент XlChartType (Коллекция констант типов
диаграмм). С правой стороны Вы увидите перечень имен всех констант,
соответствующих различным типам диаграмм, которые Вам может предоставить
Excel. Внизу окна будет показано числовое значение константы.
8. Используя верхний список перейдите в библиотеку VBA. Слева выберите модуль
Math. Справа Вы получите полный список встроенных математических функций
VBA. Выберите слева модуль ColorConstant. Справа появится список встроенных в
язык цветовых констант, о которых мы говорили раньше.
5
9. Через верхний список перейдите в библиотеку VBAproject. Теперь Вы можете
познакомиться с основными элементами, имеющими отношение к Вашему
проекту.
О «быстром» программировании
Давайте вспомним наше упражнение, в котором мы с помощью полосы прокрутки
создавали возможность бесклавиатурного ввода символов. Обратите внимание, что
создать такую программу не очень сложно. Это в первую очередь связано с тем, что мы
одновременно использовали и возможности электронной таблицы и возможности языка
программирования. Действительно, еще раз отметим, что сама по себе электронная
таблица Excel – мощнейший инструмент для переработки самой разной информации.
Около ста самых разных вычислительных функций, разнообразие диаграмм,
великолепный интерфейс, наличие различных надстроек и дополнительных пакетов, связь
с другими приложениями Microsoft Office позволяют решить практически любую задачу.
Но все эти задачи успешны, если они связаны с непосредственными действиями
пользователя. Основной недостаток заключается в том, что мы не можем без
программирования дать компьютеру – нашему исполнителю «запланированное
поручение» на несколько шагов вперед. При постоянном решений задач одного и того же
класса
такая потребность, в конце концов,
появляется. Таким образом,
программирование выступает не как самоцель, а как вспомогательное средство, что бы
быстрее решить ту или иную задачу. При этом нет необходимости решать комплекс тех
проблем, которые возникают при создании проектов в случае чистого программирования
– организация ввода и вывода данных, создание вычислительных процедур, оформление
интерфейса и диалога с пользователем, построение графиков и т.д. Мало того,
стандартные элементы управления имеют ряд свойств, которые связаны с объектами
электронной таблицы, то есть обеспечивают взаимодействие VBA и офисного
приложения.
Отметим также, что ячейки ЭТ можно рассматривать как ячейки памяти и, используя
формулы и функции, как самой таблицы, так и VBA устанавливать связи между ними,
что является достаточно наглядным. Благодаря этой наглядности значительно упрощается
процесс отладки программ. И еще раз напомним важную возможность, о которой не
стоит забывать – практически все действия, которые предоставлены пользователю в меню
электронной таблицы по отношению к ячейкам поддерживаются соответствующими
методами и свойствами языка программирования..
Создание пользовательской функции
Следующее наше упражнение, иллюстрирующее очередные возможности VBA
–
создание пользовательской функции. Это полезно делать в тех случаях, когда
необходимой для Вас функции нет в стандартном наборе функций, например формулы
теоремы Пифагора. Напомним, что согласно этой теореме, гипотенуза в прямоугольном
треугольнике равна корню квадратному из суммы квадратов катетов.
Упражнение 6
1. Откройте чистую рабочую книгу и перейдите в среду программирования VBA.
2. Убедитесь, что в списке рабочих книг в окне Project Explorer есть книга со
стандартным именем PERSONAL.XLS. Эта книга шаблонов, как правило,
существует на каждом компьютере и в ней хранятся различные макросы,
созданные пользователями. Если этой книги нет, то необходимо вернуться в
электронную таблицу и записать какой-нибудь простенький макрос с сохранением
его в книге PERSONAL.XLS. Вернувшись в среду программирования в списке
рабочих книг увидите PERSONAL.XLS.
3. Двойным щелчком по модулю Module1 книги PERSONAL.XLS вызовите в окне
кодов окно для этого модуля.
6
4. Расположите текстовый курсор внутри окна кодов. Через команды меню
Isert/Procedure открываем окно Add Procedure.
5. В этом окне набираем имя процедуры, как всегда предпочитая латинский шрифт,
например Pifagor.
6. В качестве типа процедуры выбираем Function и нажимаем OK
7. Теперь в окне кодов появились две строчки
Public Function pifagor()
End Function
8. Вспомнив, что в теореме Пифагора нужно знать значения двух катетов a и b,
впечатаем
две переменные под этими же именами внутрь скобок
Public Function pifagor(a,b)
9. Теперь пишем саму формулу теоремы Пифагора, и в качестве имени переменной,
где
будет
храниться
результат
используем
имя
функции
Pifagor=(a * a + b * b) ^ 0.5
10. Окончательно убеждаемся в том, что в окне модуля книги Module1 книги
PERSONAL.XLS записана следующая процедура
Public Function Pifagor(a, b)
Pifagor = (a * a + b * b) ^ 0.5
End Function
11. Переходим на рабочий лист электронной таблицы, размещаем в двух любых
ячейках два числа – длины катетов, и для третьей ячейки вызываем мастер
функций, а в появившемся окне в категории «Определенные пользователем»
находим «нашего» Pifagora. Выбрав эту функцию, убедитесь в ее
работоспособности.
Именно таким образом можно электронную таблицу, расположенную на Вашем
компьютере обогатить набором необходимых для Вас формул.
Ввод и вывод данных.
Наступила пора познакомиться тем, каким образом в VBA можно вводить и выводить
данные. Рассмотрим различные варианты.
Ряд элементов управления имеют свойство LinkedCell (Ячейка связи). Если в окне свойств
для этого свойства проставить адрес какой-нибудь ячейки, то содержимое этой ячейки и
значение Value или Text элемента управления будут связаны между собой. Менять это
содержимое можно как в элементе управления, так и в ячейке.
Обмен данными с помощью программных кодов происходит в соответствии с правилом:
слева от знака «=» располагается приемник информации, справа – источник. Приводим
примеры
Х1=Cells(3,8) – в переменную Х1 дублируется содержимое из ячейки, расположенной в 3
строке и 8 столбце
Cells(3,8)=Х1 – здесь в ячейку копируется значение переменной. Важно помнить, что
старое содержимое ячейки удаляется.
Х1=TextBox1.Text – в переменную Х1 копируется текст из элемента управления Text1.
TextBox1.Text= Х1 в качестве текста в текстовом окне будет представлено содержимое
переменной Х1.
Естественно возможны и такие варианты
Cells(3,8)=Label1.Caption
Или
Label1.Caption= Cells(3,8)
Кроме того, в VBA существуют специальные функции ввода – вывода данных InputBox
и MsgBox. О порядке работы с ними мы познакомим Вас позже.
7
В отдельных случаях, когда необходимо собрать разные данные в одном месте,
целесообразно воспользоваться элементом управления UserForm (Пользовательская
форма).
Упражнение 7
1.
Откройте чистую рабочую книгу.
2.
Перейдите на Лист 2 и в ячейку В3 введите три пятерки – 555, затем в ячейку D3
Листа 3 введите три семерки – 777.
3.
Через меню Вид/Панели инструментов/Элементы управления откройте
панель элементов управления
4.
Перейдите в редактор VBA и раскройте, если его нет, окно проектов. Выделите в
этом окне строку VBAproject (Книга1). Это книга, в которой Вы работаете.
5.
В меню выберите команду Insert/UserForm.
6.
После этих действий на экране появится окно с панелью серого цвета, покрытой
точечной сеткой. Это и есть пользовательская форма.
7.
Через меню View/ToolBox вызовите панель элементов управления, связанную с
пользовательской формой
8.
Щелчком мыши выделите пользовательскую форму
9.
Расположите на этой форме элемент управления Кнопка (CommandButton) и два
текстовых окна (TextBox)
10.
Откройте окно свойств и если элемент Кнопка выделен, то Вы в этом окне увидите
свойства этого элемента.
11.
Измените у этого элемента свойство Caption, так чтобы на поверхности кнопки
было видно слово «Приветствие»
12.
Сделайте двойной щелчок по кнопке и откроется окно кодов для пользовательской
формы (ее модуль), в которой будут заготовлены строчки для написания процедуры по
щелчок
по
кнопке
Private
Sub
CommandButton1_Click()
End Sub
13.
Теперь будем вписывать код. Сначала объявляем переменную а как строковую
Dim
a
As
String
Не забывайте следить за типом шрифта. Код пишется латинскими буквами
14.
Следующие команды копируют содержимое ячеек из Листа 2 и Листа 3. в
текстовые
окна
TextBox1.Text
=
Worksheets(2).Cells(3,
2)
TextBox2.Text = Worksheets(3).Cells(3, 4)
15.
Затем вызовем функцию InputBox. Эта функция предлагает пользователю ввести
данные (фразы, слова), которые мы запомним в строковой переменной а. Код должен
быть
таким
a
=
InputBox("Как
Вас
зовут",
"Знакомство")
«Как
Вас
зовут»
–
это
сообщение
для
пользователя
«Знакомство»
–
это
заголовок
окна
Пользователь введет свое имя, и оно сохранится в строковой переменной а
16.
Теперь вызываем функцию MsgBox, которая просто выводит сообщения, но в
сообщение
вставим
слово
«Привет»
и
имя
пользователя
x = MsgBox("Привет " & a)
17.
Имя, которое ввел пользователь, отправим в ячейки, где у нас были введены
цифры.
Worksheets(2).Cells(3,
2)
=
a
Worksheets(3).Cells(3, 4) = a
8
18.
Общий
вид
кода
Private
Sub
CommandButton1_Click()
Dim
a
As
String
TextBox1.Text
=
Worksheets(2).Cells(3,
2)
TextBox2.Text
=
Worksheets(3).Cells(3,
4)
a
=
InputBox("Как
Вас
зовут",
"Знакомство")
x
=
MsgBox("Привет
"
&
a)
Worksheets(2).Cells(3,
2)
=
a
Worksheets(3).Cells(3,
4)
=
a
End Sub
19.
Следующая задача вывести форму вместе с кнопкой на рабочий лист. (Лист1). Для
этого в окне проекта выделяем двойным щелчком строку Лист1(Лист1), и раскрывается
окно кодов для этого листа.
20.
В верхней строке слева из списка выбираем слово Worksheet (скорее всего, оно там
и будет), а справа слово Activate. Тогда редактор предложит написать процедуру под
событие
«Лист1
стал
активным».
Вы
увидите
в
окне
строки
Private
Sub
Worksheet_Activate()
End Sub
21.
В этой процедуре сделаем так, чтобы пользовательская форма стала видна когда
мы
откроем
Лист1.
Полный
вид
процедуры
Private
Sub
Worksheet_Activate()
UserForm1.Show
End Sub
22.
Программа составлена. Теперь перейдите в рабочую книгу (Лист1), потом откройте
литс2 и затем опять откройте (сделайте активным) лист 1. Должна появиться форма.
Щелкните по кнопке и выполните «требования программы. Когда Вы «познакомитесь»,
проверьте – в ячейках на 2 и 3 листах вместо цифр должен быть текст, введенный при
знакомстве.
Данное упражнение иллюстрируется файлом «Ввод-Вывод.xls”
Быстрое построение графика.
Те, кто достаточно хорошо освоил Excel, наверняка представляют себе как можно
построить график какой-нибудь функции, где У зависит от Х. Для этого нужно заполнить
два столбика – в первом столбике определенное количество значений Х, а во втором –
рассчитанные по формуле функции соответствующие значения У. Затем эти два столбика
выделяются и с помощью мастера диаграмм строится точечный график. В этом процессе
есть одна малоприятная деталь – набор формулы. Вообще, в большинстве языков
программирования пользователь созданной программы не может изменять расчетную
формулу. Как правило, программирование такой возможности – сложный процесс. Мы
расскажем, как просто это можно сделать с помощью VBA.
Сначала об идее – допустим все значения Х, которые нам нужны для построения графика
находятся в ячейках А4:А104. Рассчитанные значения У должны располагаться в
диапазоне В4:В104. Для оформления расчетов нам в этот диапазон нужно ввести формулу.
Для определенности выберем формулу У=Х^2+X-5. Тогда в ячейке В4 формула будет
имеет вид
«=А4^2+A4-5”. Затем, с помощью протаскивания эта формула
распространяется на все ячейки диапазона и можно строить график. Но оказывается, что
если в объект Range программно вводить формулу, то эта формула будет видоизменена в
соответствии с расположением ячеек относительно друг друга. Другими словами, мы
пишем формулу только для первой ячейки, а программа сама ее переделает для
остальных. Мало того, мы для удобства пользователя можем создать текстовое окно, куда
9
он будет вводить формулу в естественном виде, а дело программы – превратить ее в
расчетную.
Познакомиться с работой этой программы можно в файле «Графики.xls”. Код программы
с объяснениями предлагается ниже.
Private Sub CommandButton1_Click()
Dim a As String, b As String, ñ As Объявление трех строковых и одной
целочисленной переменных
String, z As Integer1
В переменную а копируем содержимое
a = TextBox1.Text
текстового окна, то есть формулу.
В дальнейшем процедура будет работать, если
If Not a = "" Then
строка а не пустая.
В строковой переменной с начинаем
c = "="
формировать расчетную формулу, которая
начинается со знака «равно»
Определяем число символов в формуле. Для
z = Len(a)
этого используем встроенную функцию VBALen()
Начинаем цикл, в котором анализируем
For k = 1 To z
каждый символ.
Для этого по очереди вырезаем из формулы
b = Mid(a, k, 1)
по символу (используем функцию VBA –
mid()), помещаем его в переменную b
И если этим символом является х или Х, то
If b = "x" Or b = "X" Then b = "a4"
заменяем его на А4
В переменную с добавляем очередной символ,
c=c+b
но теперь вместо х там будет А4
Конец конструкции For…Next
Next k
Конец конструкции If…EndIf
End If
Worksheets("Graf").Range("b4:b104") Расчетную формулу вводим в диапазон
“b4:b104”
=c
End Sub
Выделяем ячейку…и получаем массу возможностей
Основная задача этого примера – показать, какие еще возможности VBA можно
использовать при вызове процедур через событие. Среди событий рабочего листа обратим
внимание на событие SelectionChange, которое запускает процедуру с именем
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
При работе этой процедуры используется переменная с именем Target, а тип этой
переменной – Range, то есть диапазон выделенных ячеек. Это означает, что данная
процедура в качестве переменной запоминает выделенные ячейки, и открывается
возможность программно их обрабатывать. Это представляется удобным в тех случаях,
когда в электронной таблице различные данные трудно собрать для обзора в одной
зрительной зоне. Как правило, это различные каталоги, подробные списки сотрудников,
оборудования и т.д. Было бы неплохо, если бы при выборе какой-нибудь строки появилась
возможность увидеть всю строку в компактном виде, и, если есть необходимость,
обработать ее. Рассмотрим пример, в котором необходимо отредактировать вопросы
теста. (Файл «Вывод в форму»). Так получилось, что в исходном файле вопросы теста,
справочная информация и заголовок темы повторяются, в то время как ответы на вопросы
расположены в четырех строках, следующих друг за другом. При написании процедуры
1 Из-за технических причин строка кода в таблице может быть разбита на несколько. В
программном коде это недопустимо, или используют специальные приемы.
10
была поставлена цель - собрать в одном месте заголовок темы, вопрос, 4 ответа, и отметку
«+» около правильного ответа. Прежде чем рассматривать коды примера, отметим, что
заголовок темы располагается в 1-м столбце, вопрос – в 3-м, справочный материал – в 4-м,
ответы – в 5-м, и отметка «+» - в 6-м столбцах. Кроме того каждый новый вопрос
начинается в 1-й, 5-й, 9-й и т.д. строке. Для наглядности эти строки выделены желтым
цветом. Необходимо, чтобы при щелчке пользователя по любой ячейке из этих строк
необходимая информация по его желанию выводилась бы в компактном виде. В этом
случае целесообразно применить очень эффективный элемент управления UserForm
(Пользовательская форма), на которой, в свою очередь размещались элементы
управления Надпись (Label) и Кнопка (CommandButton). Вставляется пользовательская
форма в проект через команды меню среды VBA
Insert/UserForm. При этом появляется дополнительный модуль, в котором
размещаются процедуры, связанные с событиями самой формы и элементов управления,
находящихся на ней.
Познакомимся с кодами
Private
Sub
Worksheet_SelectionChange(ByVal
Target As Range)
Процедура
сработает,
если
будет
If Target.Count = 1 Then
выделена только одна ячейка
В переменной х запомним номер строки,
x = Target.Row
в которой выделена ячейка
Процедура сработает, если х будет равен
If x Mod 4 = 1 Then
1, 5, 9, 13 и т.д.
Значение х копируется в ячейку H8/
Cells(1, 8) = x
И передается в строковую переменную
a$ = Str(x)
Используется функция MsgBox
otvet = MsgBox(a$, 1)
Если пользователь «дает согласие», то
If otvet = 1 Then
выполняется ряд следующих действий.
Текст вопроса запоминается в строковой
b$ = Cells(x, 3)
переменной b$
В различные элементы управления,
UserForm1.Label1.Caption = Cells(x, 1)
расположенные на форме копируется
UserForm1.Label2.Caption = b$
содержимое ячеек рабочего листа,
UserForm1.Label3.Caption = Cells(x, 4)
имеющих отношение к выбранному
UserForm1.Label4.Caption = Cells(x, 5)
UserForm1.Label5.Caption = Cells(x+1, 5) вопросу.
UserForm1.Label6.Caption = Cells(x+2, 5)
UserForm1.Label7.Caption = Cells(x+3, 5)
UserForm1.Label8.Caption = Cells(x, 6)
UserForm1.Label9.Caption = Cells(x1, 6)
UserForm1.Label10.Caption = Cells(x+2,6)
UserForm1.Label11.Caption = Cells(x+3,6)
Форма становится видимой
UserForm1.Show
Закрываются конструкции If…EndIf
End If
End If
End If
End Sub
Сделаем пояснения к некоторым строчкам кода.
11
If x Mod 4 = 1 Then – нас интересуют 1, 5, 9 и т.д. строки. Номера этих строк делятся на
4 с остатком 1. Для определения целочисленного остатка используем встроенную функция
mod.
otvet = MsgBox(a$, 1) – Используя функцию MsgBox, выводим на экран номер строки
(в строковой переменной a$), и если пользователь отвечает «ОК», то переменная otvet
становится равной 1. Подробности по этой функции смотрите в справочной системе.
Кнопка «Сброс», находящаяся на форме, по щелчку запускает процедуру, которая
закрывает форму через метод Hide: UserForm1.Hide.
В следующем разделе мы познакомимся с развитием этого примера, когда информация
размещенная на форме переносится в рабочий лист электронной таблицы.
Однорукий бандит
В этом примере Вы увидите, как можно, сочетая свойства таблицы и VBA создать
небольшую игровую программу. Кроме того, Вы сможете познакомиться с логическими
функциями электронной таблицы, понять в каких случаях необходимо объявляет
переменные в начале блока. Заметим, что коды программы вынесено только то, что
невозможно сделать через электронную таблицу.
Сначала о логике игры. С помощью встроенной функции в трех ячейках создаются
случайные числа в диапазоне от 1 до 9. С помощью функции «Если…» происходит
попарно сравнение этих чисел, и при совпадение одной любой пары в соответствующей
ячейке устанавливается выражение «Истина». За это отвечает блок F3:H3. В ячейке I3
значение «Истина» будет, если совпадет хоть одна пара, а в I4 – если все пары. В
соседнем столбце J будут изменяться число набранных баллов. Для ложного результата –
это –10, а для истинного или 15, или 30. Для добавления к общему числу баллов берется
максимальное значение, полученное за очередной ход.
В блоке General объявляем две переменные
Dim Ball As Integer, xod As Integer
Private Sub CommandButton1_Click()
xod = 0
Ball = 300
Label1.Caption = Ball
Label2.Caption = xod
CommandButton1.Enabled = False
Процедура для кнопки «Новая игра»
Задаем начальное значение для числа
ходов…
И количества баллов
Выводим эти значения в соответствующие
окошки
Теперь эта кнопка не нужна и она
неактивна.
End Sub
Private Sub CommandButton2_Click()
If Ball > 0 Then
Calculate
xod = xod + 1
Ball = Ball + Cells(5, 10)
Процедура для кнопки «Ваш ход»
Процедура работает, если у Вас есть очки
Пересчет рабочего листа, появление новых
чисел
Число ходов увеличено на 1
А число баллов изменилось в зависимости
от выпавших чисел
Результат
отображается
в
соответствующих окошках
Если Вы «обанкротились»
То можно начать «Новую игру»
Label1.Caption = Ball
Label2.Caption = xod
Else
CommandButton1.Enabled = True
End If
End Sub
Для игры сначала нажмите «Новая игра», а затем многократно нажимайте «Ваш ход»,
пока не проиграете. Победит тот, кто продержится больше ходов. Успеха Вам. Этот
пример иллюстрируется файлом «Однорукий бандит.xls”.
12
Секундомер
В этом примере Вы увидите, как могут быть связаны между собой отдельные процедуры,
и как можно использовать VBA, не прибегая к событиям, связанным со стандартными
элементами управления.
Идея программы заключалась в создании секундомера. В качестве «источника» времени
используются часы компьютера. В VBA есть встроенная функция Timer, которая
позволяет определить время в данный момент. На этот раз в отдельном блоке мы запишем
три процедуры
Dim sstart As Single
Dim flag As Boolean
В блоке General объявляем две переменные,
одна из которых – логическая.
Public Sub start()
sstart = Timer
Процедура по имени start
В переменной sstart запоминается значение
текущего времени в тот момент, когда запущена
процедура.
Значение логической переменной - Истина
flag = True
End Sub
Public Function ttimer()
If flag Then ttimer = Timer - sstart
Имя функции – ttimer
Если flag «разрешает», то есть имеет значение
«Истина», то функция ttimer вычислит разницу
между текущим временем и временем старта
секундомера
End Function
Public Sub sstop()
flag = False
sstart = 0
End Sub
Процедура остановки секундомера.
Переменная flag получила значение
функция ttimer не «сработает»
Произошел сброс секундомера.
Ложь и
Работу секундомера будем наблюдать на отдельном листе. Причем, если пользователь
щелкнет по ячейке со словом «start», то секундомер запустится, если по любой пустой
ячейке, то на элементе управления Label появится время, прошедшее с момента старта. И
для остановки секундомера достаточно выделить ячейку “Stop”. Посмотрите, какими
инструкциями это обеспечивается.
под
стандартное
собыие
Private
Sub Процойедура
Worksheet_SelectionChange(ByVal SelectionChange
Target As Range)
Важно, чтобыла выделена только одна ячейка.
If Target.Count = 1 Then
Свойство Count- количество ячеек.
Одновременно начинает В этом случае
выполняются коды внутри блока If
Затем, смотрим какая ячейка выделена. Если это
If Target = "start" Then
“Start”, то
Показываем в надписи 0,
Label1 = 0
Запускаем процедуру start
start
И выходим из этого блока
End If
13
If Target = "stop" Then sstop
If Target = "" Then Label1 = ttimer
Если выделена “Stop”, то вызываем процедуру
остановки секундомера
Если выделена любая пустая ячейка, в надписи
отображается время, вычисленное функцией
ttimer.
Выход из внешнего блока If…EndIf.
End If
End Sub
Этот пример иллюстрирован файлом “Секундомер.xls”
Живая диаграмма
Наступила пора рассказать еще об одной замечательной возможности VBA – о «живых»
диаграммах. Большинство пользователей знают, что в электронной таблице можно
построить самые разные диаграммы. Оказывается, можно сделать так, что диаграммы и
графики оживут. Давайте создадим простейшую модель вращения Луны вокруг Земли.
Упражнение 8
1. Откройте чистую рабочую книгу. Убедитесь, что Вы находитесь на Листе1.
2. Занесите в ячейки таблицы данные в соответствии с таблицей, в которой указаны
только
необходимые
элементы
Адрес ячейки
A2
B2
C2
D2
E2
B3
C3
D3
E3
E4
Содержимое
0
=5*cos(A2)
=5*sin(A2)
1
4
0
0
5
=ПИ()
=2*E3*E2
Параметр
Х-координата Луны
Y – координата Луны
Размер Луны
Число оборотов
Х координата Земли
Y- координата Земли
Размер Земли
Число Пи
Максимальное
параметра
значение
3. Сравните, что получилось у Вас, с тем, что изображено на рисунке. Надписи в
ячейках используются для пояснений.
4. Выделите блок B2:D5 и с помощью Мастера Диаграмм постройте пузырьковую
диаграмму. Для первого ряда используются данные B2:D2, а для второго ряда –
B3:D3.
5. Используя приемы работы с диаграммой, откройте окно «Формат оси» для оси Y и
установите максимальное и минимальное значение оси соответственно 6 и -6.
Уберите галочки «Авто» для этих опций. То же самое проделайте для оси Х.
6. Если Вы сейчас будете менять значение параметра в ячейке А2, то будут меняться
координаты Луны и соответственно ее положение на диаграмме. Осталось
14
автоматизировать этот процесс. Составим процедуру, в которой параметр t будем
менять от 0 до максимального значения.
7. Создайте командную кнопку и в окне кодов VBA под событие Click для этой
кнопки
наберите
код
Private
Sub
CommandButton1_Click()
For
t
=
0
To
Cells(4,
5)
Step
0.1
Cells(2,
1)
=
t
DoEvents
Next
End Sub
8. Запустите программу, и убедитесь в ее работоспособности. Число оборотов можно
менять через ячейку Е2.
Данное упражнение сопровождается файлом «Земля-Луна.xls»
В последнем примере в кодах появилась строчка DoEvents. Смысл этой инструкции в
том, чтобы дать возможность приложению показать на диаграмме новое положение Луны.
В том же файле, на Листе2 Вы можете посмотреть как достаточно просто можно создать
(схематическое) изображение секундомера.
А теперь задание- В этом же письме расположен файл dom1.xls в котором показано как
точка, начав движение внутри площадки, ограниченной красной рамки прекращает свое
движение в тот момент, когда она попадает в домик, обозначенный голубым
прямоугольником. Коды этой программы раскрыты.
В файле dompar2.xls это движение выглядит несколько по другому. Но коды закрыты.
Ваша задача – написать коды для этой программы. Сроки – до начала весенних каникул.
последний срок – 24 марта 23 час 59 мин
Download