Nickolay.info. Обучение. Полезные макросы в 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

Рейтинг@Mail.ru

вверх гостевая; E-mail