選択範囲のルビを除去する
青空文庫(HTML版)からWordに文章をコピペすると、


こんなふうに、むやみやたらとデカいルビが設定されていて、レイアウトがめちゃくちゃになる。
ルビのサイズを小さくすることも考えたが、ひとまず選択範囲のルビを除去する方向で考えた。
参考サイト
テキトーにggってみると、
みんなのワードマクロ様のページ
様がヒット。
大いに参考にさせていただきました。
ありがとうございます。
要点
みんなのワードマクロ様の記述によると、ポイントは次の3点。すなわち、
- ルビの部分はフィールドになっている
- ルビが設定されている場合、フィールドに「
\s\up」というスイッチが書かれている PhoneticGuideメソッドを引数を「""」にして実行すると、ルビが解除された状態になる
との由。
なるほど、ルビのところをクリックしてみると、

確かに、フィールドになっているっぽい。
んで、右クリックしてやると、

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

こんなふうにフィールド コードが表示される。確かに、「\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プロパティがないみたいなので、仕方がないのかも。この辺はまだ研究不足です。
実行
こんなふうに、テキトーな範囲をドラッグして選択し、

次のコードで実行してみる。
リスト2 標準モジュール
Public Sub removeRubiesMain() On Error GoTo Finalizer Application.ScreenUpdating = False Call removeSelectionRubies(Selection) Finalizer: Application.ScreenUpdating = True End Sub
一応エラー対応とか画面チラつき防止なんかも入れたので行数がかさんでいるけれど、実質1行。
引数にSelectionを渡してremoveSelectionRubiesメソッドを実行しているだけ。
実行結果

この通り、選択範囲のルビが除去された。
おわりに
フィールドの操作が自在にできるようになったら、WordVBAの可能性も広がるなあ、と感じました。