【Word VBA】処理中に見えなくなった文字列を再表示するWordマクロ

2018年3月15日

Word 2007とWord 2010のバグと思われる挙動への対応策のマクロです。お客様からのご指摘で確認しまして対応策を講じましたので、その事例紹介です。

Word 2003、2013、2016ではこのバグと思われる挙動を再現できませんでしたので、Word 2007/2010の特有の現象だと思われます。

症状

段落書式の設定により段落の行間がさまざまに設定されたページがある場合、次のページの先頭の文字列が見えなくなる現象が起こります。

たとえば、段落書式を変更するマクロ(マクロ1)により段落の行間を交互に変更します。

マクロ1実行前

以下のように赤字と黒字で交互に段落が並んでいます。

マクロ1実行後

2ページ目の先頭には黒字の段落が表示されるはずですが、見えません。

余白を動かしたり文字列を挿入したりと文書を操作すると消えていた文字列が急に表示されます。

つまり、実際には文字列の情報はWordに保持されているのですが表示されていないのです。バグですね。

このマクロでできること

何らかの理由で一時的に非表示になっている文字列を表示します。

マクロ2実行前

上記のように2ページ目の先頭の文字が隠れてしまった状態です。

マクロ2実行後

2ページ目の先頭に黒字の段落が表示されました!

マクロ1の解説

マクロ1では、段落の行間を交互に変更します。これは、バグを再現するために作ったどうでもいいマクロです(笑)。

行間を1行と1.5行に交互に設定しています。

[段落]ダイアログボックスの以下の項目を1行と1.5行に変更する処理です。

そして、上記の[1ページの行数を指定時に文字を行グリッドにあわせる]をオンになるように段落書式を設定します。これが27行目の以下の処理に対応します。

myPara.Range.ParagraphFormat.DisableLineHeightGrid = False

マクロ1(段落書式を変更するマクロ)


Sub 行間を交互に変更する()
 
 Dim myPara As Paragraph
 Dim myDoc As Document
 Dim blnSingle As Long
 
 '-------------------------------------------
 '前処理
 '-------------------------------------------
 Set myDoc = ActiveDocument
 blnSingle = False
 
 '-------------------------------------------
 '段落の行間設定
 '-------------------------------------------
 For Each myPara In myDoc.Paragraphs
  With myPara.Range.ParagraphFormat
   '交互に段落の行間を変更
   If blnSingle = True Then
    blnSingle = False
    .LineSpacingRule = wdLineSpaceSingle
   Else
    blnSingle = True
    .LineSpacingRule = wdLineSpace1pt5
   End If
   '1ページの行数を指定時に文字を行グリッドにあわせる
   .DisableLineHeightGrid = False
  End With
 Next myPara
 
 '-------------------------------------------
 'オブジェクト変数の解放
 '-------------------------------------------
 Set myDoc = Nothing
 
End Sub

マクロ2の解説

非表示になっているマクロを表示させるためにいろいろ操作したところ、ページ設定を少し変化させて元に戻すといいことに気がつきました。

たとえば、ページ設定で1ページ当たりの行数を変更したり、1行当たりの文字数を変更したりするのです。

マクロ2では、1行当たりの文字数を1文字増やして、1文字減らす(元に戻す)処理をしています(13行目~18行目)。

セクションが1つしかない文書という前提の処理です。セクションが複数ある場合には、それぞれのセクション毎にページ設定を変更してください。

マクロ2(非表示の文字列を表示させるマクロ)


Sub 隠れた文字列を再表示する()
 
 Dim myDoc As Document
 
 '-------------------------------------------
 '前処理
 '-------------------------------------------
 Set myDoc = ActiveDocument
 
 '-------------------------------------------
 'ページ設定を変更して元に戻す
 '-------------------------------------------
 With myDoc.PageSetup
  '1行の文字数を1つ増やす
  .CharsLine = .CharsLine + 1
  '1行の文字数を1つ減らす
  .CharsLine = .CharsLine - 1
 End With
 
 '-------------------------------------------
 'オブジェクト変数の解放
 '-------------------------------------------
 Set myDoc = Nothing
 
End Sub

-コード
-, ,