表の位置を右にずらす(Word)
表の横位置を変更する
ドキュメント内の表の横位置を変える方法が判明したので、メモ代わりに記しておく。
RowsオブジェクトのLeftIndentプロパティを使う
表の位置なので、Table
オブジェクトのプロパティを触ればよいと思っていたが、違った。
左端にある表を右にずらすには、Table.Rows
オブジェクトのLeftIndent
プロパティに値を設定する。
たとえば、
この表を右側に10.5ポイントで4文字分右にずらそうと思ったら、イミディエイト・ウインドウに
ThisDocument.Tables(1).Rows.LeftIndent = 10.5 * 4
と打ち込んで[Enter]を押せば良い。
こうなる。
「表のプロパティ」を見てみると、
このとおり。mm単位なので分かりにくいけれど、10.5ポイントの全角文字の幅が3.7mmなので、ちょうど4文字分だということがわかるだろう。
表の幅を設定してから表全体を右にずらすマクロ
前回
のコードにコードを追加して、表全体の幅を設定してから表全体を右に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文字分右にずらす処理を加えただけ。
こいつを実行すると、
なぜかこうなる。
前回はなぜか後回しにされてしまっていた表全体の幅を変更する処理が、今度は完全に無視されてしまった。
実は、
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
が、表全体の幅を変更するメソッド。見たらわかると思うけど。
こいつを、(**)のところで使用している。
これならばどうか。
意図どおりに動いている。
おわりに
やっぱりちょっとわけがわかりません。
追記
ちなみに、このやり方で表を挿入した場合、表の外にカーソルがないので、表の外側に一切文字を入力することができなくなるような気がします。
何か、打開策はあるのでしょうか???
さらに追記
すんません。カーソルがなくなったのではなく、何らかの手違いで段落のインデント幅がえげつない数値になっており、画面の外に追い出されていただけのようでした。
お騒がせしました。
落ち着いて「段落」タブを開けるか、イミディエイト・ウインドウでParagraphs
コレクションのCount
プロパティを調べるべきだと思いました。