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

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

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

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

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

WD.ActiveDocument.PrintOut Copies:=2

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

WD.ActiveDocument.SaveAs _

"C:\BILL" + Str(ActiveSheet.Range("F15")) WD.Quit

Else

WD.Visible = True WD.Activate

WD.WindowState = wdWindowStateMaximize

End If

End Sub

Глава 3

Поверка гармонии Word алгеброй Excel

Кое-что о современном документообороте

Документооборот современного офиса отличается, прежде всего, многообразием. Давным-давно, во времена MS DOS и командных оболочек типа Norton Commander, управле-

ние большим количеством текстовых файлов не представляло серьезной проблемы. В самом крайнем случае, когда никакие другие способы найти нужный текст уже не помогали, отчаявшийся пользователь мог прибегнуть к сочетанию клавиш [Alt] + [F7] и ввести строку символов, которая, предположительно, должна содержаться в искомом файле. Если, например, он искал текст договора с фирмой “АБВГД”, то такой способ позволял найти в текущем каталоге все текстовые файлы, содержащие строку “АБВГД” — почти наверняка среди них находился и искомый документ.

В наше время простой текстовый файл все реже используется в качестве “хранилища” документа. Формат файла документа Word предоставляет неизмеримо более широкие возможности в плане форматирования текста, таблиц, рисунков и т.п. Документ Word позволяет проверить грамматику и орфографию, связать себя с графическим файлом или таблицей Excel — нет смысла перечислять все возможности Word. И без того всем понятно, что времена простого DOS-текста в качестве офисного документа безвозвратно уходят.

Однако каждый, кто по роду деятельности имеет дело с большим количеством документов Word, знает, что найти нужный документ порою бывает очень непросто. Тут не поможет командная оболочка и сочетание клавиш [Alt] + [F7] — текст содержится в файлах Word далеко не в простом виде.

Какие существуют пути для управления большим числом документов Word, или, если уж на то пошло, вообще документов? Иногда документ может представлять собой лист рабочей книги Excel, слайд из презентации PowerPoint или HTML-страницу. Прежде всего, конечно, классификация и структурирование. Можно создать отдельные папки (каталоги) для договоров, актов, накладных и т.д. Внутри каждой такой папки можно создать соответствующие вложенные папки — например, договора можно разбить по типам (купли-продажи, подряда и т.д.) и по контрагентам

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

ных документов. На практике это верно лишь отчасти. Проблема в том, что людям свойственно не только ошибаться, — им еще свойственно спешить. Стройная система классификации хороша до тех пор, пока она стройна на все 100 процентов. Если хотя бы время от времени помещать очередной документ не в ту папку, что требует классификация, или не сохранять его вовсе, то система теряет стройность. Работа есть работа — если срочно требуется подготовить какой-то договор или письмо, его делают из аналогичного документа, сделанного ранее. В спешке же первоисточник могут и не сохранить. И вот, спустя время, тот же самый или другой пользователь сталкивается с ситуацией: искомого документа в соответствующей папке нет. Что это значит? Такого документа вообще не было, или он кем-то ошибочно удален или помещен в другую папку? Неизвестно. И вот что обидно — такого документа, в самом деле, могло не быть вовсе, но как в этом теперь убедиться? Надо побеспокоиться об исполнительской дисциплине. Проинструктируем всех сотрудников еще раз!

Это все равно, что заставлять всех сотрудников всегда писать красивым “печатным” почерком. Никакие дисциплинарные меры (даже угроза “расстрела!”) не принесут 100%-го успеха, и в то же

74 Глава 3. Поверка гармонии Word алгеброй Excel

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

Посмотрим, какие технические решения из арсенала MS Office помогут нам “укротить стихию” современного документооборота.

Из документа Word в таблицу Excel

Упорядоченность и единообразие, свойственные Excel-таблице, представляются хорошим средством в противоположность трудно управляемой среды документов Word. Несомненно, если бы удалось скрестить эти две “стихии”, результат обладал бы многими интересными качествами. Можно подступиться к решению этой задачи с двух направлений.

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

Первое направление (оно будет рассмотрено в этом разделе) представляет собой такие методы “скрещивания”, благодаря которым документы Word продолжают существовать сами по себе, никак не интегрируясь с таблицей Excel, но при этом сами документы, так же как их важнейшие реквизиты, автоматически учитываются в своеобразной документной базе данных, роль которой призвана сыграть таблица Excel. Никаких ограничений на структуру или состав документа при этом не накладывается — это могут быть абсолютно произвольные документы самого различного происхождения. Рабочая книга Excel позволит автоматизировать учет документов (а также их версий) и обеспечит возможности поиска и доступа.

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

Подготовка таблицы документов

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

“Универсал” наиболее часто работают с такими документами, как договор, акт и доверенность. Некоторое число документов других типов будут отнесены к категории “Прочее”. Таким образом, нужно создать рабочую книгу, состоящую из четырех листов: “Договор”, “Акт”, “Доверенность” и “Прочее” (рис. 3.1). Конечно, это деление полностью условно. Ничто не мешает расширить этот набор или использовать совершенно другие категории — все зависит от конкретных обстоятельств. Впрочем, категория “Прочее” должна присутствовать обязательно — в нее будут попадать не только те документы, которые не соответствуют ни одной из других категорий, но и документы, принадлежность которых макросу не удастся правильно распознать.

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

Из документа Word в таблицу Excel 75

Строение этих листов должно быть однотипным: пусть первая строка представляет собой заголовок таблицы. Столбцы A, B и C будут использоваться для хранения ключевых сведений о документе. В столбец “Ссылка” будет помещаться гиперссылка на документ, позволяющая открыть его простым щелчком мыши. Столбец “Описание” предназначен для хранения некоторых ключевых реквизитов документа. Вначале, для простоты, будем помещать туда просто его первый абзац. Наконец, в ячейках столбца “Текст” будет храниться текст документа, или, по крайней мере, его часть. Наличие фрагментов текста на листе позволит, при необходимости, искать документ по вхождению строки символов, используя функции поиска Excel. Названия столбцов условные. Будем обращаться к столбцам по их номерам, поэтому, строго говоря, можно обойтись вообще без заголовков.

ПРИМЕЧАНИЕ

Единственный параметр, значение которого не терпит никакой двусмысленности — имя файла рабочей книги и путь к нему. Будущий макрос-архивариус должен обнаружить рабочую книгу по указанному пути. Предположим, что книга сохранена под именем DocTable.xls в корневом каталоге диска C:, таким образом, полный путь к файлу можно записать, как строку

C:\DocTable.xls.

Привязка макроса к команде Word

Теперь перейдем в окно MS Word.

Как всегда, перед созданием макроса необходимо подумать о способе его запуска. Текущий документ Word с точки зрения VBA представлен объектом ActiveDocument, который поддер-

живает ряд событий. Мжно было бы выполнять макрос по такому событию, как, скажем, Close (закрытие документа). Кроме того, запуск макроса можно обеспечить по нажатию сочетания клавиш. Но в данном случае обычные методы непригодны: нет смысла создавать новую запись в таблице документов каждый раз, когда закрывается документ — в процессе работы над документом, его, может быть, придется открыть и закрыть много раз. Запуск по нажатию сочетания клавиш плох тем, что требует от пользователя специальных усилий — пользователь должен не забыть это сделать. К счастью, существует возможность “привязать” макрос к команде Word. Такой макрос будет выполняться, как при выборе в меню соответствующей команды, так и при щелчке на кнопке панели инструментов, представляющей ту же команду Word. Конечно, сама команда Word также будет при этом выполняться. Наиболее подходящими представляются команды Сохранить, Сохранить как… и Печать. Если при выполнении одного из этих действий наш архивариус будет включать сведения о документе в таблицу, то с одной стороны, не будет упущен ни один представляющий интерес документ, а с другой — не будет перегружена таблица слишком большим числом излишних версий одного документа. Какое из действий наилучшим образом подходит для этого, читатель решит сам, а в данном примере в качестве команды-носителя используем команду Сохранить. Этой команде Word соответствуют следующие элементы интерфейса Word:

одноименная команда меню Ôàéë;

кнопка на панели инструментов Стандартная;

сочетание клавиш [Shift] + [F12].

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

ибудущй макрос.

Как заменить команду Word

1.Командой Сервис | Макрос | Макросы откройте диалоговое окно Макрос (рис. 3.2).

76 Глава 3. Поверка гармонии Word алгеброй Excel

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

2. Здесь доступны макросы Word, хранящиеся в различных местах. В списке Макросы из, в нижней части диалогового окна, выбран пункт Активных шаблонов. Это означает, что в окне отображаются макросы, хранящиеся в присоединенных к документу шаблонах, и в первую очередь, конечно, макросы из общего шаблона Normal.dot (Обычный). Общий шаблон — лучшее место для хранения нашего макроса, поскольку при этом не потребуется помещать никакой VBA-код в документы, и в то же время макрос будет всегда “под рукой”.

3. Разверните список Макросы из и выберите пункт Команд Word. В окне отобразится список команд, среди которых надо выбрать подходящую команду. Найдите команду FileSave — рядом с ней находится команда FileSaveAs (Сохранить как). Команде Печать соответствует пункт Print (рис. 3.3).

4. Просмотр команд Word потребовался нам здесь только для того, чтобы выбрать подходящую команду и запомнить ее имя. Команды Word, как таковые, нельзя изменить при помощи редактора Visual Basic — кнопка Изменить, как видно на рис. 3.3, отключена. Но не беда — можно создать одноименную команду, которая будет выполнять те же функции — Word автоматически заменит ею свою команду.

5.Снова разверните список Макросы из и выберите пункт Normal.dot (общего шаблона) или

Обычный.dot (общего шаблона).

6.Введите в поле Имя строку FileSave и щелкните на кнопке Создать. В результате, в окне ко-

да редактора Visual Basic будет создан одноименный макрос (рис. 3.4), который автоматически подменит соответствующую команду Word.

ПРИМЕЧАНИЕ

Понятно, что для “привязки” макроса к другой команде Word, здесь необходимо ввести в поле Имя другую строку. Например, если ввести строку FileSaveAs, то будущий макрос будет “привязан” к команде Сохранить как и будет выполняться только тогда, когда пользователь впервые сохраняет вновь созданный документ или же сохраняет существующий документ под новым именем.

Из документа Word в таблицу Excel 77

Рис. 3.3. Окно Макрос отображает список команд Word

Как видно на рис. 3.4, макрос уже содержит одну строку кода, которая, собственно, и выполняет операцию “Сохранить” по отношению к текущему документу. Теперь можно дополнить исходный текст макроса своим кодом, который будет выполняться каждый раз, когда пользователь сохраняет документ тем или иным способом: при помощи команды меню, кнопки панели инструментов или сочетания клавиш.

Рис. 3.4. Макрос, одноименный с одной из команд Word, автоматически содержит соответствующий код

ПРЕДУПРЕЖДЕНИЕ

Конечно, строку ActiveDocument.Save удалять из текста процедуры ни в коем случае нельзя, иначе документы Word перестанут сохраняться на диске.

Создаем макрос-архивариус Word-документов

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

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

Outlook”.

78 Глава 3. Поверка гармонии Word алгеброй Excel

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

1.Находясь в окне Word, откройте окно редактора Visual Basic командой Сервис | Макрос | Ре-

дактор Visual Basic.

2.В окне редактора Visual Basic выполните команду Сервис | Ссылки (Tools | References).

3.Найдите в списке пункт Microsoft Excel 9.0 Object Library.

ПРИМЕЧАНИЕ

в другой версии MS Office имя этой библиотеки может немного отличаться, например, в MS Office 97 она называется Microsoft Excel 8.0 Object Library.

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

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

Итак, все готово для создания задуманного макроса. Чтобы открыть окно программного кода с исходным текстом макроса, можно воспользоваться командой Сервис | Макрос | Макросы.

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

Еще раз напомним: автоматически созданная строка ActiveDocument.Save должна остаться без изменений. Чтобы лучше понять принцип действия макроса, вначале попробуем реализовать максимально упрощенный вариант, своего рода “действующую модель” (листинг 3.1).

ЛИСТИНГ 3.1

Sub FileSave()

ActiveDocument.Save

Dim EX As Excel.Workbook

Set EX = GetObject("С:\DocTable.xls")

With EX.ActiveSheet

.Cells(2, 3).Value = ActiveDocument.Range(0, 200).Text

.Cells(2, 2).Value = ActiveDocument.Paragraphs(1).Range.Text

.Hyperlinks.Add .Cells(2, 1), ActiveDocument.FullName

End With

EX.NewWindow

EX.Save

Set EX = Nothing

End Sub

Описание работы макроса-архивариуса Word-документов

Предположим, что файл рабочей книги DocTable.xls существует и находится в корневом каталоге диска C:. Откроем в окне Word какой-нибудь документ, пусть, например, это будет договор подряда (рис. 3.5).

Из документа Word в таблицу Excel 79

Рис. 3.5. В окне Word открыт документ

Сохраним документ любым способом, например, нажатием клавиш [Shift] + [F12]. Затем, запустив Excel и открыв рабочую книгу C:\DocTable.xls, посмотрим на ее содержимое. Пока не имеет значения, на каком листе книга открылась. Как видно, некоторые сведения о документе оказались записанными в таблицу (рис. 3.6).

Рис. 3.6. Таблица содержит сведения о сохраненном документе

Синяя строка в ячейке столбца “Ссылка” (она видна не полностью) представляет собой полный путь к файлу — гиперссылку на документ. При выборе этой строки мышью ее указатель приобретает вид руки с вытянутым указательным пальцем, а одиночный щелчок на такой ссылке приведет к открытию документа (разумеется, если файл документа по-прежнему находится в указанном месте). В ячейку столбца “Описание” помещен просто первый абзац документа, а в ячейке столбца “Текст” содержится первые 200 символов текста. Перейдя в режим редактирования содержимого ячейки C2, на экране появятся все, оодержащиеся в ней символы (рис. 3.7).

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

Анализ кода действующей модели архивариуса Word-документов в Excel

Прежде чем перейти от “действующей модели” к полноценному макросу, разберем исходный текст.

Dim EX As Excel.Workbook

Благодаря этой строке будет создана переменная типа “рабочая книга Excel” с именем EX.

80 Глава 3. Поверка гармонии Word алгеброй Excel

Автоматическое отображение на экране библиотеки объектов Excel

Кстати, ввод этой строки — хороший способ убедиться в наличии ссылки на библиотеку объектов Excel. После ввода символов As и пробела появится окно подсказки со списком всех доступных типов. Если ссылка на библиотеку объектов Excel задана, то среди прочих в списке будет присутствовать слово Excel. Если выделить в списке этот пункт и ввести точку, то слово будет помещено в строку, а рядом появится следующий список. Этот список и есть библиотека объектов Excel. Остается найти слово Workbook. Конечно, можно просто ввести с клавиатуры Excel.Workbook, не обращая внимания на происходящее на экране.

Set EX = GetObject("С:\DocTable.xls")

С выполнением этой строки объявленная выше переменная EX “наполнится содержанием”. Теперь она представляет рабочую книгу Excel, хранящуюся в файле С:\DocTable.xls. Она обладает всеми свойствами и методами рабочей книги и с ней можно обращаться точно таким же образом, как если бы это была открытая рабочая книга DocTable, и к ней обращались в среде Excel из программного кода. Единственное отличие: в редакторе Visual Basic рабочей среды Excel этот объект назывался бы ActiveWorkbook или ThisWorkbook, или же просто его имя было бы опущено, поскольку по умолчанию в Excel речь всегда идет о текущей книге. В данном случае этот объект называется EX. Поскольку объект EX был создан таким образом, что он не включает в себе само приложение (программу) Excel — окно Excel, даже скрытое, на экране присутствовать не будет — макрос Word со всем “справится сам”.

With EX.ActiveSheet

.Cells(2, 3).Value = ActiveDocument.Range(0, 200).Text

.Cells(2, 2).Value = ActiveDocument.Paragraphs(1).Range.Text

.Hyperlinks.Add .Cells(2, 1), ActiveDocument.FullName

End With

Макрос открыл книгу на активном листе, пока не имеет значения — на каком. Теперь с этим объектом, то есть с текущим рабочим листом (EX.ActiveSheet), будет выполнено несколько действий. Речь пойдет о ячейках второй строки. Индексы в скобках, после слова Cells, обозначают, соответственно, номер строки и номер столбца. В ячейку третьего столбца будут помещены первые 200 символов текста из активного документа Word, начиная с позиции 0. Ячейка второго столбца получит в качестве значения текст первого абзаца документа (Paragraphs(1).Range.Text). Затем в семейство гиперссылок (Hyperlinks) рабочей книги будет добавлена при помощи метода Add гиперссылка на текущий документ Word. Первый параметр метода Add указывает на ячейку листа, в которую нужно ввести гиперссылку, а второй представляет собой полное имя файла текущего документа.

Далее следуют завершающие строки макроса:

EX.NewWindow

EX.Save

Set EX = Nothing

Метод NewWindow создает экранное окно для книги — без этой строки книга останется скрытой при последующем ее открытии при помощи Excel и потребуется отобразить окно книги посредством команды Окно | Отобразить. Метод Save сохраняет книгу с внесенными в нее изменениями.

Освобождение системной памяти компьютера

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

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