【Word VBA】和暦を西暦にするWordマクロ(変更履歴オン版)

2015年1月26日

以前紹介したマクロ「【Wordマクロ】和暦を西暦にする(その2) 」を変更履歴がオンになっている状態で用いると不具合を起こします。

変更履歴をオンにしたままで文字修正(置換や書き換えなど)を行うマクロを実行する場合には注意が必要ですね。他のマクロでも同じことが起こりえます。

以下の2つにご注意ください。

1.変更履歴をオンにした場合、文字列を書き直した場合でも履歴として削除したはずの文字列がデータとして残ります。そこで、削除済みの文字列を検索対象から除外する場合には、削除済みの文字列を非表示にします。

ところが、Rangeオブジェクトで文字列を検索すると、削除済みの文字列を非表示にした場合でもヒットしてしまいます。Selectionオブジェクトで検索をする場合には、削除済みの文字列を非表示にしておけばヒットしません。

2.変更履歴をオンにした場合、ワイルドカードを用いた置換は誤変換が起こることがあります。

これはWordのバグとして知られています。Word 2013でも修正されていません。

Wildcard Find and Replace with Track Changes

このマクロでできること

変更履歴をオンにした文書において、和暦を西暦にします。

動きは以前紹介した「【Wordマクロ】和暦を西暦にする(その2)」と同じです。

マクロの解説

変更履歴の表示をオフにしてから和暦を西暦に変換します。

Selectionオブジェクトで和暦を探しています。

マクロ


Sub 和暦を西暦に変換3()

 Dim blnShowRevisions As Boolean

 With ActiveDocument
  '変更履歴の表示状態の設定
  blnShowRevisions = .ShowRevisions '設定保存
  .ShowRevisions = False '表示オフ
 End With

 'カーソルを文書の先頭に移動
 ActiveDocument.Range(0, 0).Select
 
 With Selection.Find
  .Text = "[明大昭平][治正和成][0-90-9元]{1,2}年[0-90-9]{1,2}月[0-90-9]{1,2}日"
  .Forward = True
  .Format = False
  .Wrap = wdFindStop
  .MatchCase = False
  .MatchWholeWord = False
  .MatchByte = False
  .MatchAllWordForms = False
  .MatchSoundsLike = False
  .MatchFuzzy = False
  .MatchWildcards = True
  Do While .Execute = True
   Selection.Range.HighlightColorIndex = wdYellow
   Selection.Text = Format(Selection.Text, "mmmm d, yyyy")
   Selection.Collapse direction:=wdCollapseEnd
   DoEvents
  Loop
  .Text = ""
  .MatchWildcards = False '設定を解除
 End With
 
 '変更履歴の表示を元に戻す
 ActiveDocument.ShowRevisions = blnShowRevisions

End Sub

関連記事

-コード
-, , ,