(Продолжение, начало см. в МК № 1,2 (172,173))

Автотекст

Думаю, что предложенные в предыдущих частях материала примеры дают представление о режимах управления Input и Output файлами последовательного доступа. Но помимо получения данных в приложение пользователь должен иметь возможность оперировать ими в конкретном документе. Как распорядиться имеющимися данными в диалоговых формах, разработчик должен определиться сам (понимаем: написать программный код, исходя из формы, стиля документа или Шаблона).

Решения могут быть различными, например:

• помещать в нужный параграф Word’овского документа;

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

ActiveDocument.Tables(1).Cell(9, 2).Range.InsertAfter »Ваши данные»

Хотелось обратить внимание, что адресация ячеек аналогична Excel’ю, где Cell(9, 2) не что иное как Ячейка (9-ой строки, 2-ой колонки) таблицы.

Оформление Шаблона в табличном виде предпочтительнее, т. к. в этом случае создаваемый документ имеет четкие правила заполнения и Рис. 1форматирования.

Не претендуя на оригинальность, предлагаю осуществить считывание из текстовой базы данных не в Контрол, а в объект Автотекст. Word’овская встроенная справка предоставляет расширенную инструкцию по пользованию автотекстом, в MS Office 97 даже с элементами анимации, поэтому оговорю лишь следующее: при наборе начальных символов выражений, имеющих продолжение в образцах автотекста, в документе появляется выноска с вариантом продолжения заполнения (рис. 1), после чего для окончательного ввода предложенного варианта фразы пользователю достаточно нажать клавишу ENTER или F3, или TAB.

Ограничения, накладываемые на объект VBA автотекст (AutoTextEntries):

• имя — до 32 символов,

• содержание — до 255 символов.

Пример диалогового окна Автозамена с выделенной вкладкой Автотекст показан на рис. 2.

Пример панели инструментов Автотекст, заполненной новыми элементами, показан на рис. 3.

Рис. 2 Рис. 3

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

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

Sub ToFillin_Avtotext ( ) ‘Процедура заполнения автотекста новыми элементами ‘Это было описано ранее. Dim sBuf1 As String, sBuf2 As String, sBuf3 As String, sBuf4 As String, sBuf5 As String, sBuf6 As String, sBuf7 As String Dim FileNo As Long ‘Строковая переменная для объединения всех данных из базы по конкретному контрагенту в одно предложение. Dim StringToBar As String ‘Вызов процедуры удаления предыдущих элементов автотекста (если не удалить предыдущие элементы автотекста, новые просто будут добавлены к старым). Call Del_Avtotext ‘Это было описано ранее. FileNo = FreeFile Open »C:\Мои документы\Const.txt» For Input As #FileNo ‘документы While Not EOF(FileNo) Line Input #FileNo, sBuf1 Line Input #FileNo, sBuf2 Line Input #FileNo, sBuf3 Line Input #FileNo, sBuf4 Line Input #FileNo, sBuf5 Line Input #FileNo, sBuf6 Line Input #FileNo, sBuf7 ‘Удаление всех символов табуляции, которые могли быть ошибочно введены пользователем вместо пробелов при заполнении базы через текстовый редактор, и замена их пробелами. Call Exchange(sBuf2) Call Exchange(sBuf3) Call Exchange(sBuf4) Call Exchange(sBuf5) Call Exchange(sBuf6) Call Exchange(sBuf7) StringToBar = sBuf2 & » » & sBuf3 & » » & sBuf4 & » » & sBuf5 & » » & sBuf6 & » » & sBuf7 ‘Выделение слева первых 32 символов, в противном случае работа всего приложения будет некорректно завершена. К сожалению, в Word’е не предусмотрены обработчики данной ошибки и эта ошибка является критической для всей системы. sBuf2 = Left(sBuf2, 32) ‘Задаем имя автотексту. ActiveDocument.AttachedTemplate.AutoTextEntries.Add Name:=sBuf2, Range:=Selection.Range ‘Задаем содержание автотекста, выделяя слева только 255 символов, в противном случае ошибка критична для системы. ActiveDocument.AttachedTemplate.AutoTextEntries(sBuf2).Value = Left(StringToBar, 255) Wend Close #FileNo End Sub Sub Del_Avtotext ( ) ‘Процедура удаления элементов автотекста ‘Переменная для количества элементов автотекста. Dim Quantity_Avtotext As Long ‘Переменная для цикла удаления. Dim i As Long Application.DisplayAutoCompleteTips = True ‘Определяем количество элементов автотекста. Quantity_Avtotext = ActiveDocument.AttachedTemplate.AutoTextEntries.Count ‘Цикл удаления элементов автотекста. Запись цикла в предложенном виде уместна, так как возможен случай попытки удаления элементов автотекста, когда их уже нет — (Quantity_Avtotext = 0). Пояснение к инструкции: Шаг счетчика «Step» в цикле равен «1». В случае, когда величина шага будет больше конечного значения счетчика цикла «Quantity_Avtotext», цикл не будет выполнен ни разу, а генерации ошибки не произойдет. For i = 1 To Quantity_Avtotext Step 1 ActiveDocument.AttachedTemplate.AutoTextEntries(Quantity_Avtotext — (i — 1)).Delete Next i End Sub Sub Exchange(MyString As String) ‘Процедура замены символов табуляции на пробелы. Dim Pos As Integer ‘Цикл просмотров строки на предмет наличия символа табуляции с заменой их пробелом. Повторяется до тех пор, пока не останется ни одного символа табуляции «vbTab». Do ‘Определение номера позиции первого символа табуляции. Используется VB-функция InStr, назначение которой — искать первый символ образца поиска слева направо в обрабатываемой строке. Pos = InStr(MyString, vbTab) ‘Если номер позиции не есть ноль, тогда символ с указанным порядковым номером заменяется пробелом. Используется VB-инструкция Mid. If Pos > 0 Then Mid(MyString, Pos) = » » Loop Until Pos = 0 End Sub

Дополнительные сведения по Mid, InStr и For … Next можете взять во встроенной справке по VBA MS Office.

Startup (Автозагрузка)

Шаблоны Word’а, помещенные в папку автозагрузки, загружаются автоматически при каждом открытии Word’а. Для задания или изменения папки автозагрузки выберите команду Параметры в меню Сервис, а затем — вкладку Расположение. По умолчанию в MS Office 97 место папки автозагрузки —C:\Program Files\Microsoft Office\Office\STARTUP. Поместив свой шаблон в каталог автозагрузки (пример показан на рис. 4), вы получите возможность автоматического запуска макрокоманд Шаблона для создания панелей и меню. Кстати, этот прием был использован разработчиками системы автоматической проверки правописания «Рута» и переводчика «Плай» (см. МК №38 за 2001 г., статья «Что такое «Рута» по-украински?», автор Дмитрий Хмара). Разработчику в данном случае нет необходимости беспокоиться о восстановлении меню и панелей после удаления их пользователем. При очередном запуске Word’а Шаблоны, находящиеся в папке автозагрузки (рис. 5) будут автоматически присоединены к документу, и, как следствие, удаленные панели и меню будут восстановлены.

Рис. 4 Рис. 5

Для автоматического запуска макрокоманд в Word’е в различных режимах зарезервированы слова (см. табл.).

Пример возможного синтаксиса:

Sub AutoExec ( ) Имена процедуры или нескольких процедур, которую необходимо выполнить. End Sub

Исходя из назначений зарезервированных слов, можно предположить, что основными при разработке Шаблонов будут первые два. AutoExecобязательно придется использовать, если возникнет решение поместить Шаблон в папку Startup, а AutoNew — при помещении файла Шаблона в папку коллекции Шаблонов MS Office. Дополнительную информацию вы Таблицаможете получить во встроенной справке.

(Продолжение следует)