「あぁ、またデータの行が増えてる……。VBAの範囲指定を『A1:G50』から『A1:G60』に書き直さなきゃ。あ!ついでに書式も崩れた……もう嫌だ!」
職場で、こんな風に感じたことはありませんか?
実は私も昔、範囲指定をすべて「セル番地(A1など)」で記述していた時期がありました。当時は、列が一つ増えるだけでコードが動かなくなり、その都度修正に追われていたものです。
そんな課題を根本から解決してくれたのが、今回ご紹介する「テーブル(ListObject)」の操作法になります。
なぜ「テーブル」を使うと仕事が劇的に速くなるの?
Excelの「テーブル機能」は、VBA(マクロ)の世界では「ListObject(リストオブジェクト)」と呼ばれます。
これを使う最大のメリットは、「データの増減に合わせて、範囲が勝手に伸び縮みしてくれる」こと。 通常のセル指定だと、データが増えるたびにコードを修正する必要がありますが、テーブルならその必要がありません。
これにより、メンテナンス時間は従来の約80%削減できると言っても過言ではありません。
最終行にデータを自動追加するスマートなコード
まずは、データの最下行に新しい行を追加する方法になります。
これさえマスターすれば、手動やコードで「最終行」を探す手間がなくなります。
Sub AddNewRowToTable()
' 変数の宣言(箱の準備)
Dim myTable As ListObject
Dim newRow As ListRow
' 「テーブル1」という名前のテーブルをセット
Set myTable = ActiveSheet.ListObjects("テーブル1")
' 最後に新しい行を追加
Set newRow = myTable.ListRows.Add
' 追加した行の各列にデータを入力
' 1列目、2列目…という指定の仕方です
With newRow
.Range(1).Value = "2026/03/20" ' 日付
.Range(2).Value = "事務用品" ' カテゴリ
.Range(3).Value = 1500 ' 金額
End With
MsgBox "新しい行を追加しました!"
End Sub
特定の列データを「見出し名」でピンポイントに取得する
「左から3列目のデータを取得する」のではなく、「『金額』列のデータを取得する」と名前で直接指定できるのがテーブルの大きな強みになります。
これなら、将来的に途中の列が増減しても、プログラムが壊れる心配はありません。
Sub GetDataByHeaderName()
Dim myTable As ListObject
Dim targetColumn As ListColumn
Set myTable = ActiveSheet.ListObjects("テーブル1")
' 「金額」という見出しの列を指定
Set targetColumn = myTable.ListColumns("金額")
' その列の2行目(見出しを除いた実データの2番目)の値を取得
Dim price As Long
price = targetColumn.DataBodyRange(2).Value
MsgBox "2行目の金額は " & price & " 円です。"
End Sub
まとめ:テーブルはExcelの応用でも便利!
テーブル(ListObject)を導入すると、コードの可読性が高まるだけでなく、何より「仕様変更に強い」ツールに仕上がります。プログラムが安定すれば、予期せぬエラー対応に追われることなく、本来の業務に集中できるようになります。
最初は「ListObjectという名前が長くて扱いづらそう」と感じるかもしれませんが、一度基本の構文パターンを覚えてしまえば、これほど便利な機能はありません。
ちなみに、Power Automate(パワーオートメート)を活用したExcelの自動化においても、テーブル化されていることが前提条件となるケースが多いため、今から覚えておいて損はありません。
ぜひ、今日からExcelツールにテーブル機能を取り入れてみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。


コメント