タブ幅やタブ位置をVBAから設定する

VBAからタブを設定する

既定のタブ幅をVBAで操る

タブ幅の設定って、結構めんどくさいなあと思っていた。んで、何とかVBAで操作できないものか、とちょっとggってみたんだが、これというものが見つからず(調べ方が悪いだけだと思うけど)、ちょいとマクロ記録をやってみた。

f:id:akashi_keirin:20171023212110j:plain

「段落」のところの右下隅っこをクリック。

f:id:akashi_keirin:20171023212121j:plain

一番下の「タブ設定」をクリック。

f:id:akashi_keirin:20171023212130j:plain

「既定値」のところのスピンボタンをクリックして、

f:id:akashi_keirin:20171023212139j:plain

「既定値」を「3 字」にする。

f:id:akashi_keirin:20171023212152j:plain

生成されたコードがコレ。

一応、コードも載せておくと、

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)

ってのがよく分からんかったんだが、

f:id:akashi_keirin:20171023212159j:plain

なるほどね……。

「文字のポイント数×字数」を指定すれば、

○○文字分のタブ幅

にできるということだ。

文書全体の既定のタブ幅を設定するコード

リスト1 標準モジュール
Public Sub tabTest()
  ActiveDocument.DefaultTabStop = 10.5 * 6
End Sub

なんと、たったのこれだけ。

ActiveDocumentのDefaultTabStopプロパティに10.5ポイント6文字分の数値を指定する。

実行結果

f:id:akashi_keirin:20171023212226j:plain

こんなふうにタブを指定した段落を選択。既定のタブ幅が3字なのに、「大津びわこ」という5字の文字列や「向日町」、「和歌山」という3字の文字列があるので、それらの単語のところで間隔がちょっとおかしくなっている。

この段落を選択してリスト1を実行すると、

f:id:akashi_keirin:20171023212238j:plain

ほれ、この通り。タブ幅を最大文字数プラス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によってタブリーダの種類を指定する。

ちなみに、タブリーダの種類を表す定数は、

f:id:akashi_keirin:20171023212249j:plain

こんな感じです。

上掲のコードでは、

  • 45 字の位置に
  • 右揃えタブ
  • タブリーダは中点

というふうになっている。

実行結果

f:id:akashi_keirin:20171023212610j:plain

こんなふうにタブを挿入した段落を選択し、マクロを実行。

f:id:akashi_keirin:20171023212332j:plain

こんなふうにタブ位置が設定されている。

f:id:akashi_keirin:20171023212627j:plain

f:id:akashi_keirin:20171023212640j:plain

バッチリ設定されている。

これ、一つ一つ設定するのってめんどくさいんですよねー。

タブ位置をラクラク設定できるようなアドインでも作ってみるかなー。

ちょっと疑問

ココで、

TabStopsコレクションの要素数を調べてみると、イミディエイトに「7」と表示された

と書いたんだけれど、

なんで7なんだ????????

5つしかTabStopなんて設定していないはずなのに……。

@akashi_keirin on Twitter