Office関連

セルの行数をカウントするWordマクロ

ソースコードを番号行付きのテーブルに変換する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行下にカーソルを移動させる“処理を実行し、何回カーソルが下に移動したのかをカウントするという、何とも泥臭いものになってしまいました。

気持ち的に何かすっきりしないものはありますが、一応はこれで事が足ります。
今後、もっと効率の良い処理を思いついたときは、そちらの方にコードを書き換えたいと思います。

ソースコードを番号行付きのテーブルに変換するWordマクロ前のページ

選択範囲内で文字列検索を行うWordマクロ次のページ

関連記事

  1. Office関連

    Excel 2013版URLエンコードマクロ

    ※ この情報はOffice 2013 カスタマー プレビュー版を元にし…

  2. Office関連

    Office 2013のコントロールIDリストが更新されました。

    「コントロールID 一覧(Office 2013)」でも紹介しているO…

  3. Office関連

    SkyDriveの同期フォルダーのパスを取得するマクロ

    前回の記事ではSkyDriveの同期フォルダーのパスを取得するWord…

  4. Office関連

    テキストボックスの中にある表を操作するWordマクロ

    Yahoo!知恵袋で、「Wordマクロでテキストボックスの中にある表の…

  5. Excel

    Outlookの予定本文の一部を文字装飾するVBAマクロ

    Outlookの予定本文の一部をマクロで太字にしたい」との質問がありま…

コメント

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

Translate

最近の記事

アーカイブ

PAGE TOP