テーブル機能の備忘録 ③ 行の追加

先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日も、昨日のListRowの続きから。
f:id:Infoment:20200226223342j:plain
f:id:Infoment:20200226223450j:plain

テーブルに一行足したい時、どうすれば良いか。
一番簡単なのは、テーブル範囲の直下に、追加したい文字を入力すること。
f:id:Infoment:20200226223911g:plain

あとはExcelが空気を読んで、自動で良い感じにテーブル範囲を拡張してくれる。

しかし、このように集計行が表示されている場合、この方法は使えない。
f:id:Infoment:20200226224059p:plain

そんな時は、ListRowsコレクションのAddメソッドが有効だ。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        ' 一行追加。
        Tb.ListRows.Add
End Sub

↓このように、集計行が表示された状態でも、問題なく一行追加してくれる。
f:id:Infoment:20200226224401p:plain

さらに、Addの後ろにスペースを入れると、このように表示される。
f:id:Infoment:20200226224605p:plain

[Position]は文字通りポジションで、行を追加する位置を指定できる。
指定しない場合、最下行に追加される。
[Alwaysinsert]は、今回私も初めて知った。TrueまたはFalseを指定する。
Trueの場合、テーブル直下セルに文字があるならば、全体を一行下にシフトする。
Falseの場合、テーブル直下が空白なら上書きし、そうでないならTrueの時と同じ。

また、As ListRowとあるので、ListRowオブジェクトを戻り値として取得できる。
例えば下記サンプルでは、5行目に行挿入したうえで、当該ListRowオブジェクトを変数にセットしている。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        ' 一行追加。
    Dim ListRow As Excel.ListRow
    Set ListRow = Tb.ListRows.Add(5)
End Sub

ここで、「名前」の列に「桃太郎」と入力したい場合、どのように指定すればよいだろう。名前が2列目であることから、

        ListRow.Range.Cells(2) = "桃太郎"

としても良いが、レイアウト変更で名前が2列目以外に移動してしまうと、間違いのもとになる。そんな時は名前が何列目であるか、以下で取得すると良い。

        Tb.ListColumns("名前").Index

最終的には、↓ のような記述となる。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        ' 一行追加。
    Dim ListRow As Excel.ListRow
    Set ListRow = Tb.ListRows.Add(5)
        ListRow.Range.Cells(Tb.ListColumns("名前").Index) = "桃太郎"
End Sub

なお、ListRowオブジェクトをセットする変数を設けるのが面倒な場合は、
Withステートメントを使っても良い。

Sub Test()
    Dim Tb As Excel.ListObject
    Set Tb = ActiveSheet.ListObjects(1)
        ' 一行追加。
    With Tb.ListRows.Add(5)
        .Range.Cells(Tb.ListColumns("名前").Index) = "桃太郎"
    End With
End Sub

どれを用いるかは、時と場合とお好みで。

明日に続きます。

参考まで。