Начало работы с VBA в Excel 2010

Сводка. Эта статья знакомит опытных пользователей Excel, не являющихся программистами, с использованием языка Visual Basic для приложений (VBA) в Excel 2010. Данный раздел содержит обзор языка VBA, инструкции по доступу к VBA в Outlook 2010, подробное решение практической проблемы с помощью программирования на VBA в Excel, а также советы по программированию и отладке.

Дата последнего изменения: 11 декабря 2009 г.

Применимо к: Excel 2010 | Office 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications (VBA)

В этой статье
Зачем может понадобиться VBA в Excel 2010?
Основы программирования на VBA
Макросы и редактор Visual Basic
Практический пример
Изменение записанного кода
Дополнительные возможности использования VBA
Что дальше?
Дополнительные ресурсы

Значок участника сообщества Бен Чиновски (Ben Chinowsky), SDK Bridge

Ноябрь 2009 г.

Область применения: Microsoft Excel 2010

Содержание

  • Зачем может понадобиться VBA в Excel 2010?

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

  • Макросы и редактор Visual Basic

  • Практический пример

  • Изменение записанного кода

  • Дополнительные возможности использования VBA

  • Что дальше?

  • Дополнительные ресурсы

Зачем может понадобиться VBA в Excel 2010?

Microsoft Excel 2010 — это очень мощный инструмент, который можно использовать для управления данными, их анализа и представления. Но иногда, несмотря на богатый набор возможностей стандартного интерфейса пользователя Excel, может понадобиться найти несложный способ выполнять повседневные повторяющиеся задачи или какие-то задачи, которые не удается решить с помощью интерфейса пользователя. К счастью в приложения Office, такие как Excel, интегрирован Visual Basic для приложений (VBA), язык программирования, позволяющий расширять возможности этих приложений.

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

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

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

Но VBA предназначен не только для повторяющихся задач. VBA также можно использовать для создания новых возможностей в Excel (например, можно разработать новые алгоритмы анализа данных, а затем воспользоваться возможностями построения диаграмм в Excel для отображения результатов) и для выполнения задач, интегрирующих Excel с другими приложениями Office, такими как Microsoft Access 2010. Фактически, из всех приложений Office программа Excel является одной из чаще всего используемых в качестве чего-то, похожего на общую платформу разработки. Кроме всех очевидных задач, касающихся списков и бухгалтерии, разработчики используют Excel в ряде задач, от визуализации до создания прототипов программ.

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

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

Использование кода для выполнения операций приложениями

Может показаться, что написание кода — сложный или загадочный процесс, но его базовые принципы основаны на применении повседневной логики и вполне доступны. Приложения Office 2010 созданы так, чтобы предоставлять сущности, называемые объектами, которые могут принимать инструкции. Пользователь может взаимодействовать с приложениями, отправляя инструкции различным объектам приложения. Эти объекты являются многочисленными, разнообразными и гибкими, но у них есть свои ограничения. Они могут делать только то, для чего были разработаны, и выполняют только написанные для них инструкции.

Объекты

Программируемые объекты связаны друг с другом в иерархию, называемую объектной моделью приложения. Грубо говоря, объектная модель отражает то, что показывается в интерфейсе пользователя, например, объектная модель Excel содержит, среди многих других, объекты Application, Workbook, Sheet и Chart. Объектная модель является общей картой приложения и его возможностей.

Свойства и методы

Управлять объектами можно, задавая их свойства и вызывая их методы. Задание свойства изменяет некоторое качество объекта. Вызов метода заставляет объект выполнить некоторое действие. Например, у объекта Workbook есть метод Close, закрывающий книгу, и свойство ActiveSheet, представляющее лист, активный в данный момент в книге.

Коллекции

Многие объекты поставляются в версиях единственного и множественного числа — Workbook и Workbooks, Worksheet и Worksheets и т. д. Версии множественного числа называются коллекциями. Объекты коллекции используются для выполнения действия над несколькими объектами коллекции. Позднее в данной статье рассматривается, как использовать коллекцию Worksheets для изменения имени каждого листа книги.

Макросы и редактор Visual Basic

Теперь, познакомившись с предоставлением объектной модели приложения Microsoft Excel 2010, можно попробовать вызвать методы объекта и задать его свойства. Для этого необходимо написать свой код таким образом, чтобы он распознавался в Office. Обычно это делается с помощью редактора Visual Basic. Несмотря на то, что он установлен по умолчанию, многие пользователи не знают о его наличии, пока этот редактор не будет включен его на ленте.

Вкладка "Разработчик"

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

Включение вкладки "Разработчик"

  1. На вкладке Файл выберите Параметры, чтобы открыть диалоговое окно Параметры Excel.

  2. Щелкните Настройка ленты в левой части диалогового окна.

  3. В разделе Выбрать команды из, расположенном слева в окне, выберите Популярные команды.

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

  5. Нажмите кнопку ОК.

Когда вкладка Разработчик появится в интерфейсе Excel, обратите внимание на местонахождение на вкладке кнопок Visual Basic, Макрос и Безопасность макросов.

Рисунок 1. Вкладка "Разработчик" в Excel 2010

Вкладка "Разработчик" в Excel 2010

Проблемы безопасности

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

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

Кроме того, в качестве мер безопасности, нельзя сохранить макрос в формате файлов Excel, используемом по умолчанию (XLSX-файлы), вместо этого макрос должен быть сохранен в файл со специальным расширением, XLSM-файл.

Редактор Visual Basic

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

Создание новой пустой книги

  1. Нажмите кнопку Макрос на вкладке "Разработчик"

  2. В открывшемся диалоговом окне Макрос введите Hello в поле Имя макроса.

  3. Нажмите кнопку Создать, чтобы открыть редактор Visual Basic с уже введенной структурой нового макроса.

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

Рисунок 2. Редактор Visual Basic

Редактор Visual Basic

Редактор Visual Basic содержит следующий код.

Sub Hello()

End Sub

Sub — это сокращение от Subroutine (подпрограмма), которую в данном случае можно определить как "макрос". Вызов макроса Hello приведет к выполнению любого кода между строчками Sub Hello() и End Sub.

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

Sub Hello()
   MsgBox ("Hello, world!")
End Sub

Вернитесь на вкладку Разработчик в Excel, а затем снова нажмите кнопку Макрос.

Выберите макрос Hello в появляющемся списке, а затем нажмите кнопку Выполнить, чтобы вывести небольшое окно сообщения, содержащее текст "Hello, world!".

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

Если окно сообщения не появляется, проверьте настройки безопасности макросов и перезапустите Excel.

Предоставление доступа к макросам

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

Чтобы создать кнопку для макроса Hello на Панели быстрого доступа, используйте следующую процедуру.

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

Создание кнопки для макроса на панели быстрого доступа

  1. Перейдите на вкладку Файл.

  2. Нажмите кнопку Параметры, чтобы открыть диалоговое окно Параметры Excel, а затем щелкните Панель быстрого доступа.

  3. В списке под надписью Выбрать команды из: выберите Макрос. Найдите текст, похожий на Книга1!Hello, в появляющемся списке и выберите этот текст.

  4. Нажмите кнопку Добавить >>, чтобы добавить макрос в список с правой стороны, а затем нажмите кнопку Изменить…, чтобы выбрать изображение кнопки, связываемой с макросом.

  5. Нажмите кнопку ОК. Новая кнопка должна появиться на Панели быстрого доступа над вкладкой Файл.

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

Практический пример

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

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

Знакомство с объектами

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

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

Рисунок 3. Справочник по объектной модели Excel на сайте MSDN

Справочник по объектной модели Excel на сайте MSDN

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

  • Непосредственное использование справочного руководства по объектной модели.

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

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

Использование записи макроса

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

Использование записи макроса в качестве отправной точки решения

  1. Запишите действия, которые нужно кодировать.

  2. Просмотрите код и найдите строки, выполняющие действия.

  3. Удалите оставшуюся часть кода.

  4. Измените записанный код.

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

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

Запись макроса, переименовывающего лист

  1. Нажмите кнопку Записать макрос на вкладке Разработчик.

  2. Назовите макрос RenameWorksheets, переименуйте Лист1 в Новое имя и нажмите кнопкуОстановить запись.

  3. На вкладке Разработчик или Вид нажмите кнопку Макрос и выберите Изменить, чтобы открыть редактор Visual Basic.

Код в редакторе Visual Basic должен быть похож на следующий код.

Sub RenameWorksheets()
'
' RenameWorksheets Macro
'
'
    Sheets("Sheet1").Select
    Sheets("Sheet1").Name = "New Name"
End Sub

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

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

  • Чтобы временно отключить строку кода (закомментировать).

Четыре строки комментариев в записанном макросе не решают никаких задач, поэтому удалите их.

Следующая строка использует метод Select, чтобы выбрать член Sheet1 (Лист1) объекта коллекции Sheets. В коде VBA обычно не нужно выбирать объекты перед работой с ними, даже если это делается при записи макросов. Другими словами, эта строка кода является избыточной, поэтому ее тоже можно удалить.

Последняя строка записанного макроса изменяет свойство "Name" члена Sheet1 коллекции Sheets. Эту строку нужно сохранить.

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

Sub RenameWorksheets()
    Sheets("Sheet1").Name = "New Name"
End Sub

Вручную измените имя листа "Новое имя" обратно на "Лист1", затем выполните макрос. Имя должно измениться обратно на "Новое имя".

Изменение записанного кода

Теперь самое время изучить коллекцию Sheets, используемую при записи макроса. Раздел "Листы" в справочном руководстве по объектной модели содержит следующий текст.

"Коллекция Sheets может содержать объекты Chart или Worksheet. Если нужно работать только с листами одного типа, просмотрите раздел об объекте этого типа листа".

Используется только коллекция Worksheets, поэтому изменить код следующим образом.

Sub RenameWorksheets()
    Worksheets("Sheet1").Name = "New Name"
End Sub

Циклы

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

В VBA есть конструкция, называемая циклом For Each и идеально подходящая для этого случая. Цикл For Each проверяет все элементы в объекте коллекции, таком как Worksheets, и может использоваться для выполнения действия (например, изменения имени) над некоторыми или над всеми этими элементами.

Дополнительные сведения о цикле For Each см. в справочном руководстве по языку VBA. Щелкните "Visual Basic Conceptual Topics" (Концептуальные темы Visual Basic), затем "Using For Each...Next Statements" (Использование инструкций For Each...Next). Кроме того, помните, что справочное руководство по языку VBA, как и справочное руководство по объектной модели, сторицей окупит время, потраченное на его изучение, и является отличным местом для поиска идей при плотной работе над кодом.

Используя третий пример в разделе "Using For Each...Next Statements" (Использование инструкций For Each...Next), измените макрос так, чтобы он стал похож на следующий код.

Sub RenameWorksheets()
For Each myWorksheet In Worksheets
    myWorksheet.Name = "New Name"
Next
End Sub

myWorksheet является переменной, то есть ее значение меняется. В этом случае переменная myWorksheet последовательно представляет каждый лист в коллекции Worksheets. Необязательно использовать myWorksheet, можно использовать "x", "ws", "WorksheetToRenameAfterTheContentsOfCellB1" или (с небольшими ограничениями) практически любое желательное имя. Хорошей практикой является использование имен переменных, достаточно длинных, чтобы напомнить о ее смысле, но не настолько длинных, чтобы загромождать код.

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

    myWorksheet.Name = "New Name"

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

    myWorksheet.Name = myWorksheet.Name & "-changed"

Вместо попытки присвоить каждому листу одно и то же имя, эта строка изменяет текущее имя каждого листа (myWorksheet.Name) на текущее имя с добавлением суффикса "-changed".

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

Макрос постепенно приближается к тому, что может действительно решить проблему. Теперь нужно найти способ извлекать данные из самих листов — конкретно из ячейки B1 каждого листа — и помещать эти данные в имена листов.

В этот раз вместо использования записи макроса для изучения ссылки на ячейку, сделаем предположение и посмотрим, сработает ли использование объекта Cell (ячейка). Это хорошее предположение, но если открыть справочное руководство по объектной модели и попытаться найти объект Cell, окажется, что там никакого объекта Cell нет! Но есть объект CellFormat (Возможно, на английском языке).

Раздел объекта CellFormat содержит следующий код в первом примере.

    ' Set the interior of cell A1 to yellow.
    Range("A1").Select

Предполагается, что объект Range (диапазон) используется, чтобы задать диапазон ячеек или только одну отдельную ячейку. И снова, часть .Select не понадобится, но понадобится найти, как ссылаться на содержимое объекта Range, а не на сам объект Range. Если перейти к разделу Range, можно прочитать, что у объекта Range есть и Methods, и Properties. Содержимым объекта Range является сущность, не действие, поэтому это, скорее всего, будет Property. Если просмотреть список, можно найти свойство Value. Поэтому попробуйте следующий код.

Sub RenameWorksheets()
For Each myWorksheet In Worksheets
    myWorksheet.Name = myWorksheet.Range("B1").Value
Next
End Sub

Выполнение этого кода для книги, содержащей листы с пустой ячейкой B1, приведет к ошибке, так как значение свойства Value пустого диапазона Range равно "" (пустая текстовая строка), которое не является допустимым именем листа. Самое время создать какие-нибудь данные для примера. Сделайте три листа книги похожими на показанные на следующем рисунке, а затем выполните макрос.

Рисунок 4. Пример данных для макроса RenameWorksheets

Пример данных для макроса RenameWorksheets

 

Пример данных для макроса RenameWorksheets

 

Пример данных для макроса RenameWorksheets

 

Имена листов изменятся соответствующим образом.

Проверка пустых ячеек

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

If myWorksheet.Range("B1").Value <> "" Then

А после строки myWorksheet.Name добавьте следующий текст.

End If

Такой код называется инструкцией If…Then. Инструкция If…Then указывает Excel выполнять весь код между строкой If и строкой End If, но только при выполнении условия, приведенного в строке If. В примере проверяемое условие задается следующей строкой.

myWorksheet.Range("B1").Value <> ""

Знаки <> означают "не равно", а знаки кавычек, между которыми ничего нет, обозначают пустую текстовую строку, то есть полное отсутствие текста. Следовательно, все строки кода между If и End If будут выполнены только если значение в ячейке B1 не пусто, то есть, когда ячейка B1 содержит текст.

Дополнительные сведения об инструкции If…Then см. в справочном руководстве по языку VBA. (Полное название раздела — "If…Then…Else statement" (Инструкция If…Then…Else), где Else — это необязательный компонент.)

Объявления переменных

Другим улучшением, которое нужно внести в макрос, является помещение в начало макроса объявления переменной myWorksheet.

Dim myWorksheet As Worksheet

Dim является сокращением от "Dimension" (размерность), а Worksheet — это тип этой конкретной переменной. Эта инструкция сообщает VBA, какой тип сущности представляет переменная myWorksheet. Обратите внимание, что после введения As, редактор Visual Basic выводит всплывающую подсказку, содержащую перечень всех доступных типов переменных. Это пример технологии IntelliSense, то есть редактор Visual Basic реагирует на то, что, как он считает, пытается сделать пользователь, и предлагает список соответствующих вариантов. Можно выбрать вариант из списка или продолжить ввод.

Хотя объявления переменных в VBA не являются обязательными, их использование настоятельно рекомендуется! Объявление переменных резко упрощает отслеживание переменных и обнаружение ошибок в коде. Кроме того, помните, что при объявлении переменной с типом объекта (например, Worksheet) IntelliSense выводит соответствующий список свойств и методов, связанных с объектом, при последующем использовании этой переменной объекта в макросе.

Комментарии

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

Sub RenameWorksheets()
Dim myWorksheet As Worksheet
For Each myWorksheet In Worksheets
    'make sure that cell B1 is not empty
    If myWorksheet.Range("B1").Value <> "" Then
        'rename the worksheet to the contents of cell B1
        myWorksheet.Name = myWorksheet.Range("B1").Value
    End If
Next
End Sub

Чтобы проверить макрос, переименуйте листы обратно в Лист1, Лист2 и Лист3 и удалите содержимое ячейки B1 на одном или нескольких листах. Выполните макрос, чтобы проверить, что он переименовывает листы с текстом в ячейке B1 и оставляет нетронутыми остальные листы. Макрос работает для любого числа листов, с любой комбинацией заполненных и пустых ячеек B1.

Дополнительные возможности использования VBA

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

Важность быть открытым

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

  • Что можно попробовать еще?

  • Чему надо научиться сначала, чтобы использовать VBA нужным образом?

  • Что может быть забавно или интересно узнать?

  • Что еще может быть любопытно?

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

Диаграммы

Одной из типовых задач в Excel является создание диаграммы на основе диапазона ячеек. Создайте новый макрос AssortedTasks, а затем введите следующий текст в редакторе Visual Basic.

Dim myChart As ChartObject

Добавьте строку, чтобы создать объект диаграммы и назначить его переменной myChart.

Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)

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

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

With myChart
    .Chart.SetSourceData Source:=Selection
End With

Это общий шаблон программирования в VBA. Сначала создается объект, который назначается переменной, затем для выполнения действий с объектом используется конструкция With…End With. В примере кода диаграмме указывается использовать в качестве данных текущее выделение. (Selection — это значение параметра Source метода SetSourceData, а не значение свойства объекта, поэтому синтаксис VBA требует использовать для присвоения значения двоеточие и знак равенства (:=) вместо простого знака равенства (=)).

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

Рисунок 5. Линейчатая диаграмма, созданная с помощью VBA

Линейчатая диаграмма, созданная с помощью VBA

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

With myChart
    .Chart.SetSourceData Source:=Selection
    .Chart.ChartType = xlPie
End With

xlPie — это пример встроенной константы, также называющейся константой перечислимого типа. В Excel много подобных констант, и все они полностью документированы. Дополнительные сведения о встроенных константах см. в разделе "Enumerations" (Перечисления) справочного руководства по объектной модели. Например, константы для типов диаграмм перечислены в разделе "XlChartType Enumeration" (Перечисление XlChartType).

Данные можно изменить. Например, попробуйте добавить следующую строку после объявления переменных.

Application.ActiveSheet.Range("a4").Value = 8

Можно получить данные, введенные пользователем, и использовать их для изменения данных на листе.

myInput = InputBox("Please type a number:")
Application.ActiveSheet.Range("a5").Value = myInput

Наконец, добавьте в конец макроса следующие строки.

ActiveWorkbook.Save
ActiveWorkbook.Close

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

Sub AssortedTasks()
Dim myChart As ChartObject
Application.ActiveSheet.Range("a4").Value = 8
myInput = InputBox("Please type a number:")
Application.ActiveSheet.Range("a5").Value = myInput
Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)
With myChart
    .Chart.SetSourceData Source:=Selection
    .Chart.ChartType = xlPie
End With
ActiveWorkbook.Save
ActiveWorkbook.Close
End Sub

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

Пользовательские формы

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

Введение в Excel VBA завершается в этом разделе кратким обзором пользовательских форм.

На вкладке Разработчик нажмите кнопку Visual Basic, чтобы открыть редактор Visual Basic, а затем перейдите в меню Вставить и выберите Пользовательская форма, чтобы открыть Конструктор: пользовательская форма.

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

Создайте очень простую пользовательскую форму с одной кнопкой, запускающей макрос Hello, созданный раньше в этой статье. На Панели элементов освободите элемент управления CommandButton, а затем перетащите его в пользовательскую форму, чтобы создать кнопку команды. Щелкните кнопку команды правой кнопкой мыши и выберите Просмотреть код.

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

Run("Hello")

Редактор Visual Basic теперь должен выглядеть примерно следующим образом.

Рисунок 6. Процедура события CommandButton1_Click

Процедура события CommandButton1_Click

Сохраните книгу, перейдите в меню Window и выберите UserForm1 (Пользовательская форма), чтобы снова вывести пользовательскую форму. Щелкните зеленую стрелку на панели инструментов, чтобы выполнить пользовательскую форму. Когда диалоговое окно откроется, нажмите кнопку команды, чтобы выполнить макрос Hello, выводящий окно сообщения "Hello, world!" Закройте окно сообщения, чтобы возвратиться в выполняемую пользовательскую форму, затем закройте пользовательскую форму, чтобы вернуться в представление Конструктор.

Что дальше?

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

Одним из способов дальнейшего изучения VBA является изучение работающего кода. Кроме примеров, приведенных в справочных руководствах по объектной модели и языку VBA, существует огромное количество кода Excel VBA, доступное в различных интерактивных источниках, в том числе в статьях библиотеки MSDN, на веб-сайтах, поддерживаемых специалистами со статусом Microsoft Most Valuable Professional (MVP), специализирующимися в Excel, и в других источниках, которые можно найти с помощью быстрого поиска в Интернете.

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

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

Дополнительные ресурсы