テーブル機能の備忘録 ③ 行の追加
先日から、マクロによるテーブル機能の扱いを纏めている(備忘録)。
infoment.hatenablog.com
今日も、昨日のListRowの続きから。
テーブルに一行足したい時、どうすれば良いか。
一番簡単なのは、テーブル範囲の直下に、追加したい文字を入力すること。
あとはExcelが空気を読んで、自動で良い感じにテーブル範囲を拡張してくれる。
しかし、このように集計行が表示されている場合、この方法は使えない。
そんな時は、ListRowsコレクションのAddメソッドが有効だ。
Sub Test() Dim Tb As Excel.ListObject Set Tb = ActiveSheet.ListObjects(1) ' 一行追加。 Tb.ListRows.Add End Sub
↓このように、集計行が表示された状態でも、問題なく一行追加してくれる。
さらに、Addの後ろにスペースを入れると、このように表示される。
[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
どれを用いるかは、時と場合とお好みで。
明日に続きます。
参考まで。