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

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

関連記事

  1. Excel

    Faviconをダウンロードするマクロ

    WebサイトからFaviconを抜き出すAPIがあったので早速使ってみ…

  2. Excel

    インストールされているアプリケーション一覧を取得するVBAマクロ

    端末にインストールされているアプリケーション名を調べる必要があったので…

  3. Excel

    名前付きセル(範囲)にコメントを付けるVBAマクロ

    Excelでマニュアルを作成する際、名前付きセル範囲を明記する必要があ…

  4. Excel

    Evernote Cloud SDKを使って特定の文字列が含まれるノートを検索するVBAマクロ

    前回の記事で、VBAからEvernote Cloud SDKを使ってノ…

  5. Office関連

    ちゃうちゃう! 2.0を操作するWordマクロ

    「テキスト比較ソフト「ちゃうちゃう!」がバージョンアップされました。」…

コメント

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP