表の位置を右にずらす(Word)

表の横位置を変更する

ドキュメント内の表の横位置を変える方法が判明したので、メモ代わりに記しておく。

RowsオブジェクトのLeftIndentプロパティを使う

表の位置なので、Tableオブジェクトのプロパティを触ればよいと思っていたが、違った。

左端にある表を右にずらすには、Table.RowsオブジェクトのLeftIndentプロパティに値を設定する。

たとえば、

f:id:akashi_keirin:20190427142008j:plain

この表を右側に10.5ポイントで4文字分右にずらそうと思ったら、イミディエイト・ウインドウに

ThisDocument.Tables(1).Rows.LeftIndent = 10.5 * 4

と打ち込んで[Enter]を押せば良い。

f:id:akashi_keirin:20190427142010j:plain

こうなる。

「表のプロパティ」を見てみると、

f:id:akashi_keirin:20190427142013j:plain

このとおり。mm単位なので分かりにくいけれど、10.5ポイントの全角文字の幅が3.7mmなので、ちょうど4文字分だということがわかるだろう。

表の幅を設定してから表全体を右にずらすマクロ

前回

akashi-keirin.hatenablog.com

のコードにコードを追加して、表全体の幅を設定してから表全体を右に4文字分ずらすことを試みる。

リスト1 標準モジュール
Public Sub test02()
  Dim Doc As Document
  Set Doc = ThisDocument
  Call deleteTables(Doc)
  Dim targetTable As Table
  With Doc
    Set targetTable = .Tables.Add(Selection.Range, 5, 5)
  End With
  Dim r As Long
  Dim c As Long
  Dim n As Long
  n = 1
  Dim targetCell As Cell
  With targetTable
    .PreferredWidthType = wdPreferredWidthPoints
    .PreferredWidth = 240
    Call Application.ScreenRefresh
    For r = 1 To .Rows.Count
      For c = 1 To .Columns.Count
        .Cell(r, c).Range.Text = n
        n = n + 1
        Call WindowsAPI.waitFor(200)
      Next
    Next
  End With
  Call WindowsAPI.waitFor(200)    '……(*)'
  targetTable.Rows.LeftIndent = 10.5 * 4
End Sub

Private Sub deleteTables(ByVal targetDocument As Document)
  Dim tablesCount As Long
  tablesCount = targetDocument.Tables.Count
  If tablesCount = 0 Then Exit Sub
  Dim i As Long
  For i = tablesCount To 1 Step -1
    Call targetDocument.Tables(i).Delete
  Next
End Sub

前回のリスト3から変えたのは(*)からの2行だけ。

200ミリ秒待機した後、4文字分右にずらす処理を加えただけ。

こいつを実行すると、

f:id:akashi_keirin:20190427142017g:plain

なぜかこうなる。

前回はなぜか後回しにされてしまっていた表全体の幅を変更する処理が、今度は完全に無視されてしまった。

実は、

targetTable.Rows.LeftIndent = 10.5 * 4

ブレークポイントを設定して、ステップ実行してやると、普通に処理が行われる。

ノンストップで実行すると(それが普通の実行方法なんだけど)、ものの見事に無視されるのだ。

なぜ、なぜなんだ~~~?!

メソッドとして切り出してみる

表全体の幅を変更する処理の部分をメソッドとして切り出したらどうなるのか、やってみた。

スト2 標準モジュール
Public Sub test02()
  Dim Doc As Document
  Set Doc = ThisDocument
  Call deleteTables(Doc)
  Dim targetTable As Table
  With Doc
    Set targetTable = .Tables.Add(Selection.Range, 5, 5)
  End With
  Dim r As Long
  Dim c As Long
  Dim n As Long
  n = 1
  Dim targetCell As Cell
  With targetTable
    .PreferredWidthType = wdPreferredWidthPoints
    .PreferredWidth = 240
    Call Application.ScreenRefresh
    For r = 1 To .Rows.Count
      For c = 1 To .Columns.Count
        .Cell(r, c).Range.Text = n
        n = n + 1
        Call WindowsAPI.waitFor(200)
      Next
    Next
  End With
  Call WindowsAPI.waitFor(200)
  targetTable.Rows.LeftIndent = 10.5 * 4
  Call resizeTable(targetTable, 240)    '……(**)'
End Sub

Private Sub deleteTables(ByVal targetDocument As Document)
  Dim tablesCount As Long
  tablesCount = targetDocument.Tables.Count
  If tablesCount = 0 Then Exit Sub
  Dim i As Long
  For i = tablesCount To 1 Step -1
    Call targetDocument.Tables(i).Delete
  Next
End Sub

Private Sub resizeTable(ByVal targetTable As Table, _
                        ByVal targetSize As Double)
  With targetTable
    .PreferredWidthType = wdPreferredWidthPoints
    .PreferredWidth = targetSize
  End With
End Sub

三つ目のresizeTableが、表全体の幅を変更するメソッド。見たらわかると思うけど。

こいつを、(**)のところで使用している。

これならばどうか。

f:id:akashi_keirin:20190427142023g:plain

意図どおりに動いている。

おわりに

やっぱりちょっとわけがわかりません。

追記

ちなみに、このやり方で表を挿入した場合、表の外にカーソルがないので、表の外側に一切文字を入力することができなくなるような気がします。

何か、打開策はあるのでしょうか???

さらに追記

すんません。カーソルがなくなったのではなく、何らかの手違いで段落のインデント幅がえげつない数値になっており、画面の外に追い出されていただけのようでした。

お騒がせしました。

落ち着いて「段落」タブを開けるか、イミディエイト・ウインドウでParagraphsコレクションのCountプロパティを調べるべきだと思いました。