Wordドキュメントの表の行を削除する

Wordの表の行を削除する

Wordドキュメント内の表の任意の行を削除する

差込印刷機能を使って似たような書類のWordファイルを自動的に作成するマクロをよく使う。

akashi-keirin.hatenablog.com

Excelで表さえ作ってしまえば、人力でポチポチやるよりも圧倒的に正確かつ高速なので重宝している。

ただ、表を伴うようなもの、しかも表の行数がそれぞれ異なるようなものを作成する羽目になった。

そうしょっちゅう使うこともないと思うので、覚書代わりにアップしとく。

表の行を削除するマクロ

f:id:akashi_keirin:20170625165157j:plain

Wordドキュメントにこんな表があったとする。

何行目かが分かりやすいように表の先頭行以外の左端の列には行番号を入れといた。

リスト1 表の5行目を削除するマクロ
Public Sub tableTest()
  Dim tbl As Table    '……(1)'
  Set tbl = ThisDocument.Tables(1)
  tbl.Rows(5).Delete    '……(2)'
End Sub

(1)からの2行、

Dim tbl As Table
Set tbl = ThisDocument.Tables(1)

では、Table型の変数tblを準備して、ThisDocument上の1つ目の表を格納している。

で、(2)の

tbl.Rows(5).Delete

ではtblに格納したTableオブジェクトのRowsコレクションのうち、5番目のRowオブジェクトに対してDeleteメソッドを使用。

すると、

f:id:akashi_keirin:20170625165205j:plain

こうなる。簡単!

任意の行を削除するFunction

作ってみた。

スト2 表の任意の行を削除するFunction
Private Function deleteRowFromTable(ByVal objTable As Table, _
                                    ByVal rowNum As Integer) As Table    '……(1)'
On Error GoTo errorCatch    '……(2)'
  objTable.Rows(rowNum).Delete
  Set deleteRowFromTable = objTable    '……(3)'
  Exit Function
errorCatch:    '……(*)'
  Set deleteRowFromTable = objTable
End Function

(1)は、

Private Function deleteRowFromTable(ByVal objTable As Table, _
                                    ByVal rowNum As Integer) As Table

の形で引数と返り値を設定。

第1引数がTableオブジェクト、第2引数は削除したい行番号。

で、返り値をTableオブジェクトにした。

行削除後のTableオブジェクトを返すようにしたら便利じゃないかと思っただけw

(2)の

On Error GoTo errorCatch

はエラー対策。今のところ

  • 存在しない行番号を引数として与えた

ぐらいしかエラーの原因は思いつかないけれど、メンドウなのでこの形を使った。

エラーが発生すると、(*)の

errorCatch:
  Set deleteRowFromTable = objTable

に飛んで、処理する。返り値には何もせずに元の表を返す。

(3)の

Set deleteRowFromTable = objTable

で処理済みの表を返す。

実行結果

リスト2のFunctionを、次のコードで使ってみる。

リスト3 実行用コード
Public Sub tableTest()
  Dim tbl As Table
  Set tbl = ThisDocument.Tables(1)
  Debug.Print "使用前:" & tbl.Rows.Count    '……(1)'
  Set tbl = deleteRowFromTable(tbl, 5)
  Debug.Print "使用後:" & tbl.Rows.Count    '……(2)'
End Sub

(1)で実行前の表の行数をイミディエイト・ウインドウに表示し、(2)で実行後の表の行数を表示するようにした。

f:id:akashi_keirin:20170625165219j:plain

ほれ、この通り、指定した行を削除した上で、処理後の表を獲得することができている。

終わりに

WordのVBAは、あまり使う機会がないので、たまに使ったときにちゃんと記録を残しておかないとなあ。

@akashi_keirin on Twitter