Pers.narod.ru. Обучение. Полезные макросы в Word |
Документ содержит некоторые мои макросы, написанные и используемые для Word. Отдельные макросы могут попадаться и в других документах сайта, поищите по слову "макрос" с главной страницы. Как записать макрос в Word XP/2003 было в этой статье, в старших версиях офиса сделать это ничуть не сложнее.
Количество страниц для каждого файла из списка
Удаление пустых абзацев из документа Word
Пересохранение открытых файлов в другом формате
Количество страниц для каждого файла из списка |
Пишет посетитель:
Здравствуйте! Встретился со следующей проблемой: Для каждого файла *.doc из списка пытаюсь получить количество страниц (wdPropertyPages). Получаемые значения не соответствуют действительности! Список файлов представляет из себя строковый массив с именами файлов (path+name). Документы открываю в цикле: открываю, считываю количество страниц, закрываю документ. Возникает одна особенность: когда код прохожу ручками: все в норме: количество страниц адекватное, как только запускаю макрос - значения другие(меньше на порядок). Предполагал, что во время работы макроса количество страниц открываемого документа не успевает обновиться. Поставил задержку сначала в 1, потом 5 и т.д. секунд. Не помогло. Попробовал пройтись по абзацам, словам и в конце концов по символам документа, надеясь, что такая работа с документом позволит правильно подсчитать количество страниц. Не вышло. Если есть идеи, прошу поделиться!
Особо не разбирался, но следующий несложный код на VBA, вставленный в документ Word, сработал, т.е. определил число страниц для каждого из кучи файлов, найденных на всём диске c:
Правда, я тут открывал-закрывал файлы и смотрел число страниц через ActiveDocument. Офис был версии XP, в младших версиях VBA вообще глючный.
Private Sub CommandButton1_Click() Dim mySFO As FileSearch Dim foundFile Dim s As String Set mySFO = Application.FileSearch Dim filename As String Dim n As Integer With mySFO .NewSearch .LookIn = "c:\" .SearchSubFolders = True .filename = "*.doc" .FileType = msoFileTypeWordDocuments If .Execute() > 0 Then For q = 1 To .FoundFiles.Count Documents.Open filename:=.FoundFiles(q) n = ActiveDocument.ComputeStatistics(wdStatisticPages) s = s & ActiveDocument.Name & "=" & n & Chr(13) & Chr(10) ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges Next q End If End With MsgBox (s) End Sub
Для простоты сам документ с макросом находился на другом диске ( d: ) - чтоб не пытался открывать сам себя.
Также должно быть разрешено выполнение макросов (в Word XP/2003 - меню Сервис, Параметры, вкладка Безопасность, кнопка Зашита от макросов..., выбрать уровень Средняя).
Удаление пустых абзацев из документа Word |
Как-то мне понадобилось в большом объёме текста Word удалить лишние пустые абзацы, вставленные при копировании с Web-страницы после каждой строки. Но на попытку указать ^P
(символ "Абзац") в поле "Найти" стандартного окна поиска и замены, Word XP/2003 выдал "^P нельзя использовать как специальный символ в поле Найти". Пришлось быстренько подключить макрос.
Чтобы его "повесить" у себя, зайдите в меню Word Сервис, Макрос, Редактор Visual Basic, вставьте в модуль NewMacros текст процедуры, закройте Visual Basic, в верхнем меню Word зайдите Сервис, Настройка, в категории Макросы найдите макрос delVoidParagraphs
и перетащите его иконку из этого окна на нужную панель инструментов Word. Потом правая кнопка на добавленном значке, выбрать Основной стиль, затем так же правой кнопкой можно выбрать или нарисовать значок. Процедура описана для офиса XP/2003, в 2007/10 как-то так же, но неудобней, как и всё в нём.
У меня работает отлично, вот текст макроса:
Sub delVoidParagraphs() 'Удаление пустых абзацев в выделенном фрагменте With Selection.Find .ClearFormatting .Replacement.ClearFormatting .Text = "^0013{2;}" .Replacement.Text = "^p" .MatchWildcards = True .Format = False .Forward = True If Selection.Type = wdSelectionIP Then .Wrap = wdFindContinue Else .Wrap = wdFindStop End If .Execute Replace:=wdReplaceAll End With Selection.Collapse direction:=wdCollapseStart End Sub
Избавиться от лишних символов разрыва строки, которые тоже часто появляются при копировании текста из интернета в Word, ещё проще: окно "Найти и заменить", в поле "Найти" указываем специальный символ ^l
(крышечка и буква l - "эль" латинская малая), поле "Заменить на" оставляем пустым и нажимаем кнопку "Заменить всё".
P.S. Можно было обойтись и без макроса: ^0013{2;} в поле "Найти", ^p в поле "Заменить на", включён флажок "Подстановочные знаки". Но макрос удобней тем, что можно повесить на кнопку и нажимать в любой момент. Плюс работает над выделенным фрагментом.
Пересохранение открытых файлов в другом формате |
Так как открыть сразу кучу документов в Word - не проблема (в стандартном окне открытия есть множественный выбор), проблема может быть только в обработке (лень много раз нажимать "Сохранить как..."). Для этого случая полезней вставить маленький макрос, который перебирает все открытые документы и сохраняет их в выбранном формате (в приведённом коде - формат RTF, понятно, как изменить для других). Мне понадобилось для пересохранения большого количества заметок pwi (формат заметки в мобильной Windows).
Код макроса на VBA:
Sub Макрос1() Dim strDocName As String Dim intPos As Integer For q = 1 To Documents.Count strDocName = Documents.Item(q).Name Documents.Item(q).Activate intPos = InStrRev(strDocName, ".") If intPos = 0 Then strDocName = InputBox("Введите имя для пустого документа") Else strDocName = Left(strDocName, intPos - 1) & ".rtf" End If ActiveDocument.SaveAs FileName:=strDocName, FileFormat:=wdFormatRTF Next q End Sub
Проверено в офисе 2003, в старших версиях, надеюсь, тоже сработает. для обычного формата .DOC
, похоже, будет FileFormat:=wdFormatDOC
,
ну и тип .doc
, конечно.
Для перекодирования в формат "только текст в Юникоде" с разрывами строк LF (стиль Юникс, работает также в Андроиде) расширение изменилось на .txt
, а команда ActiveDocument.SaveAs
на
ActiveDocument.SaveAs FileName:=strDocName, FileFormat:=wdFormatText, _ Encoding:=65001, LineEnding:=wdLFOnly
Кстати, "по отдельности" файлы PWI можно открыть так:
В Word должны быть следующие конвертеры, чтобы работа с PWI шла нормально:
MSInkWriter MSInkWriter Template MSPocketInkWord MSPocketWord MSPocketWordTemplate
Проверить, какие конвертеры есть в Вашем Word, можно таким кодом:
Dim cnvWrdPrf As FileConverter For Each cnvWrdPrf In Application.FileConverters MsgBox (cnvWrdPrf.ClassName) Next cnvWrdPrf
гостевая; E-mail |