В начало
Статьи
Библиотека
Разное

Вот здесь - новый сайт, заходите немедленно!

kift - Коллекция Интересных Фактов и Теорий

А тут можно поболтать и побухтеть, милости просим:

kift - неизданное

Введение в программирование на примере VBA

Часть I Создание макроса Word

Аннотация
Предисловие
Часть I. Макрос Word
     1. Проектирование и запись макроса
     2. Разбор макроса
     Итоги
Часть II. Макрос-приложение
     4. Проектирование
     5. Визуальное редактирование
     6. Запуск и остановка
     7. Вывод данных
     8. Выбор ответа
     9. Перемещение по списку
     10. Обратное перемещение
     11. Новая версия
     12. Реализация новой версии
     13. Завершение работы
     Итоги
Часть III. Объект на основе класса
     14. "Основное" приложение
     15. Компонент-таймер
     Итоги
Послесловие

Занятие 3. Внесение исправлений

Цель занятия – исправление созданного макроса. За основу возьмем информацию, полученную в ходе предыдущего занятия.

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

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

  1. Не вполне последовательное применение With.
  2. Избыточность при задании условий поиска.
  3. Следует помнить о необходимости приводить документ к «нормальному» виду перед применением макроса.
  4. Следует переходить в начало документа перед запуском макроса.
  5. Код не цикличен.
  6. Для «непосвященного» не вполне понятен смысл кода.

Условие 4 можно и опустить. Действительно, иногда может возникнуть потребность применить макрос не с начала документа.

Другие пункты мы сейчас исправим.

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

Приведение документа к «нормальному» виду

Начнем с пункта 3 – приведение документа к «нормальному» виду.

Запись нового макроса для получения нужного кода

Один из способов получить код, выполняющий нужные действия – записать макрос. Действительно, если вы ясно представляете себе последовательность действий, требующихся от Word (или от другого приложения MS Office), то вовсе необязательно идти трудным путем в реализации этого действия в коде. Тем более что вы и сами убедились в сложности и запутанности справочной системы VBA.

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

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

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

Создайте новый пустой документ Word. Новый макрос будет записан в нем.

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

Если вы находитесь в Word:

  • Нажмите [Ctrl]+[N] – это сочетание клавиш создает новый пустой документ Word.
  • Перейдите в этот документ – щелкните мышью в нем так, чтобы появился текстовый курсор (вертикальная «мигающая» черта).

Дальнейшая работа будет проходить в этом документе.

Сначала приведем документ к виду, отличному от «нормального», чтобы будущий макрос смог правильно выполнить свою работу.

  • Выполните команду ВидРазметка страницы для изменения вида документа.

Переключение видов документа быстро и просто производить кнопками, которые находятся внизу слева окна документа:

Вот эти кнопки:

На рисунке нажата крайняя левая кнопка – документ в «нормальном» виде.

Вместо команды ВидРазметка страницы можно щелкнуть на третьей слева кнопке.

  • Включите запись макроса.

Если забыли – повторите материал.

  • Назовите новый макрос как вам угодно, все равно он нам будет нужен лишь временно.
  • Сделайте его доступным для вновь созданного документа.

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

Этот макрос будет выполнять только одно действие – приводить документ к «нормальному» виду.

  • Выполните команду ВидОбычный.
  • Остановите запись.
  • Откройте IDE VBA – нажмите [Alt]+[F11].

Разбор кода нового макроса

Если код макроса не открылся сразу – в окне Project Explorer найдите пункт с надписью NewMacros и выполните на нем двойной щелчок:

Откроется код созданного макроса.

Он будет таким:

Sub НовыйМакрос()
'
' НовыйМакрос Макрос
' Макрос записан 15.02.2005 <пользователь>
'
If ActiveWindow.View.SplitSpecial = wdPaneNone Then
ActiveWindow.ActivePane.View.Type = wdNormalView
Else
ActiveWindow.View.Type = wdNormalView
End If
End Sub

Странно, одно действие привело к записи пяти значимых строк кода – не считая «оболочки» макроса и пояснений. Давайте вкратце разберем значение созданного макроса.

Читаем «по-английски» первую строку:

If ActiveWindow.View.SplitSpecial = wdPaneNone Then

Если АктивноеОкно.Вид.СпециальноеРазделение = wdНетПанели Тогда

Как видите, появилась новая конструкция, начинающаяся со слова IfЕсли.

Блок If…Then, его разновидности

Язык VBA содержит условные конструкцииb, предназначенные для проверки некоторых условий и выполнения вследствие этого тех или иных действий.

Основная условная конструкция –

If <условие> Then
     <действие>
End If

По-русски это будет звучать так:

Если <условие> То
     <действие>
Конец Если

Итак, при выполнении этой конструкции происходит проверка <условия>.

В случае, когда <условие> верно, выполняется <действие>, в противном случае выполнение продолжается после строки End If – символа окончания условной конструкции.

Более сложный вид этой условной конструкции:

If <условие> Then
     <действие1>
Else
     <действие2>
End If

Слово Else можно перевести как Иначе. Код можно «прочитать» так:

Если <условие> То
     <действие1>
Иначе
     <действие2>
Конец Если

То есть, если <условие> верно, выполняется <действие1>, иначе – <действие2>.

Как видно, принципиальной разницы между этим и первоначальным видом условной конструкции нет.

Полезное применение слову Else получаем при такой модификации:

If <условие1> Then
     <действие1>
ElseIf <условие2> Then
     <действие2>
Else
     <действие3>
End If

При разборе конструкции видим:

Если <условие1> верно, выполняется <действие1>,
иначе, если <условие1> неверно, но верно <условие2>, то выполняется <действие2>,
иначе, если неверны оба <условия>, выполняется <действие3>.

Продолжение разбора нового макроса

Вернемся к коду нового макроса.

Как видно, весь макрос – одна конструкция If...Then...Else.

В первой строке проверяется условие:

ActiveWindow.View.SplitSpecial = wdPaneNone

Не углубляясь в детали кода, понимаем, что речь идет о каком-то «СпециальномРазбиении» Вида АктивногоОкна. Вроде бы ничего такого мы не предпринимали, эта строка, видимо, нам не нужна.

В следующей строке кода:

ActiveWindow.ActivePane.View.Type = wdNormalView

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

Активных панелей мы также не создавали.

Пропускаем уже известную нам строку

Else

и читаем следующую строку, которая выполняется при несоблюдении условия в первой строке кода:

ActiveWindow.View.Type = wdNormalView

«Читаем»: Тип Вида АктивногоОкна назначить к НормальномуВиду.

То, что надо!

Мы нашли действие, нужное в нашем случае.

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

Давайте внесем первое исправление в наш учебный макрос.

Не забудьте открыть Word.

  • В Word откройте ваш стендовый документ.
  • Перейдите в IDE VBA.
  • Перед первой значимой строкой кода макроса СтильСноска

Selection.Find.ClearFormatting

  • внесите найденную конструкцию:

ActiveWindow.View.Type = wdNormalView

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

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

Упорядочение блока With

Следующим шагом нормализуем применение With.

  • Переместите строку

With Selection.Find

  • на две строки выше, перед строкой

Selection.Find.ClearFormatting

  • Удалите конструкции Selection.Find.

Сейчас код макроса выглядит так:

ActiveWindow.View.Type = wdNormalView
With Selection.Find
.ClearFormatting
.Style = ActiveDocument.Styles("примечание")
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.Cut
Selection.MoveLeft Unit:=wdCharacter, Count:=1
ActiveDocument.Footnotes.Add Range:=Selection.Range, Reference:=""
Selection.Paste
ActiveWindow.Panes(1).Activate
End Sub

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

Комментирование кода

Теперь попробуем сделать код более понятным.

Обратите внимание, как оформлена пометка в начале макроса.

Sub СтильСноска()
'
' СтильСноска Макрос
' Макрос записан 16.01.2005 <пользователь>
'

Очевидно, что эти строки – кроме первой, – должны игнорироваться языком. Так и происходит.

В языке VBA любая строка кода, начинающаяся со знака – апостроф – языком не обрабатывается.

Такие строки называются комментариями.

Обратите внимание на следующее.

Так как комментарии не оказывают никакого влияния на действия, выполняемые языком VBA, у начинающих возникает соблазн не использовать комментариев вообще. Ни в коем случае не поступайте так! ВСЕГДА вносите комментарии в код.

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

К комментариям предъявляются два требования: чтобы они были, и чтобы они были ясны для вас.

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

  • Итак, внесите комментарии в код макроса.

Комментируйте каждую строку кроме совершенно очевидных, таких, как строки окончания конструкций и т.п.

Код должен приобрести вид, подобный следующему:

‘документ переводится в «нормальный» вид
ActiveWindow.View.Type = wdNormalView
With Selection.Find
‘сброс параметров поиска
.ClearFormatting
‘задание стиля текста для поиска
.Style = ActiveDocument.Styles("примечание")
‘не ищем текст
.Text = ""
‘не заменяем текст
.Replacement.Text = ""

и так далее.

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

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

  • Перейдите в окно стендового документа.
  • Щелкните в начале документа.
  • Нажмите [Alt]+[F8].

Откроется окно выбора макроса для запуска.

  • Выберите в списке название нашего макроса СтильСноска и щелкните на кнопке Выполнить.

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

  • Верните документ к первоначальному виду многократным нажатием [Ctrl]+[Z].
  • Закройте панель сносок.

Мы выполнили пробный прогон макроса. Он должен пройти без проблем. Если что-то не получается – внимательно перечитайте руководство и проверьте каждый шаг создания макроса.

Сокращение макроса

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

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

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

  • Убедитесь, что открыт стендовый документ.
  • Запустите IDE VBA.
  • Перейдите в окно кода макроса «СтильСноска».

Начнем с заведомо ненужных строк.

  • Закомментируйте строки, начинающиеся с .Match:

'        .MatchCase = False
'        .MatchWholeWord = False
'        .MatchWildcards = False
'        .MatchSoundsLike = False
'        .MatchAllWordForms = False

  • Запустите макрос.

Не забудьте перед запуском сохранить документ!

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

  • Верните документ к первоначальному виду.

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

Оказывается, блок With можно значительно сократить, не теряя функциональности макроса:

With Selection.Find
.ClearFormatting
.Style = ActiveDocument.Styles("примечание")
'        .Text = ""
'        .Replacement.Text = ""
'        .Forward = True
'        .Wrap = wdFindContinue
'        .Format = True
'        .MatchCase = False
'        .MatchWholeWord = False
'        .MatchWildcards = False
'        .MatchSoundsLike = False
'        .MatchAllWordForms = False
End With

Пока оставим код в таком виде. Удалить ненужное всегда успеется.

Зацикливание макроса

Наконец, перейдем к зацикливанию выполнения макроса.

Вспомните условие задачи.

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

Вновь обратимся к основам VBA.

Циклы VBA

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

Циклы VBA можно разделить на две группы – For...Next и Do...Loop.

Цикл For…Next

Циклы For...Next имеют следующую схематическую структуру:

For <index> = 0 to 25
     <действие>
Next <index>

Здесь <index> – особая сущность языка, называемая переменная.

Переменная – именованное хранилище данных.

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

В начале цикла For...Next создается переменная <index>.

Имя переменной может быть любым – но структура имени должна подчиняться тем же правилам, что и имена макросов.

Перед первым проходом цикла – то есть перед первым выполнением <действия>, – индексной переменной присваивается начальное значение. В данном примере – 0.

При достижении строки Next <index> индексная переменная увеличивается на единицу, и выполнение переходит к <действию>. Первая строка For... больше не выполняется.

Последний проход цикла совершается со вторым значением индексной переменной. В примере – 25.

Итак, в нашем примере <действие> совершится 26 раз (от 0 до 25).

Очевидно, что данная конструкция цикла полезна в случаях, когда заранее известно число повторений. В нашем макросе количество создаваемых сносок неизвестно.

Лучше, нежели цикл For...Next, нам подойдет конструкция Do...Loop.

Цикл Do…Loop

Цикл Do...Loop имеет следующую структуру:

Do
     <действие>
Loop

Слово Do обозначает начало области, которая будет повторяться. Первое найденное после этого слово Loop отмечает конец области. Цикл в таком виде будет повторяться бесконечно, то есть необходимо предусматривать условия остановки.

Чаще всего применяются модификации цикла с пред- или постусловиями.

Do Until <условие>
     <действие>
Loop

Эта модификация будет выполнять до тех пор, пока <условие> не станет истинным – не выполнится. Причем <условие> проверяется до первого выполнения <действия>, и возможны случаи, когда <условие> изначально истинно – и <действие> не выполнится ни разу.

Если требуется хотя бы одно выполнение <действия>, цикл модифицируют так:

Do
     <действие>
Loop Until <условие>

Смысл тот же, но проверка <условия> – после выполнения <действия>.

Есть «зеркальная» противоположность этому циклу:

Do While <условие>
     <действие>
Loop

Здесь цикл выполняется до тех пор, пока <условие> выполняется. Как только <условие> станет ложным, цикл прекратится. Также есть модификация с проверкой после прохода цикла.

Очевидно, что принципиальной разницы между циклами Do Until и Do While нет. Действительно, любое условие можно перефразировать в свою противоположность, эффективность кода при этом не изменится, так что применение того или другого цикла – вопрос личного предпочтения.

Поиск конца документа

Далее следует определиться, какое условие мы будем проверять по мере повторения кода макроса. К сожалению, документы Word не имеют метки конца документа, как, к примеру, некоторые объекты баз данных. Придется искать обходные пути.

Метод Execute

Логично обратиться к тому действию макроса, которое вызывает перемещение по документу. Если помните, это – метод Execute:

Selection.Find.Execute

  • Перечитайте справку по этому методу.

Для вызова справки поместите текстовый курсор на слове Execute в окне кода IDE VBA (одиночным щелчком) и нажмите [F1].

Вы увидите окно с перечислением объектов, к которым применим метод Execute.

  • Щелкните на гиперссылке Find – нас интересует метод этого объекта.

Перед вами – довольно обширное описание метода. Но обратите внимание на первую строку. Там дано краткое описание действия метода (что он запускает определенную операцию поиска), а далее написано не вполне понятно: «возвращает True, если операция поиска успешна».

Что значит возвращает? Оказывается, многие методы и подпрограммы после выполнения предоставляют вызвавшему их коду какие-то значения. Синтаксис применения методов в таком случае аналогичен синтаксису свойств, когда производится чтение значения.

Подпрограмма или метод, возвращающие значение, имеют специальное название – функция.

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

Теперь можно дать еще одно определение процедуре.

Процедура – это подпрограмма или метод, не возвращающие значения.

Еще немного остановимся на значении True (Правда, Истина). Это значение так называемого логического типа. Возможны лишь два таких значения – True и False (Ложь).

Дадим пример из обыденной жизни. Когда задают вопрос: «Как дела?», обычно следует ответ: «Нормально!». Это – аналог значению True. Ответ «Плохо…» будет аналогичен False.

Логический тип обычно применяется при проверке условий. Тогда значение выражения True соответствует выполнению условия, а значение False – невыполнению.

Итак, метод Execute объекта Find – это функция, возвращающая значение True при успешном выполнении.

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

Зацикливание кода

Давайте определим, какой участок кода будем зацикливать.

Весь макрос? Не стоит.

В самом начале мы производим действия, которые достаточно сделать один раз. Это – перевод документа в «нормальный» вид и настройка параметров поиска.

А вот сам поиск и преобразование текста в сноску будем повторять.

  • Измените код так:

ActiveWindow.View.Type = wdNormalView
With Selection.Find
.ClearFormatting
.Style = ActiveDocument.Styles("примечание")
'        .Text = ""
'        .Replacement.Text = ""
'        .Forward = True
'        .Wrap = wdFindContinue
'        .Format = True
'        .MatchCase = False
'        .MatchWholeWord = False
'        .MatchWildcards = False
'        .MatchSoundsLike = False
'        .MatchAllWordForms = False
End With
Do Until Selection.Find.Execute = False
    Selection.Find.Execute
Selection.Cut
Selection.MoveLeft Unit:=wdCharacter, Count:=1
ActiveDocument.Footnotes.Add Range:=Selection.Range, Reference:=""
Selection.Paste
ActiveWindow.Panes(1).Activate
Loop

Логично?

Проверим работоспособность макроса.

Не забудьте сохраниться!

  • Запустите макрос.

Что-то не то! Почему участки текста преобразуются «через один»?

Обратите внимание на следующие строки кода:

Do Until Selection.Find.Execute = False
Selection.Find.Execute

Заметьте, что выражение Selection.Find.Execute встречается два раза подряд! То есть метод вызывается дважды, и лишь потом происходит преобразование текста в сноску.

  • Попробуйте закомментировать строку

Selection.Find.Execute

Код приобретет вид:

Sub СтильСноска()
'
' СтильСноска Макрос
' Макрос записан 16.01.2005 kitovras
'
ActiveWindow.View.Type = wdNormalView
With Selection.Find
.ClearFormatting
.Style = ActiveDocument.Styles("примечание")
'        .Text = ""
'        .Replacement.Text = ""
'        .Forward = True
'        .Wrap = wdFindContinue
'        .Format = True
'        .MatchCase = False
'        .MatchWholeWord = False
'        .MatchWildcards = False
'        .MatchSoundsLike = False
'        .MatchAllWordForms = False
End With
Do Until Selection.Find.Execute = False
'    Selection.Find.Execute
    Selection.Cut
Selection.MoveLeft Unit:=wdCharacter, Count:=1
ActiveDocument.Footnotes.Add Range:=Selection.Range, Reference:=""
Selection.Paste
ActiveWindow.Panes(1).Activate
Loop
End Sub

Внимательно сверьте код вашего макроса с помещенным здесь.

  • Теперь сохранитесь и запустите макрос.

Все получилось!

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

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

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

  • Сделайте это.

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

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

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

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

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

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

Созданный и исправленный нами макрос не имеет каких-либо компонентов, взаимодействующих с пользователем, поэтому сложно говорить о юзабельности… Стоп! В этом-то и дело! Необходимо добавить средства взаимодействия с пользователем!

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

  • Щелкните правой кнопкой где-нибудь на панели кнопок Word.

Например, здесь:

Появится контекстное меню со списков всех существующих панелей кнопок Word.

  • Щелкните самый нижний пункт Настройка

Появится диалоговое окно:

  • Щелкните кнопку Создать.
  • В появившемся окошке

  • введите название новой панели кнопок.

Например, Мои макросы.

  • Щелкните OK.

Появится заготовка новой панели:

Но кнопок на ней нет.

Добавим их.

  • Перейдите на вторую вкладку диалогового окна настройки панелей кнопок:

Вы видите два списка. Левый список содержит категории команд Word, которые вы можете назначить кнопкам, правый список содержит команды выбранной категории.

  • В левом списке перейдите в категорию Макросы:

Справа появится список всех макросов Word, доступных вам. Он может отличаться от приведенного на рисунке.

  • В нижнем списке Сохранить в: выберите то же месторасположение, что выбиралось при создании макроса.

Если помните, макрос делался доступным только для данного документа, значит и назначить его кнопке получится только для этого документа. В других документах макрос работать не будет. Чтобы макрос работал везде, следовало назначать его доступным всем документам (шаблон Normal.dot).

  • В правом списке найдите строку, содержащую имя макроса:

  • Перетащите строку с именем макроса на заготовку панели кнопок.

Должно получиться примерно так:

Здесь панель кнопок не переименована.

Как видите, надпись на кнопке непонятна, да и сама кнопка получилась слишком большая.

Исправим положение следующим образом.

  • Щелкните правой кнопкой по созданной кнопке.

Возникнет контекстное меню:

При помощи этого меню вы можете настраивать внешний вид кнопки.

  • В строке Имя: измените надпись Project.NewMacros.СтильСноска на СтильСноска.
  • Подтвердите изменение нажатием [Enter].

Как видите, внешний вид кнопки изменился.

  • Щелкните кнопку Закрыть диалогового окна настройки панелей кнопок.

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

  • Попробуйте запустить макрос, используя кнопку.

Если вы все сделали правильно – макрос сработает точно так же, как и при вызове «классическим» способом.

Итог занятия

Сначала, пожалуйста, составьте конспект. Вот примерный план:

  • Конструкция If...Then...Else, ее применение, разновидности, синтаксис.
  • Конструкция For...Next, ее смысл, синтаксис.
  • Конструкция Do...Loop, ее смысл, разновидности, синтаксис.
  • Логический тип, применение.
  • Комментарии, понятие, синтаксис, применение.
  • Использование комментариев при отладке.
  • Юзабельность, понятие.

Остальное вы найдете в справочной системе VBA.

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

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

Как вы убедились, средство автоматической записи макросов не всегда может сделать то, что хотелось бы, поэтому приходится дорабатывать код вручную. Это относится, в частности, к обработке целого документа. «Зацикливать» макрос приходится вручную.

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

Несколько слов о логических выражениях.

Условные выражения в VBA обычно формулируются таким образом:

<значение1><условный оператор><значение2>

Здесь <значения> – сравниваемые конструкции, а <условный оператор> определяет разновидность сравнивания, это может быть знак равенства =, знаки сравнение <, >, <=, >=, <>, и специальные слова VBA – операторы AND, NOT, OR или XOR.

Применение знаков равенства и сравнения не требует особых пояснений:

Конструкция

a = b

будет истинной, если aравноb,

a > b

если a больше b,

a >= b

если a больше или равно b и так далее.

Сложнее уяснить использование логических операторов.

Вот выражение

a = b AND c

Здесь a будет истинным, если истинно b И истинно c.

a = b OR c

a истинно, если истинно b ИЛИ истинно c ИЛИ истинны и b и c.

a = b XOR c

a истинно, если истинно b ИЛИ истинно c, но не оба сразу.

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

Hosted by uCoz