WWW.TEKCT.RU
Самоучитель Гончарова

Пакетная обработка файлов в Word

Функцию автоматической замены фрагментов текста в нескольких файлах поддерживают многие текстовые редакторы. Но обычно в них «что заменить» и «чем заменить» — небольшие поля, и ввести в них объемный текст, разделенный на строки, весьма проблематично. А если надо не заменить, а только добавить текст в нужное место? Когда файлов десятки и сотни, на такую работу уходит много времени. Нужна автоматизация. Решения в Интернете найти можно, но все они, мягко говоря, недоработанные. Поэтому я предложу свой вариант. Он тоже не претендует на универсальность, но на его основе можно сделать средства автоматизации для самых разных случаев (замена текста, добавление текста и т.д.). Важно и то, что используется одна из самых популярных программ: MS Word.

Этот инструмент (макрос Word) предназначен для решения вполне конкретной задачи, и надо ее подробно сформулировать. Итак, имеется набор веб-страниц (файлов типа php), в которые надо добавить фрагменты html-кода. В каждом файле указано, куда надо вставить код. К примеру, это комментарий: <!-- Insert the code here -->. Файлов много, все они в кодировке UTF-8.

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

Word может открывать php-файлы, но открывает он их как браузер, а получить доступ к коду страницы невозможно. Тем более важно открывать файлы программным способом, а не через диалог (на мой взгляд, это более чем странно, но я разработчиками Word не командую, и могу только недоуменно развести руками). Хорошо, хоть VBA выручает, и на том спасибо.

Для работы нам потребуется отдельная папка (например, C:\myfiles\). В ней мы поместим файл с кодом (текстом) для вставки (например, code1.txt). Этот файл надо сохранить в формате UTF-8, проще всего сделать это с помощью Блокнота.

Осталось написать макрос. То есть это мне надо написать, а вам только скопировать и вставить в программный модуль Word. Макрос был опробован в MS Word 2010 версия для дома и учебы.

Итак, как он работает? Для доступа к файлам используется функция Dir(). Сначала открывается файл code1.txt. Его содержимое копируется в буфер. Если файла нет, выполнение макроса прекращается. Затем программа ищет файлы в указанной папке, используя шаблон (*.php в нашем случае). Как только файл найден, он открывается как текстовый файл в формате UTF-8. Происходит поиск нужного фрагмента (<!-- Insert the code here -->). Если он обнаружен, у пользователя спрашивают разрешение на вставку кода (ответ помещается в переменную Ansv). Я решил оставить такой полуавтоматический режим, хотя макрос легко модифицировать, чтобы он работал полностью автоматически. Открытый файл становится активным, найденный фрагмент подсвечен, и пользователь может легко контролировать процесс.

Диалоговое окно содержит 3 кнопки: Да (вставить фрагмент), Нет (не вставлять фрагмент в данном файле) и Отмена (прекратить работу макроса).

Если в конкретном файле необходимый фрагмент не найден, об этом тоже выводится сообщение.

Если же текст кода вставлен (после найденного фрагмента, из буфера обмена и в новый абзац), файл сохраняется и закрывается. Из этого следует, что во время работы макроса нельзя что-либо копировать в буфер обмена (конечно, если требуется надежность, можно сделать так, чтобы текст из файла code1.txt копировался в буфер обмена каждый раз перед вставкой в очередной файл, но это несколько усложнит код макроса).

Есть тут, правда, и небольшая проблема (а может, она уже не актуальна). Дело в том, что в php-файлах, записанных в кодировке UTF-8, зачастую удаляют BOM (Byte Order Mark) — маркер последовательности байтов. По стандарту он нужен, но с ним отображение веб-страниц может происходить некорректно… Ну всё как обычно. Так вот, Word при сохранении файла восстанавливает BOM. Как в пакетном режиме удалить BOM из файлов, я не знаю. Просто не возникало необходимости. Возможно, в Интернете можно найти решение.

Вот и всё. Работает макрос быстро, избавляет пользователя от рутины. В конце работы выводится сообщение, в котором указывается количество отредактированных файлов (счетчик Cn).

Кстати, макрос написан так, что если заданный фрагмент не найден (когда файлов десятки и сотни, такая ситуация весьма вероятна), файл остается открытым. Это позволяет просмотреть такие файлы и вставить нужный фрагмент кода вручную, тем более что файл code1.txt тоже открыт. Более удобного сервиса я придумать не смог.

Если вы захотите модифицировать макрос для своей задачи, то можете указать свои значения для переменных myPath (путь к рабочей папке), myTemp (шаблон имени файла для поиска файлов), myCode (имя файла с текстом для вставки), myFind (фрагмент, который надо найти, чтобы было ясно, куда вставить текст).

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

Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeParagraph

Ну вот, задача решена, надеюсь, вам этот макрос также поможет сэкономить время.

   27.06.2022

© TEKCT.RU, А. Гончаров, 2022

Рейтинг@Mail.ru