Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на BASIC / Visual Basic / Учебно-методическое пособие по изучению Visual Basic for Applications (VBA).doc
Скачиваний:
226
Добавлен:
02.05.2014
Размер:
1.55 Mб
Скачать

Import File

Папка: | ЁЭ Titov

Ц Module l.bas 3)Module2.bas 3l UserFornnl .frin

~z\ «- Ц] & Щ*

Имя Файла: \

1ип Файлов: |VB Files (".frm;".bas;".cls)

Дткрьггь |j

т| Отмена

Справка

Рис. 8

Упражнение 3

Импортируйте экспортируемый модуль из упражнения 2 в Excel.

Замечание 6. Команда Import File (Импорт Файла) позволяет добавлять в проект файлы форм (*.frm), программ (*.bas) и описания классов (*.cls). Файлы этих же форматов можно экспортировать с помощью команды Export File (Экспорт файла).

Удаление модулей из проекта

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

ь выделите модуль, который хотите удалить из проекта, в Project Explorer Редактора VB;

ь выберите команду File/Remove <object>… (Файл/Удалить <объект>…). Редактор VB отображает окно сообщения, запрашивающее у вас, хотите ли вы экспортировать модуль перед тем, как удалить его (рис. 9);

Microsoft Visual Basic

Д

Do you want to export UserFornnl before removing it?

&s

Нет

Отмена Справка

Рис. 9 ь щелкните на кнопке Да (Yes), если хотите экспортировать модуль перед

28

его удалением. Настоятельно рекомендуется экспортировать модуль как файл *.bas, если только вы не уверены абсолютно, что вам никогда не понадобятся макросы, содержащиеся в этом модуле. Иначе можно щелкнуть на кнопке Нет (No) для удаления модуля без его экспортирования;

если вы выберите экспортирование модуля перед его удалением, Редактор VB отображает диалоговое окно Export File, описанное ранее в этой части. Заполните диалоговое окно Export File, как было описано ранее, и щелкните на кнопке Сохранить.

В любом случае Редактор VB удаляет модуль из проекта.

Упражнение 4

Удалите модуль без сохранения созданный упражнением 3.

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

Написание новых макросов и процедур

До сих пор в этом учебно-методическом пособии использовался термин макрос (macro) как для макросов, которые вы записываете рекордером, так и для макросов, которые пишите сами. Существует другой термин, помогающий различать эти макросы. Строго говоря, термин макрос применим только для инструкций, которые вы записываете с помощью макрорекордера. Иногда в литературе макросами называют программы, которые не имеют аргументов (вы, наверное, уже поняли, что записываемые рекордером макросы не могут иметь аргументов). Макросы, которые вы пишете заново более точно называются подпроцедурами (subprocedures) или просто процедурами (procedures). Далее в этом учебно-методическом пособии термин макрос относится к коду, записываемому с помощью макрорекордера, а термин процедура - к коду VBA, который вы пишете сами.

Если документ, в котором вы хотите сохранить процедуру, еще не содержит модуль, вы должны вставить модуль перед тем, как сможете написать процедуру VBA в этом проекте. Вы можете также вставить новый модуль, если существующие модули заполнены (модуль может содержать не более 4000 строк) или если вы просто хотите создать новую процедуру VBA в ее собственном модуле.

Если вы решили написать процедуру VBA в новом модуле, выполните следующие шаги для добавления модуля в проект:

  • убедитесь, что в Excel открыта рабочая книга, в которой вы хотите сохранить процедуру;

  • нажмите Alt+F11 для активизации Редактора VB;

  • в Project Explorer выделите проект, в который хотите добавить модуль (скорее всего, в этот момент он там будет один);

  • выберите команду Insert/Module (Вставка/Модуль) или на панели Standard с помощью кнопки J : Insert <object> (Вставка объекта) выберите в раскрывающемся меню Module. Редактор VB добавляет новый модуль в проект и

29

открывает Code Window для нового модуля.

Упражнение 5

Добавьте новый модуль в проект.

Когда Редактор VB вставляет новый модуль, он дает ему имя в соответствии с правилами, изложенными ранее в этой части; ваш новый модуль будет иметь имя по умолчанию Module (Модуль) с последующим номером. Всякий раз при вставке модуля следует переименовывать его, чтобы этот модуль имел описательное имя. Для переименования модуля выполните следующие шаги:

  • выделите в Редакторе VB модуль, который будете переименовывать;

  • если Properties Window (Окно свойств) еще не выведено на экран, выберите команду View/Properties Window (Вид/Окно свойств) или щелкните на кнопке 1 Properties Window на панели инструментов, чтобы отобразить его (рис. 10);

Рис. 10 ь в текстовое поле Name (Имя) в Properties Window введите новое имя для модуля. Как только вы уберете курсор вставки из текстового поля Name, Редактор VB переименует модуль

Упражнение 6

Переименуйте созданный модуль упражнением 5, дав ему имя NewModule.

Для написания новой процедуры в существующем модуле необходимо сначала открыть Code Window (Окно программы) для модуля, в котором вы хотите написать процедуру. Чтобы открыть Code Window для модуля, либо щелкните дважды на этом модуле в Project Explorer, либо выделите этот модуль в Project Explorer и затем выберите команду View/Code (Вид/Программа).

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

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

Когда вы пишете новую процедуру, вы должны указать имя процедуры и

30

включить ключевое слово Sub в начале процедуры и ключевые слова End Sub – в конце.

Задание 4. Напишите процедуру, отображающую на экране в новом окне сообщение “Привет, Excel!”.

Для этого:

ь откройте любую рабочую книгу Excel или создайте новую рабочую книгу;

ь нажмите Alt+F11 для активизации Редактора VB;

ь в Project Explorer выделите рабочую книгу, в которой хотите сохранить эту программу;

ь выберите Inser/Module (Вставка/Модуль), чтобы добавить новый модуль к вашему проекту. Редактор VB добавляет новый модуль и открывает для него Code Window;

ь переименуйте новый модуль, дав ему имя FirstProgram;

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

Листинг 2 Процедура HelloExcel

1 Sub HelloExcel()

2 MsgBox "Здравствуй, Excel!"

3 End Sub

Редактор VB содержит несколько возможностей, помогающих в написании процедур. Во-первых, как только вы нажмете на Enter после ввода ключевого слова Sub и имени процедуры, Редактор VB автоматически добавляет ключевые слова End Sub. Таким образом, вам не приходится беспокоиться о том, что вы можете случайно забыть об этом важном элементе процедуры. Во-вторых, Редактор VB включает возможность, известную как Auto Quick Info (Краткие сведения). Как только вы вводите MsgBox и нажимаете на клавишу пробела (строка 2 листинга 2), появляется всплывающее окно, показывая полный список аргументов для встроенной процедуры VBA или функции, которую вы только что ввели (MsgBox – в данном случае). Аргумент, значение которого, как ожидается, вы теперь должны ввести, выделен полужирным шрифтом во всплывающем окне Auto Quick Info. Всплывающее окно Auto Quick Info закрывается, если вы нажимаете на Enter для начала новой строки в Code Window или используете клавиши со стрелками или мышь для перемещения курсора вставки с текущей строки на другую. Вы можете также закрыть окно Auto Quick Info, нажимая на клавишу Esc. Если вас интересует возможность Auto Quick Info, вы можете включать и выключать ее с помощью команды Tools/Options (Сервис/Параметры) в Редакторе VB.

Каждое объявление процедуры должно начинаться с ключевого слова Sub, за которым следует пробел и затем – имя процедуры. В листинге 2 именем процедуры является HelloExcel. Финальная часть объявления процедуры – это пара пустых круглых скобок. Эти скобки обязательны.

31

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

Третья строка процедуры HelloExcel End Sub – завершает процедуру. Эта строка сообщает VBA о том, что это – конец процедуры; VBA прекращает выполнение процедуры при достижении им этой строки.

Задание 5. Выполните процедуру HelloExcel.

Для этого:

ь выберите команду Tools/Macros(Сервис/Макрос) для отображения диалогового окна Macros (Макрос);

ь выберите процедуру HelloExcel в списке Macro Name (Имя макроса);

ь щелкните на кнопке Run (Запуск). Когда VBA выполняет процедуру HelloExcel из листинга 2, он отображает диалоговое окно, показанное на рис. 11. Точный заголовок этого диалогового окна зависит от того, в каком host-приложении (Word, Excel и т.д.) вы создали процедуру;

1 Microsoft Енсе! 1 ^H

Привет, Excel

-,

: OK j|

Рис. 11 ь щелкните на кнопке ОК для установки диалогового окна в исходное состояние и завершения процедуры.

Заметьте, что даже в этой короткой процедуре тело процедуры расположено с отступом для отделения его от объявления и конца процедуры. Следует всегда размещать код с отступом, чтобы его было легче читать. Текстовый редактор VBA содержит свойство, называемое автоматический отступ (auto indenting), позволяющее форматировать исходный код с различными уровнями отступа. Если свойство автоматического отступа включено, то всякий раз, когда вы нажимаете на Enter, чтобы начать новую строку, курсор вставки на новой строке автоматически перемещается в положение, совпадающее с уровнем отступа строки, расположенной выше. Нажмите на Backspace, чтобы вернуться к предыдущему уровню отступа. Для включения и выключения автоматического отступа устанавливайте или отключайте флажок Auto Indent (Автоотступ) на вкладке Editor (Редактор) диалогового окна Options (Параметры).

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

32

Macros для запуска макроса или процедуры; вы можете их также запускать непосредственно из модуля во время редактирования. Для этого сделайте следующее:

  • убедитесь, что курсор находится в процедуре (в ее теле, в строке объявления или в завершающей строке;

  • выберете команду Run/I > *******™ fs VBA выполнит процедуру от начала до конца.

Задание 6. Измените заголовок диалогового окна “Microsoft Excel” на “Моя первая программа” процедуры HelloExcel.

Для этого:

добавьте в MsgBox:

MsgBox "Здравствуй, Excel!", , "Моя первая программа" Оператор MsgBox имеет три аргумента (которые следуют после него); каждый аргумент отделяется от других запятой. Первый аргумент оператора MsgBox такой же, как в листинге 2, и является текстом, который должен быть отображен посредством MsgBox (показанный во всплывающем окне Quick Info как аргумент Prompt). Как только вы ввели запятую, отделяющую первый аргумент от второго, вы, вероятно, заметили, что всплывающее окно Quick Info изменяется: аргумент Buttons в окне Quick Info выделяется полужирным шрифтом, тогда как аргумент Prompt отображается опять обычным шрифтом. В то же время, в модуле появляется раскрывающийся список; этот список содержит все возможные значения для аргумента Buttons. Появляющийся список является результатом свойства Auto Data Tips (подсказка значений данных) Редактора VB. Это свойство работает подобно свойству Auto Quick Info, но отображает списки допустимых значений для аргументов процедуры и других элементов в коде VBA. Второй аргумент оператора MsgBox является необязательным; в данном примере необязательный второй аргумент опущен. Поскольку необязательный аргумент опускается, в списке аргументов имеется один символ пробела. Этот пробел указывает VBA на то, что в этом списке пропущен необязательный аргумент. За символом пробела следует запятая, чтобы отделить его от следующего аргумента в списке. Если вы не введете символ пробела между двумя запятыми, VBA добавляет его. Необязательный второй аргумент в операторе MsgBox - это аргумент Buttons. Он появляется во всплывающем окне Auto Quick Info, заключенный в квадратные скобки для указания того, что это - необязательный аргумент. Аргумент Buttons определяет, сколько и какого типа командные кнопки появляются в диалоговом окне, отображаемом посредством MsgBox. Когда вы опускаете необязательный второй аргумент (как в этом примере), диалоговое окно, которое отображает MsgBox, содержит только одну кнопку - кнопку ОК. Третий аргумент в операторе MsgBox определяет заголовок диалогового окна. Как только вы вводите запятую, отделяющую второй и третий аргументы в списке аргументов оператора MsgBox, всплывающее окно Auto Quick Info указывает, что вы теперь должны ввести значение аргумента для аргумента Title. Подобно первому аргументу текст для строки заголовка диалогового окна заключается в

33

кавычки (""). VBA всегда воспринимает заключенный в кавычки текст как данные, а не как текст, содержащий программные инструкции. Если вы опустите кавычки для текста сообщения MsgBox или для текста строки заголовка диалогового окна, VBA отобразит сообщение об ошибке. Поскольку третий аргумент является также и последним, никакой запятой после третьего аргумента не требуется.

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

Ошибки синтаксиса

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

Всякий раз, когда вы пишете новую строку кода или изменяете существующую, VBA анализирует (parses) строку, как только курсор вставки перемещается из новой или измененной строки. Синтаксический анализ (parsing) – так называется процесс разбивки оператора VBA на составляющие части и определение того, какие части строки являются ключевыми словами, переменными или данными. После выполнения анализа строки кода VBA компилирует эту строку кода. Компиляция (compiling) в VBA означает составление исходного кода в форме, которую VBA может непосредственно выполнять без необходимости снова анализировать код.

После того как VBA успешно завершит анализ и компиляцию строки кода в процедуре и не будет обнаружено никаких ошибок, выполнится цветовое кодирование различных частей строки (Помните, ключевые слова в Редакторе VB отображаются синим цветом, комментарии – зеленым, а данные или другие операторы отображаются в виде черного текста). Если, однако, VBA обнаруживает ошибку синтаксиса в строке в процессе анализа или компиляции, VBA отображает всю строку красным цветом и выводит на экран диалоговое окно с сообщением об ошибке.

Задание 7. Измените фрагмент кода процедуры HelloExcel, представляющий неправильно написанный оператор MsgBox.

Для этого:

ь измените строку 2 на следующую:

MsgBox "Здравствуй, Excel!", , Моя первая программа.

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

34

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

Поскольку третий аргумент воспринимается как переменная с именем приветствия, VBA «ожидает» запятую или конец списка аргументов для процедуры MsgBox. Вместо этого, VBA находит символ пробела, за которым следует, как это кажется, имя другой переменной. VBA отображает всю строку красным цветом, чтобы указать, что она содержит ошибку, выделяет слово или символ в том месте строки, где, по определению VBA, находится ошибка, и затем отображает диалоговое окно (рис. 12).

.'•

11

|OG«ri

"3 1=

Зил UtJioEittli.j

Hju^Op нП^км-т, IxteL,l_, i Иод |

-" L^ltt.ndJri

J 1>0№4

id

Рис. 12

Если вы получаете подобное сообщение об ошибке синтаксиса или компилирования, щелкните на кнопке Справка (Help) для доступа к справочной системе VBA и получения более подробной информации о конкретной встретившейся ошибке синтаксиса. Чтобы удалить диалоговое окно, щелкните на кнопке ОК.

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

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

35

Ошибки времени исполнения

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

Задание 8. Измените фрагмент кода процедуры HelloExcel, представляющий неправильно написанный оператор MsgBox.

Для этого:

ь измените строку 2 на следующую:

MsgBox "Здравствуй, Excel!" , "Моя первая программа".

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

Рис. 13

Это диалоговое окно информирует о том, что возникла ошибка при выполнении процедуры, и отображает сообщение, описывающее эту ошибку. В данном случае ошибкой является ошибка несоответствия типа (type mismatch). Если вы еще раз посмотрите на вышеприведенный оператор MsgBox, то можете заметить, что отсутствует запятая, отмечающая место для необязательного MsgBox-аргумента Buttons.

Когда VBA анализирует этот оператор, заключенный в кавычки текст «Моя первая программа» компилируется как второй аргумент MsgBox, а не как третий аргумент из-за пропущенной запятой. Поскольку аргумент командной кнопки должен быть числом, а не текстом, VBA сообщает о том, что тип данных, передаваемый процедуре MsgBox, не совпадает с типом данных, ожидаемых для этого аргумента. Более подробно о типах данных рассказывается в следующей части.

36

Диалоговое окно для сообщений об ошибках времени исполнения содержит несколько командных кнопок (рис. 12):

ь Continue (Продолжить) – выбирайте эту командную кнопку для продолжения процедуры. Некоторые ошибки времени исполнения позволяют продолжать выполнение процедуры; однако для большинства таких ошибок эта кнопка отключена;

ь End (Завершить) – выбирайте эту кнопку, чтобы закончить процедуру;

ь Debug (Отладка) – выбирайте эту кнопку для перехода в режим прерывания и используйте возможности отладки Редактора VB для отслеживания и решения любой проблемы, вызванной ошибкой времени исполнения;

ь Help (Справка) – эта команда предоставляет доступ к справочной системе VBA и отображает текст подсказки, описывающий конкретную ошибку времени исполнения, которая возникла. Используйте эту кнопку, чтобы получить больше информации, если вам не понятно, что означает данная ошибка времени исполнения.

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

Печать исходного кода

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

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

Чтобы напечатать исходный код, выполняйте следующие шаги:

ь в Project Explorer выделите модуль или проект, который вам необходимо печатать. Если вы хотите печатать только выделенный текст в модуле, выведите модуль на экран и выделите текст, который необходимо печатать;

ь выберите команду File/Print (Файл/Печать). Редактор VB отображает диалоговое окно Print (рис. 14);

ь в группе элементов управления Range (Диапазон печати) укажите, будет ли печататься текст текущего выбора, выделенный модуль или весь проект;

ь в группе элементов управления Print What (Печатать) должен быть установлен флажок Code (Программу) (чтобы печатать исходный код); если ваш проект содержит формы, установите флажок Form Image (Рисунок формы) для печати рисунка формы;

ь установите любые другие параметры печати, какие необходимо, так же, как вы это делаете в любом приложении Microsoft Office;

37

Рис. 14 ь щелкните на кнопке ОК, чтобы напечатать исходный код.

Когда вы печатаете проект или модуль, вы не можете предварительно просматривать печатаемый модуль. Отпечатанный листинг из модуля всегда форматируется одним и тем же образом, за исключением ориентации страниц, которую вы можете регулировать, щелкнув на кнопке Setup (Настройка) в диалоговом окне Print.

Контрольные вопросы

  1. Что такое модуль VBA?

  2. Как найти модуль, содержащий необходимый макрос?

  3. Для чего используется Object Browser?

  4. Что такое ключевое слово VBA?

  5. Какие необходимые элементы содержит процедура?

  6. Что такое объявление процедуры?

  7. Что такое тело процедуры и где оно расположено?

  8. Зачем делать отступы в текстах программ?

  9. Что такое аргумент?

  10. Что такое символ продолжения строки?

  11. Что такое синтаксическая ошибка и ошибка времени выполнения?

Соседние файлы в папке Visual Basic