テーブルにレコードを追加するときの注意点 ① 失敗談から抜粋

Excelのテーブル機能が、とても便利だ。抽象的な表現ではあるが、この機能は空気を読んで、色々と良い感じに編集してくれる。だが、時にはそれが仇となる場合もある。
f:id:Infoment:20190406215519p:plain
例えば、こんな表があるとする。
f:id:Infoment:20190406215551p:plain

この表は既に、テーブルとして書式設定されている。
この表に、マクロで一行レコードを追加したい。こんな感じで。
f:id:Infoment:20190406215659p:plain

ちなみに手入力の場合、空気を読んで、テーブルは自らを拡張してくれる。
何て素敵な機能なんだ。
f:id:Infoment:20190406215950g:plain

そこで手入力と同じ感覚で、「テーブルのすぐ下の行」に情報を入力してみる。

Sub TableTest()
    Cells(Rows.Count, 1).End(xlUp).Offset(1) = "ばなな"
    Cells(Rows.Count, 2).End(xlUp).Offset(1) = "300"
    Cells(Rows.Count, 3).End(xlUp).Offset(1) = "フィリピン"
End Sub

結果は、↓ こうなる。
f:id:Infoment:20190406220156p:plain

このように一行になるべきところ、階段状にデータがセットされてしまうのは、以下の理由による。

「ばなな」がセットされた時点でテーブルが下に一行分広がってしまい、その結果「テーブルのすぐ下の行」が一つずれてしまったため

上記のマクロをステップ実行してみると、それが良く判る。
f:id:Infoment:20190406220725g:plain


従って、もしこの方法でテーブルにレコードを追加したいならば、次のように行う必要がある。

Sub TableTest()
    Cells(Rows.Count, 1).End(xlUp).Offset(1) = "ばなな"
    ' 2列目以降はオフセットしない。
    Cells(Rows.Count, 2).End(xlUp) = "300"
    Cells(Rows.Count, 3).End(xlUp) = "フィリピン"
End Sub


若しくは、配列に入れて一気に張り付けても良い。

Sub TableTest()
    Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 3) = Array("ばなな", 300, "フィリピン")
End Sub


ところでテーブルには、「集計行」なるものがある。
f:id:Infoment:20190406221717p:plain

これがある場合、上記の方法では上手くいかない。
その場合の方法については、明日に続きます。

参考まで。