変更履歴だらけにしたくないときに
ワードの原稿に変更履歴で修正を入れることがあります。複数出てくる名称等は、変更履歴をオンにしてCtr+Hなどで一括置換すると便利です。
しかしながら、一括置換も多用しすぎると、文書が変更履歴だらけになってしまいます。
例えば、「制御装置」を「制御部」に変えるとき、「制御」はそのままで、「装置」だけ「部」に変えてほしい。
前方一致部分には変更履歴をかけず、後方の相違部分のみに変更履歴をかけるマクロです。
Sub 後の差分だけ変更履歴置換() Dim i As Long Dim Tr As Boolean Dim Sh As Boolean Dim 変更前語句 As String Dim 変更後語句 As String Dim 一致部分 As String Dim 変更部分前 As String Dim 変更部分後 As String 変更前語句 = InputBox("変更前語句を入力してください") 変更後語句 = InputBox("変更後語句を入力してください") If Len(変更前語句) = 0 Or Len(変更後語句) = 0 Then MsgBox ("変更前語句又は変更後語句の入力がないため処理を終了します"): Exit Sub If Left(変更前語句, 1) <> Left(変更後語句, 1) Then MsgBox ("前方不一致のため処理を終了します"): Exit Sub '前方の一致部分と、後方の相違部分を分離します For i = 2 To Len(変更前語句) If i > Len(変更後語句) Then Exit For If Mid(変更前語句, i, 1) <> Mid(変更後語句, i, 1) Then Exit For Next i i = i - 1 一致部分 = Left(変更前語句, i) If i = Len(変更前語句) Then 変更部分前 = "" Else 変更部分前 = Mid(変更前語句, i + 1, Len(変更前語句) - i) End If If i = Len(変更後語句) Then 変更部分後 = "" Else 変更部分後 = Mid(変更後語句, i + 1, Len(変更後語句) - i) End If With ActiveDocument Tr = .TrackRevisions Sh = .ShowRevisions ActiveDocument.TrackRevisions = True ActiveDocument.ShowRevisions = True Call 後ろだけ置換する(一致部分, 変更部分前, 変更部分後) .TrackRevisions = Tr .ShowRevisions = Sh End With End Sub Sub 後ろだけ置換する(ByRef 検索文字 As String, ByRef 変更前 As String, ByRef 変更後 As String) Dim rng As Range Dim rngCur As Range Dim rngEnd As Long Dim 選択位置 As Long Dim noSelection As Boolean: noSelection = False Set rngCur = Selection.Range With ActiveDocument If InStr(1, .StoryRanges(wdMainTextStory).Text, 検索文字, vbTextCompare) > 0 Then If Len(Selection.Text) < 3 Then Set rng = .Range(0, .Bookmarks("\EndOfDoc").End) noSelection = True Else Set rng = Selection.Range End If rngEnd = rng.End Do If 語句あるか(検索文字, rng) = True Then 選択位置 = Selection.Range.End Set rng = .Range(選択位置 + Len(変更後), rngEnd) If .Range(選択位置, 選択位置 + 1).Text = "" Then 選択位置 = 選択位置 + 1 If .Range(選択位置, 選択位置 + Len(変更前)).Text = 変更前 And (.Range(選択位置, 選択位置 + Len(変更後)).Text <> 変更後 Or 変更後 = "") Then If 変更前 <> "" Then .Range(選択位置, 選択位置 + Len(変更前)).Text = "" .Range(選択位置, 選択位置 + Len(変更前)).InsertAfter (変更後) End If If noSelection = True Then rngEnd = .Bookmarks("\EndOfDoc").End Else Exit Do End If Loop Set rng = Nothing End If End With rngCur.Select Set rngCur = Nothing End Sub Function 語句あるか(ByRef 検索文字 As String, ByRef rng As Range) As Boolean If Not rng Is Nothing Then rng.Select With Selection.Find .ClearFormatting .Replacement.ClearFormatting .Text = 検索文字 .Format = False .Forward = True .Wrap = wdFindStop .MatchWildcards = False .MatchFuzzy = True 語句あるか = .Execute .Text = "" .MatchFuzzy = False End With End Function
例えば、↓のような文書を用意して、マクロを実行します。
すると、変更前語句を聞かれますので、例えば制御装置と入力します。
続いて、変更後語句を聞かれますので、制御部と入力します。
実行結果は、↓のとおりです。「制御」には、変更履歴がかからず、「装置」が削除され、「部」が追加されます。