#vba #ms-word
#vba #ms-word
Вопрос:
В настоящее время я изучаю, как создавать макросы в word для поиска ошибок, таких как пробелы между словами, после предложений, код для этого широко доступен, и я использую приведенный ниже код, чтобы помочь выявить любые ошибки (я как бы смешал несколько макросов вместе, это не безупречно, поскольку они не работаюткажется, они хорошо взаимодействуют друг с другом, но это не мой вопрос).
Я пытаюсь выяснить, как отобразить номер страницы чего-либо, найденного в find and replace, и фрагмент текста, который он хочет заменить, в отчете в конце документа или, в идеале, в отдельном пустом, в каком-то удобочитаемом формате, я не могу найти никаких примеровэто и интересно, возможно ли это? Спасибо!
Option Explicit
Sub SpacingFixer()
'If something goes wrong, go to the errorhandler
On Error GoTo ERRORHANDLER
'Current page variable
CurPage = Selection.Information(wdActiveEndAdjustedPageNumber)
'Checks the document for excessive spaces between words
With Selection
.HomeKey Unit:=wdStory
With .Find
.ClearFormatting
.Replacement.ClearFormatting
'Here is where it is actually looking for spaces between words
.Text = " [ ]@([! ])"
'This line tells it to replace the excessive spaces with one space
.Replacement.Text = " 1"
.MatchWildcards = True
.Wrap = wdFindStop
.Format = False
.Forward = True
'execute the replace
.Execute Replace:=wdReplaceAll
End With
' Remove white space at the beginning of lines
With Selection.Find
.Text = "^p^w"
.Replacement.Text = "^p"
End With
Selection.Find.Execute Replace:=wdReplaceAll
' Removes spaces in first line
With Selection.Find
.Text = " {3,}"
.Replacement.Text = ""
End With
Selection.Find.Execute Replace:=wdReplaceAll
With .Find
'This time its looking for excessive spaces after a paragraph mark
.Text = "^p "
'What to replace it with
.Replacement.Text = "^p"
.MatchWildcards = False
.Wrap = wdFindStop
.Format = False
.Forward = True
'Execute the replace
.Execute Replace:=wdReplaceAll
End With
End With
ERRORHANDLER:
With Selection
.ExtendMode = False
.HomeKey Unit:=wdStory
End With
End Sub
Комментарии:
1. Функция replace не сможет перехватить страницу, пока это происходит. Имейте в виду, что разбивка на страницы в Word, как правило, скользкая вещь. См. Word не знает, что такое Страница, Дайя Митчелл wordmvp.com/Mac/PagesInWord.html — Я бы сначала перехватил номера страниц, на которых появляется найденный объект, сохранил эту информацию, а затем выполнил замену. — Что вы сделали для создания документа отчета? Я бы подошел к этому, создав массив для хранения термина и номера страницы, а затем экспортировал его в новый документ, а не перелистывал туда и обратно.
2. Спасибо за совет! Я думаю, именно поэтому существует не так много примеров подобных макросов. Я поиграю с этим. Я, вероятно, попытаюсь использовать скрипт, чтобы открыть новую пустую страницу в конце макроса и распечатать там массив, когда я смогу понять, как получить информацию.
3. Напротив, в Интернете много таких макросов. Примеры макросов, использующих F / R для извлечения страниц # для указанного содержимого, см.: msofficeforums.com/140662-post2.html ; и msofficeforums.com/149178-post3.html . Для ваших целей, однако, было бы лучше выполнить F / R с включенным отслеживанием изменений. Затем у вас есть возможность сгенерировать отчет об изменениях, используя либо исходную разбивку на страницы, либо исправленную разбивку на страницы. Смотрите, например: msofficeforums.com/133132-post2.html
4. Отлично, я изучу это.
Ответ №1:
Вы не можете использовать replaceAll, потому что это не позволит сделать паузу для записи номера страницы замены, я изменил ваш код на повторяющийся поиск / замену. Я также изменил его, чтобы использовать диапазон по сравнению с выбором, потому что это уменьшит часть потерянной скорости, перейдя от replaceAll к методу итерации. И, наконец, я добавил запись номеров разделов и страниц в текстовый файл, который будет создан в той же папке, что и документ.
Проверьте его и измените в соответствии с вашими потребностями.
Sub SpacingFixer()
Dim doc As Word.Document, rng As Word.Range
Dim FileNum As Integer
Dim oFile As String
On Error GoTo ERRORHANDLER
Set doc = ActiveDocument
Set rng = doc.Content
FileNum = FreeFile()
oFile = doc.path amp; "AuthorTec_Edits.txt"
If Dir(oFile, vbNormal) <> vbNullString Then
Kill oFile
End If
Open oFile For Append As #FileNum
Print #FileNum, "Extra spaces between words on Section:Page:"
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
'Here is where it is actually looking for spaces between words
.Text = " [ ]@([! ])"
'This line tells it to replace the excessive spaces with one space
.Replacement.Text = " 1"
.MatchWildcards = True
.Wrap = wdFindStop
.Format = False
.Forward = True
'execute the replace
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
' Remove white space at the beginning of lines
Print #FileNum, "Extra white space at beginning of lines on Section:Page:"
Set rng = doc.Content
With rng.Find
.Text = "^p^w"
.Replacement.Text = "^p"
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
' Removes spaces in first line
Print #FileNum, "Removed spaces in first line on Section:Page:"
Set rng = doc.Content
With rng.Find
.Text = " {3,}"
.Replacement.Text = ""
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
Print #FileNum, "Removed excessive spaces after a paragraph mark on Section:Page:"
Set rng = doc.Content
With rng.Find
'This time its looking for excessive spaces after a paragraph mark
.Text = "^p "
'What to replace it with
.Replacement.Text = "^p"
.MatchWildcards = False
.Wrap = wdFindStop
.Format = False
.Forward = True
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
ERRORHANDLER:
If Err.Number <> 0 Then
MsgBox Err.Number amp; vbCr amp; Err.Description, vbCritical
Err.Clear
Else
MsgBox "Action Complete"
End If
If FileNum <> 0 Then Close #FileNum
End Sub
Комментарии:
1. Спасибо! Я поиграю и опубликую то, что я создаю, здесь для других.
2. Это на самом деле делает все, что я мог попросить, и может быть изменено для поддержки других типов функций поиска и замены! Каждому, кто изучает макросы, есть чему поучиться из этого кода!
Ответ №2:
Добавлена возможность определять стили маркеров 1 и 2, заканчивающиеся точками, и печатать их в текстовом файле.
Также обнаружено, что если вы создаете бесконечный цикл, это потому, что .Перенос должен быть = wdFindStop
.Wrap = wdFindStop
Sub Spacingandbulletfixerwithreport()
Dim doc As Word.Document, rng As Word.Range
Dim FileNum As Integer
Dim oFile As String
On Error GoTo ERRORHANDLER
Set doc = ActiveDocument
Set rng = doc.Content
FileNum = FreeFile()
oFile = doc.Path amp; "AuthorTec_Edits.txt"
If Dir(oFile, vbNormal) <> vbNullString Then
Kill oFile
End If
Open oFile For Append As #FileNum
Print #FileNum, "Extra spaces between words on Section:Page:"
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
'Here is where it is actually looking for spaces between words
.Text = " [ ]@([! ])"
'This line tells it to replace the excessive spaces with one space
.Replacement.Text = " 1"
.MatchWildcards = True
.Wrap = wdFindStop
.Format = False
.Forward = True
'execute the replace
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
' Remove white space at the beginning of lines
Print #FileNum, "Extra white space at beginning of lines on Section:Page:"
Set rng = doc.Content
With rng.Find
.Text = "^p^w"
.Replacement.Text = "^p"
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
' Removes spaces in first line
Print #FileNum, "Removed spaces in first line on Section:Page:"
Set rng = doc.Content
With rng.Find
.Text = " {3,}"
.Replacement.Text = ""
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
Print #FileNum, "Removed excessive spaces after a paragraph mark on Section:Page:"
Set rng = doc.Content
With rng.Find
'This time its looking for excessive spaces after a paragraph mark
.Text = "^p "
'What to replace it with
.Replacement.Text = "^p"
.MatchWildcards = False
.Wrap = wdFindStop
.Format = False
.Forward = True
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
'search for bullet1s with full stops
Print #FileNum, "Removed Bullet 1s on Section:Page:"
Set rng = doc.Content
With rng.Find
.ClearFormatting
.Style = ActiveDocument.Styles("Bullet 1")
.Replacement.ClearFormatting
.Text = ".^p"
.Replacement.Text = ".^p"
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
'search for bullet2s with full stops
Print #FileNum, "Removed Bullet 2s on Section:Page:"
Set rng = doc.Content
With rng.Find
.ClearFormatting
.Style = ActiveDocument.Styles("Bullet 2")
.Replacement.ClearFormatting
.Text = ".^p"
.Replacement.Text = ".^p"
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
While .Execute
Print #FileNum, rng.Information(wdActiveEndSectionNumber) amp; ":" amp; rng.Information(wdActiveEndAdjustedPageNumber)
rng.Collapse Word.WdCollapseDirection.wdCollapseEnd
Wend
End With
ERRORHANDLER:
If Err.Number <> 0 Then
MsgBox Err.Number amp; vbCr amp; Err.Description, vbCritical
Err.Clear
Else
MsgBox "Action Complete"
End If
If FileNum <> 0 Then Close #FileNum
End Sub