タブ幅やタブ位置をVBAから設定する
VBAからタブを設定する
既定のタブ幅をVBAで操る
タブ幅の設定って、結構めんどくさいなあと思っていた。んで、何とかVBAで操作できないものか、とちょっとggってみたんだが、これというものが見つからず(調べ方が悪いだけだと思うけど)、ちょいとマクロ記録をやってみた。
「段落」のところの右下隅っこをクリック。
一番下の「タブ設定」をクリック。
「既定値」のところのスピンボタンをクリックして、
「既定値」を「3 字」にする。
生成されたコードがコレ。
一応、コードも載せておくと、
Sub Macro1() ' Macro1 Macro' With Selection.ParagraphFormat .LeftIndent = MillimetersToPoints(0) .RightIndent = MillimetersToPoints(0) .SpaceBefore = 0 .SpaceBeforeAuto = False .SpaceAfter = 0 .SpaceAfterAuto = False .LineSpacingRule = wdLineSpaceSingle .Alignment = wdAlignParagraphJustify .WidowControl = False .KeepWithNext = False .KeepTogether = False .PageBreakBefore = False .NoLineNumber = False .Hyphenation = True .FirstLineIndent = MillimetersToPoints(0) .OutlineLevel = wdOutlineLevelBodyText .CharacterUnitLeftIndent = 0 .CharacterUnitRightIndent = 0 .CharacterUnitFirstLineIndent = 0 .LineUnitBefore = 0 .LineUnitAfter = 0 .MirrorIndents = False .TextboxTightWrap = wdTightNone .CollapsedByDefault = False .AutoAdjustRightIndent = True .DisableLineHeightGrid = False .FarEastLineBreakControl = True .WordWrap = True .HangingPunctuation = True .HalfWidthPunctuationOnTopOfLine = False .AddSpaceBetweenFarEastAndAlpha = True .AddSpaceBetweenFarEastAndDigit = True .BaseLineAlignment = wdBaselineAlignAuto End With Selection.ParagraphFormat.TabStops.ClearAll ActiveDocument.DefaultTabStop = MillimetersToPoints(11.1) End Sub
思わずうげっとなりそうなコード。
こんなにたくさんのプロパティが関わっているとは……。
ただ、落ち着いてよ~く見ると、タブ設定に関係していそうなのは
Selection.ParagraphFormat.TabStops.ClearAll ActiveDocument.DefaultTabStop = MillimetersToPoints(11.1)
ラスト2行のここだけっぽい。
要するに、
DocumentオブジェクトのDefaultTabStopプロパティ
で決まっているっぽいのだ。
右辺の
MillimetersToPoints(11.1)
ってのがよく分からんかったんだが、
なるほどね……。
「文字のポイント数×字数」を指定すれば、
○○文字分のタブ幅
にできるということだ。
文書全体の既定のタブ幅を設定するコード
リスト1 標準モジュール
Public Sub tabTest() ActiveDocument.DefaultTabStop = 10.5 * 6 End Sub
なんと、たったのこれだけ。
ActiveDocumentのDefaultTabStopプロパティに10.5ポイント6文字分の数値を指定する。
実行結果
こんなふうにタブを指定した段落を選択。既定のタブ幅が3字なのに、「大津びわこ」という5字の文字列や「向日町」、「和歌山」という3字の文字列があるので、それらの単語のところで間隔がちょっとおかしくなっている。
この段落を選択してリスト1を実行すると、
ほれ、この通り。タブ幅を最大文字数プラス1にしたことで、非常に美しく整列した。
段落のタブ位置をVBAで設定する
今度は、段落のタブ位置の設定をやってみる。
めんどくさいので、今度はいきなりコードを載せる。
リスト2 標準モジュール
Public Sub tabStopsTest() Dim fontSize As Single fontSize = Selection.Font.Size '……(1)' Dim i As Integer With Selection.ParagraphFormat '……(2)' .TabStops.ClearAll '……(*)' For i = 1 To 4 '……(3)' .TabStops.Add Position:= i * (fontSize * 6) Next .TabStops.Add Position:=fontSize * 45, _ Alignment:=wdAlignTabRight, _ Leader:=wdTabLeaderMiddleDot '……(4)' End With End Sub
(1)の
fontSize = Selection.Font.Size
では、選択位置のフォントサイズを取得して変数fontSizeに格納している。
後で出てくるTabStopsコレクションのAddメソッドの引数Positionは、タブ位置をポイント数で指定するので、フォントサイズを変数に入れておくことで可読性が上がると思った。
(2)からの9行(実質7行)、
With Selection.ParagraphFormat .TabStops.ClearAll '……(*)' For i = 1 To 4 '……(3)' .TabStops.Add Position:= i * (fontSize * 6) Next .TabStops.Add Position:=fontSize * 45, _ Alignment:=wdAlignTabRight, _ Leader:=wdTabLeaderMiddleDot '……(4)' End With
は、SelectionオブジェクトからParagraphFormatオブジェクトへとたどって行き、そのTabStopsコレクションに対する処理。
(*)で一旦タブ位置をクリア。
めんどくさいから画像は載せないけれど、(*)の直後に
Debug.Print .TabStops.Count
としてTabStopsコレクションの要素数を調べてみると、イミディエイトに「7」と表示されたので、TabStopオブジェクトが消え去ったわけではないっぽい。
んで、(3)からの3行
For i = 1 To 4 '……(3)' .TabStops.Add Position:= i * (fontSize * 6) Next
で、TabStopsコレクションのAddメソッドを用いて6字分おきに4つのTabStopを設定する。
Addメソッドで引数Positionだけを設定した場合は左タブ・タブリーダなしになるらしい。
TabStopsコレクションのAddメソッドには引数が3つあるので、その挙動をご覧に入れるべく、(4)の
.TabStops.Add Position:=fontSize * 45, _ Alignment:=wdAlignTabRight, _ Leader:=wdTabLeaderMiddleDot
を追加したというわけ。
引数Alignmentによって、左揃え、右揃えなどを指定し、
引数Leaderによってタブリーダの種類を指定する。
ちなみに、タブリーダの種類を表す定数は、
こんな感じです。
上掲のコードでは、
- 45 字の位置に
- 右揃えタブ
- タブリーダは中点
というふうになっている。
実行結果
こんなふうにタブを挿入した段落を選択し、マクロを実行。
こんなふうにタブ位置が設定されている。
バッチリ設定されている。
これ、一つ一つ設定するのってめんどくさいんですよねー。
タブ位置をラクラク設定できるようなアドインでも作ってみるかなー。
ちょっと疑問
ココで、
TabStopsコレクションの要素数を調べてみると、イミディエイトに「7」と表示された
と書いたんだけれど、
なんで7なんだ????????
5つしかTabStopなんて設定していないはずなのに……。