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 версия для дома и учебы. Sub Edit_many_files() Dim myPath$, myTemp$, myFileName$, myFind$, myCode$ Dim Cn As Integer myPath = "C:\myfiles\" ' Путь к папке myTemp = "*.php" ' Шаблон веб-страниц myCode = "code1.txt" ' Файл с кодом для вставки myFind = "<!-- Insert the code here -->" ' Фрагмент, после которого ' надо вставить код Cn = 0 ' Счетчик обработанных файлов myFileName = Dir(myPath & myCode) If Len(myFileName) > 0 Then Documents.Open FileName:=myPath & myFileName,_ Format:=wdOpenFormatUnicodeText Set Range1 = Documents(myCode).Content Range1.Copy Else MsgBox "Файл с кодом (" & myCode & ") не найден" Exit Sub End If ' Перебор файлов myFileName = Dir(myPath & myTemp) Do While Len(myFileName) > 0 Documents.Open FileName:=myPath & myFileName,_ Format:=wdOpenFormatUnicodeText Documents(myFileName).Activate Set myRange = ActiveDocument.Content myRange.Find.Text = myFind myRange.Find.Execute If myRange.Find.Found = True Then myRange.Select Ansv = MsgBox("Вставить код ПОСЛЕ?", vbYesNoCancel, "Найден текст") If Ansv = vbYes Then 'Да Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.TypeParagraph Selection.Paste Documents(myFileName).Save ' NoPrompt:=True,_ OriginalFormat:=wdOriginalDocumentFormat Documents(myFileName).Close Cn = Cn + 1 End If If Ansv = vbCancel Then 'Отмена Exit Sub End If Else MsgBox "В файле " & myFileName & " фрагмент не найден" End If myFileName = Dir ' Следующий файл Loop MsgBox "Файлы " & myTemp & " (" & Str(Cn) & ") обработаны" End Sub Итак, как он работает? Для доступа к файлам используется функция 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 | ||
|