選択範囲のルビを除去する(Word)

選択範囲のルビを除去する

青空文庫(HTML版)からWordに文章をコピペすると、

f:id:akashi_keirin:20181021181924j:plain

f:id:akashi_keirin:20181021181933j:plain

こんなふうに、むやみやたらとデカいルビが設定されていて、レイアウトがめちゃくちゃになる。

ルビのサイズを小さくすることも考えたが、ひとまず選択範囲のルビを除去する方向で考えた。

参考サイト

テキトーにggってみると、

みんなのワードマクロ様のページ

様がヒット。

大いに参考にさせていただきました。

ありがとうございます。

要点

みんなのワードマクロ様の記述によると、ポイントは次の3点。すなわち、

  • ルビの部分はフィールドになっている
  • ルビが設定されている場合、フィールドに「\s\up」というスイッチが書かれている
  • PhoneticGuideメソッドを引数を「""」にして実行すると、ルビが解除された状態になる

との由。

なるほど、ルビのところをクリックしてみると、

f:id:akashi_keirin:20181021181941j:plain

確かに、フィールドになっているっぽい。

んで、右クリックしてやると、

f:id:akashi_keirin:20181021181955j:plain

こんなメニューが出る。「フィールド コードの表示/非表示」をクリックすると、

f:id:akashi_keirin:20181021182005j:plain

こんなふうにフィールド コードが表示される。確かに、「\s\up」というのがあるのが見える(赤囲みは実際にはありません。)。

まあ、初心者はコレ見たらビビるやろなw

コード

次のようなメソッドを作った。

リスト1 標準モジュール
Public Sub removeSelectionRubies( _
             ByVal targetSelection As Selection)    '……(1)'
  Dim orgRange As Range
  Set orgRange = targetSelection.Range    '……(2)'
  Dim targetField As Field    '……(3)'
  For Each targetField In orgRange.Fields    '……(4)'
    With targetField
      If .Type = wdFieldFormula And _
         InStr(1, .Code.Text, "\s\up") > 0 Then    '……(5)'
        .Select    '……(6)'
        Call Selection.Range.PhoneticGuide("")    '……(7)'
      End If
    End With
  Next
End Sub

(1)の

Public Sub removeSelectionRubies(ByVal targetSelection As Selection)

では、Selectionオブジェクトを引数として受け取るように指定。

(2)の

Set orgRange = targetSelection.Range

で引数で受け取った選択範囲をRangeオブジェクトとして変数orgRangeにぶち込んでおく。

(3)の

Dim targetField As Field

Field型の変数targetFieldを用意。

(4)からの9行(実質8行)

For Each targetField In orgRange.Fields
  With targetField
    If .Type = wdFieldFormula And _
       InStr(1, .Code.Text, "\s\up") > 0 Then    '……(5)'
      .Select    '……(6)'
      Call Selection.Range.PhoneticGuide("")    '……(7)'
    End If
  End With
Next

では、For Each ~ Nextを用いて、選択範囲の各Fieldオブジェクトに対して処理を行う。

まず、(5)の

If .Type = wdFieldFormula And _
   InStr(1, .Code.Text, "\s\up") > 0 Then

で、Fieldオブジェクトが数式フィールドであるかどうかと、フィールドに「\s\up」が含まれているかどうかを判定。

共にTrueであれば、ルビが設定されているということになるので、(6)の

.Select

で一旦当該のFieldオブジェクトを選択し、(7)の

Call Selection.Range.PhoneticGuide("")

PhoneticGuideメソッドを実行してルビを除去する。

(7)のSelectがちょっとうっとうしいけれど、FieldオブジェクトにはRangeプロパティがないみたいなので、仕方がないのかも。この辺はまだ研究不足です。

実行

こんなふうに、テキトーな範囲をドラッグして選択し、

f:id:akashi_keirin:20181021182020j:plain

次のコードで実行してみる。

スト2 標準モジュール
Public Sub removeRubiesMain()
On Error GoTo Finalizer
  Application.ScreenUpdating = False
  Call removeSelectionRubies(Selection)
Finalizer:
  Application.ScreenUpdating = True
End Sub

一応エラー対応とか画面チラつき防止なんかも入れたので行数がかさんでいるけれど、実質1行。

引数にSelectionを渡してremoveSelectionRubiesメソッドを実行しているだけ。

実行結果

f:id:akashi_keirin:20181021182031j:plain

この通り、選択範囲のルビが除去された。

おわりに

フィールドの操作が自在にできるようになったら、WordVBAの可能性も広がるなあ、と感じました。

参考

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com