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 мин