選択範囲のルビを除去する(Word)
選択範囲のルビを除去する
青空文庫(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の可能性も広がるなあ、と感じました。