И переведет указатель в начало следующей строки документа.
Если в одной строке документа необходимо вывести текстовую информацию и какое-либо число, то число требуется преобразовать в символы, с помощью функции преобразования cStr, например, следующие операторы:
Fio=”Иванов” : Sred_ball=4.65
Selection.TypeText “средний балл студента” &Fio &” = ” & _ cStr(Sred_ball)
выведут в документ Word строку:
средний балл студента Иванов = 4.65
Элементы интегрированной среды разработки (IDE): окна отладки
VBA имеет некоторые средства для облегчения поиска и исправления ошибок в тексте приложения.
Процесс поиска и исправления ошибок называется отладкой.
Как вы уже знаете, VBA допускает работу IDE VBA в режиме создания программы, когда вы пишете код или конструируете визуальную часть (design-time, время создания) и в режиме работы создаваемого приложения (run-time, время исполнения).
У IDE VBA имеется еще один режим работы, применяемый для «пошагового» выполнения кода. Именно этот режим используется при отладке.
Окна отладки используется для отслеживания изменений значений переменных при отладке программы. Окна открывается командами меню View - Watches, Locals, Immediate соответственно.
Окно контролируемых выражений Watches (рис 2.3) позволяет отследить значения выбранных переменных. Новая переменная в список вывода добавляется командой меню Debug – Add Watche или той же командой, вызываемой из контекстного меню поля окна. Для удаления переменной из списка ее нужно выделить и нажать клавишу <Delete>.
Структура и вид окна локальных переменных Locals такие же, как у окна Watches. В это окно выводятся значения всех переменных текущей процедуры.
Окно Immediate (рис. 2.4) служит для немедленного выполнения команд в ходе отладки.
Окно позволяет:
- набирать и выполнять отдельные инструкции VBA. Инструкция должна быть набрана в одну строку, но может содержать несколько операторов, разделенных символом «:»;
- определять значения переменных, свойств, а также констант VBA. Для этого в окне набирается вопросительный знак, имя переменной, свойства или константы и нажать клавишу <Enter>;
- устанавливать новые значения переменных. Для этого нужно записать оператор присваивания, т.е. набрать имя переменной, знак равенства, новое значение или выражение для его вычисления, и нажать клавишу <Enter>.
Рис. 2.3. Окно Watches: 1 – окно кода, 2 – отметка точки прерывания,
3- выполняемые строка, 4 – выведенное значение переменной
Рис. 2.4. Окно Immediate. 1 – окно кода и точка прерывания, 2 – выделенная строка и значение переменной, показанное при наведении на нее указателя, 3 – окно Immediate , вывод значений и вычисление выражений в окне.
Приемы отладки программ на VBA
Среди полезных приемов отладки программ можно указать:
- организацию паузы в работе для анализа текущих значений переменных;
- пошаговое выполнение важных, логически сложных фрагментов программы.
Для организации паузы в работе программы нужно установить точку прерывания (или несколько таких точек) командой меню редактора Debug – Toggle Breakpoint («горячая клавиша» – F9) или просто щелчком мышкой по рамке окна Code слева от той строки, в которой планируется пауза. При этом на рамке окна появится коричневая точка. Строка, с которой возобновится выполнение программы, будет выделена желтым цветом (см. рис. 2.3 и 2.4) и стрелкой на рамке.
Значения переменных в момент прерывания можно просмотреть:
- подведя указатель к этой переменной;
- задав в окне Immediateкоманду Print.Имя_переменнойили ?Имя_переменной;
- использовав команды меню Debug – Add Watch и введя имя переменной в окне Expression или «перетащив» переменную в окно Watch
Для выполнения следующего оператора программы используется команда меню Debug – Step Into (или клавиша F8).
Для продолжения выполнения программы с произвольной строки нужно перетащить желтую стрелку к этой строке.
Чтобы продолжить выполнение программы после остановки используется команда Run | Continue, кнопка F5или кнопка ► на панели инструментов.
Для прерывания выполняющейся программы можно воспользоваться комбинацией клавиш <Ctrl>+Break.
Практическое задание
Может вознукнуть ситуация, что вам понадобится отформатировать документ, в котором содержится много таблиц, имеющих различный формат и выравнивание на странице, то их ручное выравнивание может занять немало времени и утомить вас. Поэтому создадим макрос, который будет обрабатывать все таблицы в открытом активном документе: располагать их по ширине страницы, а сам текст в ячейках выравнивать по центру (и по вертикали, и по горизонтали)
Для начала вам необходимо создать новый документ Word, а в нем - несколько таблиц с произвольным количеством столбцов и строк, затем надо заполнить ячейки любым текстом. На примере этого документа (опять назовем его «стендовым») мы будет проверять работу созданного макроса.
Далее перейдите в редактор VBA. В окне дерева проекта Project Explorer (в левом верхнем углу) в папке Modules найдите модуль NewMacros. В нем содержится макрос из шаблона Normal.dot, который мы создавали на прошлом занятии.
Модуль NewMacros
А если модуля NewMacros в дереве проекта нет (например, вы выполняли первую работу на другом компьютере), тогда нужно будет создать новый модуль : в меню Insert выбрать пункт Module (рис. 2.4).
Рис. 2.4. Вставка нового модуля
После этого созданный модуль появится в окне дерева проекта (Project Explorer) под именем Module1.
Далее необходимо сделать заготовку процедуры макроса. Раз мы форматируем таблицы, то назовем её TableFormatting. Вспомните синтаксис процедуры, рассмотренный в первой лабораторной работе. Заготовка процедуры будет иметь вид:
Sub tableFormatting()
End Sub
Если вы открыли модуль NewMacros, то этот код необходимо поместить после строки End Sub, которая завершает процедуру ParagraphFormatting(), созданную в первой лабораторной по VBA (рис. 2.5)
Рис. 2.5. Создание заготовки для процедуры TableFormatting
Если же модуля NewMacros у вас нет, то внесите этот текст в Module1 в окно ввода, начиная с первой строки. Это будет выглядеть примерно как на рисунке на 2.6.
Рис. 2.6.
Затем после строки Sub tableFormatting() добавим следующее:
Dim myTable As Table
Как расшифровать эту строку?
myTable – это переменная.
Переменные— контейнеры для хранения изменяемых данных. Без них не обходится практически ни одна программа. Для простоты переменную можно сравнить с номерком в гардеробе — вы сдаете в "гардероб" какие-то данные, в ответ вам выдается номерок. Когда вам опять потребовались эти данные, вы "предъявляете номерок" и получаете их.
Dim— это область видимости переменной. В VBA предусмотрено 4 ключевых слова для определения области видимости переменных:
· Dim — используется в большинстве случаев. Если переменная объявлена как Dim в области объявлений модуля, она будет доступна во всем модуле, если в процедуре — только на время работы этой процедуры;
· Private — при объявлении переменных в VBA значит то же, что и Dim;
· Public — такая переменная будет доступна всем процедурам во всех модулях данного проекта, если вы объявили ее в области объявлений модуля. Если вы объявили ее внутри процедуры, она будет вести себя как Dim/Private;
· Static — такие переменные можно использовать только внутри процедуры. Эти переменные видны только внутри процедуры, в которой они объявлены, зато они сохраняют свое значение между разными вызовами этой процедуры. Обычно используются для накопления каких-либо значений.
Третья часть нашего объявления — As Table — это указание на тип данных нашей переменной. Тип данных определяет, данные какого вида можно будет хранить в нашей переменной.
Собираем все вместе. Итак, строкой
Dim myTable As Table
мы объявляем переменную myTable, она будет иметь тип Table - это таблица Word.
Идем дальше: добавляем в эту же область объявления локальных переменных (переменные, которые используются только внутри процедуры) такую строку:
Dim RowOfTable As Row, strTableCount As String
Таким способом мы через запятую в одной строке объявляем две переменные: RowOfTable, она будет иметь тип Row - это строка таблицы Word, и переменную strTableCount типа String (строка), в неё запишем преобразованное в текст количество таблиц документа .
Теперь мы подошли к основной части процедуры: к двум циклам. В первом цикле мы будем обходить по очереди все таблицы в документе, а во втором (он будет вложен в первый) «пройдемся» в каждой таблице по всем строкам и отформатируем их. Скопируйте следующий код и вставьте в окно ввода. Для лучшего понимания все строки прокомментированы (напомню, что комментарии, это строки, начинающиеся со знака апострофа ').
'ActiveDocument – активный документ Word
'ActiveDocument.Tables - коллекция таблиц в активном
'документе
'циклом проходимся по всем таблицам активного документа
'выход из цикла осуществится, когда закончатся все таблицы в
'документе
For Each myTable In ActiveDocument.Tables
' Выравнивает саму таблицу в документе по ширине окна
myTable.AutoFitBehavior wdAutoFitWindow
'myTable.Rows - коллекция строк в текущей таблице,
'обработаем эту коллекцию во вложенном цикле
For Each RowOfTable In myTable.Rows
'выделяем текущую строку
RowOfTable.Select
'горизонтальное выравнивание текста в выделенной
'строке по центру
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
'Selection.Cells –коллекция ячеек выделенной
'строки.
'свойство VerticalAlignment – вертикальное
'выравнивание. Сделаем также по центру.
Selection.Cells.VerticalAlignment = wdCellAlignVerticalCenter
'переходим к следующей строке таблицы
Next RowOfTable
'переходим к следующей таблице
Next myTable
Теперь, когда мы отформатировали все таблицы, нужно сообщить пользователю, что процесс завершен, и вывести результаты выполнения макроса. Сделаем это ввиде появляющегося окна сообщения, в котором будет указано количество отформатированных страниц. Скопируйте эти строки:
'ActiveDocument – активный документ Word
'ActiveDocument.Tables – коллекция таблиц активного
'документа
'ActiveDocument.Tables.Count – количество таблиц активного
'документа, имеет тип целого числа
strTableCount = Str(ActiveDocument.Tables.Count)
Поясним последнюю строку. Здесь числовое значение ActiveDocument.Tables.Count преобразуется в строковое с помощью функции Str, а затем присваивается переменной strTableCount, которая имеет тип «строка».
Ну и осталось создать окно сообщения. Будем использовать для этого фунцию MsgBox с следующими параметрами.
Текст сообщения:
"Количество отформатированных таблиц: " & strTableCount
Используемые кнопки:
vbOKOnly (этом окне нам понадобится только одна из всех возможных кнопка Ok)
Заголовок окна:
"Результат работы макроса"
В итого получаем такой код:
MsgBox "Количество отформатированных таблиц: " & strTableCount, vbOKOnly, "Результат работы макроса"
Все, наш макрос готов. Не забудьте проверить, чтобы самой последней строкой в окне ввода
End Sub
В ней сообщается, что процедура TableFormatting закончилась.
Сохраним макрос в шаблоне Normal.dot. Для этого поставьте курсор в дереве проекта на узел Normal.
Затем откройте меню Fileи выберите пункт Save Normal
Теперь будем запускать созданный макрос.
Для этого переключимся из редактора VBA обратно к «стендовому» документу с таблицами, которые будем форматировать макросом. Теперь этот документ стал активный. Возвращаемся в редактор VBA и нажимаем на кнопку запуска макроса (с зеленым треугольником, расположенную на панели быстрых команд).
Если у вас в шаблоне Normal.dot помимо только что созданного макроса есть и тот, который мы создавали на прошлой лабораторной работе, то после нажатия кнопки запуска макроса перед вами появится диалоговое окно с предложением выбрать тот макрос, который необходимо запустить:
Выберите макрос TableFormatting и нажмите на кнопу Run.
Псле окончания работы макроса у вас все таблицы будут отфарматированы, о чем будет сообщено в окне, которое мы создали.
Приложение 1. Значения параметра Buttons процедуры msgbox, определяющие отображаемые кнопки и информационные значки диалогового окна
Константа | Значение | Описание |
vbOKOnly | Отображаются кнопка OK. | |
vbOKCancel | Отображаются кнопки OK и Cancel. | |
vbAbortRetryIgnore | Отображаются кнопки Abort, Retry и Ignore. | |
vbYesNoCancel | Отображаются кнопки Yes, No и Cancel. | |
vbYesNo | Отображаются кнопки Yes и No. | |
vbRetryCancel | Отображаются кнопки Retry и Cancel. | |
vbCritical | Отображается значокКритическая ошибка. | |
vbQuestion | Отображается значок Вопрос. | |
vbExclamation | Отображается значок Предупреждение. | |
vbInformation | Отображается значок Информация. |
Приложение 2. Константы, возвращаемые функцией msgbox в зависимости от нажатой кнопки.
Константа | Значение | Нажата кнопка |
vbOK | OK | |
vbCancel | Cancel | |
vbAbort | Abort | |
vbRetry | Retry | |
vbIgnore | Ignore | |
vbYes | Yes | |
vbNo | No |