「ソースコードを番号行付きのテーブルに変換するWordマクロ」を実行したとき、「GetCellLines」Functionが呼び出されます。
このFunctionプロシージャによってセルの行数を取得しているのですが、今回は私がセルの行数を取得するために試行錯誤した結果をまとめてみます。
まず、行数を求める方法としてすぐに思い浮かぶのは”対象セルで何回改行されているのか?“を調べる方法で、これが分かればすぐに行数が取得できます。
コードとしては下記の通り。
Public Sub Sample() Dim s As String s = ActiveDocument.Tables(1).Cell(1, 2).Range.Text Debug.Print UBound(Split(s, vbCr)) End Sub
対象の文字列を”改行“で区切って、それにより返される配列の要素数を調べるだけの単純なマクロです。
このマクロを下図のようなテーブルを対象に実行すると、Debug.Printで”4“が出力されます。
一見問題が無いように見えますが、このマクロを下図のようなテーブルを対象に実行すると、上図の場合と同じく”4“が出力されます。
結果を見れば分かる通り、”改行の個数“で判断しているために文字列の折り返しには対応していないわけです。
次に考えたのが、セルの最初の行番号と最後の行番号の差から取得する方法です。
コードとしては下記の通り。
Public Sub Sample2() Dim fln As Long, lln As Long ActiveDocument.Tables(1).Cell(1, 2).Select Selection.StartOf wdCell, wdMove fln = Selection.Information(wdFirstCharacterLineNumber) Selection.EndOf wdCell, wdMove lln = Selection.Information(wdFirstCharacterLineNumber) Debug.Print lln - fln + 1 End Sub
StartOfメソッドによってセルの最初にカーソルを移動して行番号を取得、EndOfメソッドによってセルの最後にカーソルを移動して行番号を取得、こうすることで最初の行番号と最後の行番号が取得できるので、あとは差を計算するだけです。
上図テーブルに対して改めてマクロを実行すると、今度はちゃんと”5“が出力され、文字列の折り返しにも対応しているように見えます。
ですが、このマクロを何回か試していると、セル内の行数が多い場合は何故か”0″が返ってきたり、セルが複数ページにまたがる場合は正確な行数が取得できなかったりと、意図する結果にはならない場合が多々あることに気が付きました。
そこで最終的に私が取った方法が下記ような方法です。
Private Function GetCellLines(ByVal tbl As Word.Table) As Long 'セルの行数カウント Dim ln As Long ln = 0 '初期化 tbl.Columns(2).Cells(1).Range.Select Selection.StartOf wdCell, wdMove Do While Selection.Information(wdWithInTable) ln = ln + 1 Selection.MoveDown wdLine, 1, wdMove Loop GetCellLines = ln End Function
セルの最初の行にカーソルを移動し、”カーソルがテーブルを抜けるまで1行下にカーソルを移動させる“処理を実行し、何回カーソルが下に移動したのかをカウントするという、何とも泥臭いものになってしまいました。
気持ち的に何かすっきりしないものはありますが、一応はこれで事が足ります。
今後、もっと効率の良い処理を思いついたときは、そちらの方にコードを書き換えたいと思います。
この記事へのコメントはありません。