Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2819
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Постановка задачи 61

Рис. 2.17. На отдельном рабочем листе подготовлен шаблон счета

Использование функции СЕГОДНЯ

Предполагается, что в рабочей книге уже подготовлен отдельный лист для формирования счета. Заголовок и окончание могут быть в достаточной степени произвольными, поскольку нас в данном случае интересует в первую очередь пустая область в счете, куда необходимо поместить данные из бланка заказа. Как видно из рис. 2.17, диапазон A4:C13 оставлен пустым — в него будет помещаться список компонентов и соответствующие им цены. Строка итоговой цены здесь будет формироваться заново: в ячейку C14 помещена формула =СУММ(C4:C13). Формула =СЕГОДНЯ() в ячейке C1 позволяет отображать в счете текущую дату.

см. также в приложении раздел “Системная дата и системное время”.

Итак, у нас есть сформированный заказ на листе “Бланк заказа (макро)”. Его диапазон A3:C12 содержит необходимые сведения о комплектации компьютера. Требуется скопировать эти сведения в диапазон A4:C13 на листе “Счет”. При этом хотелось бы, чтобы данная операция выполнялась по щелчку на кнопке “Счет”.

Как записать макрос при помощи макрорекордера

1.Выполните команду Сервис | Макрос | Начать запись.

2.В появившемся окне Запись макроса (рис. 2.18) введите в поле Имя макроса строку “Пер-

вый_способ” и щелкните на кнопке OK.

Рис. 2.18. Диалоговое окно Запись макроса

3.Выделите на рабочем листе “Бланк заказа (макро)” диапазон A3:B12. Обратите внимание, строка 13, с общей суммой заказа, не должна попасть в выделенную область.

4.Выполните команду Правка | Копировать.

5.Перейдите на рабочий лист “Счет” и щелкните на ячейке A4.

6.Выполните команду Правка | Специальная вставка.

7.Установите переключатель Вставить в позицию значения и закройте диалоговое окно щелчком на кнопке OK.

62 Глава 2. Excel: прайс-лист для автоматического составления заказа

8.Выполните команду Сервис | Макрос | Остановить запись.

Макрос записан. Теперь остается назначить его командной кнопке. Для этого следует щелкнуть правой кнопкой мыши на кнопке “Счет”, выбрать в контекстном меню команду Назначить макрос и выбрать макрос с именем Первый_способ. Теперь все описанные выше действия будут выполняться по щелчку мыши на кнопке “Счет” (рис. 2.19). Разумеется, нетрудно будет включить в список выполняемых действий определение области печати и вывод листа на принтер — для этого надо просто выполнить эти действия до остановки записи макроса.

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

Рис. 2.19. Шаблон счета заполнен данными из бланка заказа по щелчку мыши на командной кнопке “Счет“

Анализ кода автоматически созданного макроса

Щелкните правой кнопкой мыши на кнопке “Счет”, выберите в контекстном меню команду Назначить макрос и в открывшемся диалоговом окне щелкните на кнопке Правка. В результате откроется окно кода с исходным текстом макроса Первый_способ (рис. 2.20).

Рис. 2.20. В окне кода отображается исходный текст макроса, записанного макрорекордером Excel

Постановка задачи 63

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

Range("A3:C12").Select

Выделить диапазон A3:C14: метод Select диапазона (объекта Range) выделяет заданную область.

Selection.Copy

Скопировать выделенную область в буфер обмена Windows: вызов метода Copy, принадлежащего объекту Selection, то есть выделенной области.

("Счет").Select

Перейти на лист “Счет”. Все тот же метод Select, но принадлежащий на этот раз рабочему листу, делает лист текущим.

Range("A4").Select

Выделить ячейку A4.

Selection.PasteSpecial Paste:=xlValues

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

Paste определяет, что именно подлежит вставке.

Этот пример демонстрирует очень простой способ изучения языка VBA. Если вы не знаете, как описать при помощи операторов VBA какую-то операцию, то следует запустить запись макроса и выполнить эту операцию вручную. Затем, после остановки записи, в окне редактора Visual Basic, можно будет прочитать описание всех выполненных действий в терминах языка VBA.

ПРИМЕЧАНИЕ

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

Второй способ формирования счета (макрос листа Excel работает с документом Word)

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

Постановка задачи

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

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

64 Глава 2. Excel: прайс-лист для автоматического составления заказа

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

Создание образца счета в Word

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

Рис. 2.21. Образец счета, подготовленный в текстовом процессоре Word

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

Вначале необходимо вставить в строку “Счет №...” два поля — поле типа “переменная документа” и поле “дата”.

Как вставить поля в документ Word

1.Поместите курсор ввода в позицию между “Счет №” и “от”.

2.В меню Вставка выберите команду Поле.

Постановка задачи 65

Рис. 2.22. Диалоговое окно Поле

3.В диалоговом окне Ïîëå выберите в списках Категории и Поля пункты Автоматизация документа и DocVariable соответственно (см. рис. 2.22).

4.Добавьте в строку описания поля в нижней части окна имя “Номер_счета”, как показано на рисунке.

5.Закройте диалоговое окно щелчком мыши на кнопке OK.

6.Поместите курсор ввода в позицию после слова “от”.

7.Вновь открыв окно Поле, выберите в списках Категории и Поля пункты Дата и время и

Date соответственно.

8.Щелкнув на кнопке Параметры, выберите в окне Параметры поля один из форматов отображения даты.

9.Закройте оба диалоговых окна щелчками на кнопках Добавить и OK.

Далее следует решить, каким образом можно попасть из макроса VBA в нужную позицию документа. Предположим, что данные из бланка заказа должны быть помещены между строками “Счет №…” и “Счет действителен…”. Самый простой метод ориентации в документе состоит в привязке к конкретному абзацу. На рис. 2.21 видно, что такой абзац намеренно оставлен пустым,

— пятый по счету. Запомним этот факт.

Осталось сохранить документ. В этом примере документ сохранен под именем C:\blank.doc. Заготовка готова.

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

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

ПРИМЕЧАНИЕ

Прежде чем приступить к созданию соответствующего кода, необходимо будет выполнить одну операцию, которая на языке программистов называется “задать ссылку на библиотеку”. Дело в том, что технология Automation (ранее она называлась OLE Automation) подразумевает, что VBAкод одного из приложений Office может обращаться к объектам другого приложения посредством библиотеки типов, ссылка на которую должна быть доступна упомянутому коду. Например, чтобы макрос в рабочей книге Excel мог обращаться к объектам Microsoft Word 2000, к нему нужно подключить библиотеку Microsoft Word 9.0 Object Library. Понятно, что если речь идет о Word другой версии, то название библиотеки может немного отличаться. Например, в пакете MS Office 97 эта библиотека называется Microsoft Word 8.0 Object Library.

Сама процедура создания макроса несколько отличается от тех, которые были рассмотрены ранее.

66 Глава 2. Excel: прайс-лист для автоматического составления заказа

Вернитесь в среду Excel и выполните команду Сервис | Макрос | Макросы. В диалоговом окне Макрос введите в поле Имя макроса строку “Второй_способ” — пусть это будет имя нашего будущего макроса. Щелкните на кнопке Создать. В результате откроется хорошо уже нам знакомое окно редактора Visual Basic, при этом в окне кода будет создана пустая процедура с заданным именем. Прежде чем вводить в нее код, задайте ссылку на библиотеку объектов Word.

Как задать ссылку на библиотеку объектов Word в среде MS Excel

1.Находясь в окне редактора Visual Basic, выполните команду Tools | References (Сервис |

Ссылки).

2.В списке Available References (Доступные ссылки) найдите пункт Microsoft Word 9.0 Object

Library.

3.Установите флажок напротив этого пункта.

4.Закройте диалоговое окно щелчком мыши на кнопке OK, теперь можно приступать к вводу исходного текста процедуры (листинг 2.2).

см. также в гл. 3 раздел “Как задать ссылку на библиотеку объектов Excel в среде MS Word”, в гл. 6 раздел “Ссылка на библиотеку объектов MS Access” и в гл. 9 раздел “Как подключить к Excel библиотеку типов

Outlook”.

ЛИСТИНГ 2.2

Sub Второй_способ()

Dim WD As Word.Application

Dim BillTable As Table

Dim TRow, TCol As Integer

Set WD = CreateObject("Word.Application")

WD.Visible = True

WD.Documents.Open "C:\blank.doc"

With WD.ActiveDocument

.Variables("Номер_счета").Value = "1"

.Fields.Update

End With

Set BillTable = WD.ActiveDocument.Tables.Add _

(WD.ActiveDocument.Paragraphs(5).Range, 12, 3)

For TCol = 1 To 3

For TRow = 1 To 11

BillTable.Cell(TRow, TCol).Range = _

ActiveSheet.Cells(TRow + 1, TCol).Value

Next TRow

Next TCol

BillTable.Cell(12, 1).Range = "Всего по счету" BillTable.Cell(12, 3).Range = ActiveSheet.Range("C13").Value

BillTable.AutoFormat Format:=wdTableFormatContemporary

End Sub

Постановка задачи 67

Чтобы связать созданный макрос с кнопкой Ñ÷åò, необходимо вновь выбрать в ее контекстном меню команду Назначить макрос. И в списке отобразившегося диалогового окна Назначить макрос объекту нужно выбрать пункт “Второй_способ”, завершив операцию щелчком мыши на

кнопке OK. Теперь кнопка Ñ÷åò готова к действию — достаточно щелкнуть на ней и макрос Второй_способ будет выполнен (рис. 2.23).

Анализ процедуры для работы с документом Word

Посмотрим внимательно на текст процедуры VBA.

Dim WD As Word.Application

Dim BillTable As Table

Dim TRow, TCol As Integer

В разделе описания переменных кое-что понятно и без дополнительных объяснений. Переменные TRow и TCol предназначены для хранения целочисленных значений. Переменная

BillTable — это таблица Word. А вот переменная WD, тип которой Word.Application, есть ни что иное, как… сам Word. Точнее, эта переменная станет приложением Word, когда выполнится оператор:

Set WD = CreateObject("Word.Application")

см. также в приложении раздел “Объектные переменные”.

Рис. 2.23. Макрос рабочего листа Excel создал счет в документе Word

Строка

WD.Visible = True

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

Далее к семейству документов, открытых в окне Word, добавляется заготовка

C:\blank.doc:

WD.Documents.Open "C:\blank.doc"

68 Глава 2. Excel: прайс-лист для автоматического составления заказа

Теперь этот документ стал текущим и его свойства доступны через объект ActiveDocument. Следующий код задает значение “1” для переменной документа с именем “Номер_счета” и принудительно обновляет все поля документа:

With WD.ActiveDocument

.Variables("Номер_счета").Value = "1"

.Fields.Update

End With

Создание таблицы в документе Word и ее автоформатирование

Настала пора создать в документе таблицу, в которую будут помещены полученные данные:

Set BillTable = WD.ActiveDocument.Tables.Add _

(WD.ActiveDocument.Paragraphs(5).Range, 12, 3)

ПРИМЕЧАНИЕ

Пробел и знак подчеркивания в тексте программы означают просто перенос на другую строку. При вводе этого оператора в окне кода весь оператор можно вводить целиком, игнорируя пробел и знак подчеркивания — “ _”.

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

Наконец, заполним таблицу данными из ячеек бланка заказа. Для этого потребуется перебрать ее по строкам и столбцам при помощи операторов цикла и двух переменных. Переменная TCol в нашем примере отвечает за столбцы, а TRow — за строки:

For TCol = 1 To 3

For TRow = 1 To 11

BillTable.Cell(TRow, TCol).Range = _

ActiveSheet.Cells(TRow + 1, TCol).Value

Next TRow

Next TCol

см. в приложении раздел “Цикл For … Next”.

Здесь в одной строке встречаются ячейки текущего рабочего листа Excel (ActiveSheet.Cells) и ячейки таблицы Word (BillTable.Cell). Как видим, ничто не ме-

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

В ячейку последней строки таблицы записывается строка “Всего по счету” и значение из ячейки C13 бланка заказа:

BillTable.Cell(12, 1).Range = "Всего по счету" BillTable.Cell(12, 3).Range = ActiveSheet.Range("C13").Value

Последняя строка макроса

BillTable.AutoFormat Format:=wdTableFormatContemporary

вызывает метод AutoFormat для таблицы в документе Word. Действие этого метода аналогично команде Автоформат меню Таблица приложения Word. Параметру Format было присвоено значение wdTableFormatContemporary, что соответствует формату Современный. Чтобы узнать имена констант, соответствующих другим вариантам автоформата, выделите в тексте макроса слово AutoFormat и нажмите клавишу [F1].

Постановка задачи 69

ПРИМЕЧАНИЕ

Выше уже упоминался тот факт, что библиотека объектов Word может называться по-разному в разных версиях пакета MS Office. Следствием этого факта проявляется следующий эффект: если перенести готовую рабочую книгу с макросами, для которых задана ссылка на такую библиотеку, в среду другой версии MS Office, то макрос “откажется работать” — ссылку на библиотеку объектов Word для него необходимо будет задать заново, удалив при этом старую ссылку.

Усовершенствования макроса рабочего листа Excel для работы с документом Word

Первое. Созданный макрос вполне работоспособен, но нуждается в некотором усовершенствовании. Прежде всего, необходимо автоматически генерировать номер счета. С этой целью в ячейки справа от кнопки Счет (в рассматриваемом примере это ячейки E15 и F15) были помещены значения “№” и “1000”. Предположим, что нумерация счетов должна начаться с 1000. Теперь можно использовать число, содержащееся в ячейке F15, в качестве счетчика:

ActiveSheet.Range("F15").Value = ActiveSheet.Range("F15").Value + 1

При генерации каждого нового счета это число будет увеличиваться на единицу, и вставляться в документ Word в позиции, определяемой переменной Номер_счета:

With WD.ActiveDocument

.Variables("Номер_счета").Value = _ ActiveSheet.Range("F15").Value

.Fields.Update End With

Второе. Далее, уберем строку WD.Visible = True, благодаря чему окно приложения Word не будет отображаться на экране автоматически. Вместо этого предоставим пользователю возможность выбора, организовав этот выбор при помощи условного оператора If…Then…Else… и функции MsgBox:

If MsgBox("Сохранить счет и выйти?", vbYesNo, "Счет") = _ vbYes Then

...

Else

...

End If

Рис. 2.24. Макрос запрашивает пользователя о дальнейшем ходе выполнения процедуры

Создание диалогового окна при помощи функции MsgBox

Строки "Сохранить счет и выйти?" и "Счет" определяют надпись и заголовок окна сообщения MsgBox (рис. 2.24). Параметр vbYesNo задает набор кнопок в диалоговом окне — это будут кнопки Äà и Íåò. В результате анализа значения, которое вернет функция MsgBox, будет выполняться код после оператора If… (пользователь выбрал Äà) или же после Else… (пользователь выбрал Íåò).

см. также в приложении разделы “Вывод сообщений (функция MsgBox)” и “Конструкция If … Then … Else … End If”.

70 Глава 2. Excel: прайс-лист для автоматического составления заказа

см. также в этой главе раздел “Создание процедуры Раскрсписок2_Изменение()” Листинг 2.1.

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

WD.ActiveDocument.PrintOut Copies:=2

Параметр Copies определяет количество копий для печати.

Четвертое. Затем, если пользователь согласен с тем, что документ надо сохранить и выйти из него (при этом никаких признаков Word так и не появится на экране), документ будет записан на диск под именем, в состав которого входит номер счета:

WD.ActiveDocument.SaveAs "C:\BILL" + _

Str(ActiveSheet.Range("F15"))

Функция Str вернет число из ячейки-счетчика, преобразованное в строку, в результате для первого счета имя файла будет C:\BILL1001.doc. Затем приложение Word, хранящееся в переменной WD, будет выгружено из памяти:

WD.Quit

В случае если пользователь не согласился с предложением “Сохранить счет и выйти?”, будет выполняться часть условной конструкции после оператора Else…

WD.Visible = True

WD.Activate

WD.WindowState = wdWindowStateMaximize

Свойство Visible отвечает за видимость объекта — в результате присваивания ему значения True приложение Word перестанет быть “невидимкой”. Метод Activate делает окно Word активным, то есть выводит его на передний план экрана. Наконец, свойство WindowState опреде-

ляет состояние окна: значение wdWindowStateMaximize разворачивает окно на весь экран. В результате “несогласный” пользователь получает возможность самому решать, что делать с готовым счетом дальше.

В итоговом варианте макрос приобретает следующий вид, как показано на листинге 2.2.

ЛИСТИНГ 2.3

Sub Второй_способ()

Dim WD As Word.Application

Dim BillTable As Table

Dim TRow, TCol As Integer

Set WD = CreateObject("Word.Application")

WD.Documents.Open "C:\blank.doc"

ActiveSheet.Range("F15").Value = _

ActiveSheet.Range("F15").Value + 1

With WD.ActiveDocument

.Variables("Номер_счета").Value = _ ActiveSheet.Range("F15").Value

.Fields.Update End With

Соседние файлы в папке Книги