Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:テーブルに列追加
#VBA100本ノック 45本目
シートにB2から始まる5列(列1,列2,列3,列4,列5)のテーブルあります。
・列3の後ろに列挿入して列1から列3の合計列を作成、見出しは"合計列1"
・テーブルの右端に列4から列5の合計列を作成、見出しは"合計列2
出来上がりは画像を参照してください。
※シートは任意

◇ 出題ページはこちら
ソースコード
Option Explicit ' 100本ノック045:テーブルに列追加 Sub テーブルに合計列を挿入する() Dim TBテーブル1 As ListObject Set TBテーブル1 = WSデータ.ListObjects(1) With TBテーブル1.ListColumns.Add(TBテーブル1.ListColumns("列3").Index + 1) .Name = "合計列1" .DataBodyRange.Formula = "=SUM([@[列1]:[列3]])" End With With TBテーブル1.ListColumns.Add .Name = "合計列2" .DataBodyRange.Formula = "=SUM([@[列4]:[列5]])" End With End Sub
解説
テーブル(ListObject)を扱う問題です。
テーブル内のセルをVBAで扱う際、
- ListRow/ListColumnなどテーブル特有のオブジェクトを操作。
- 普段通りのWorksheet.Cellsで操作。列はEnumで定義。
この2つのやり方があり、どちらも一長一短があります。
簡単な使い分けを書くと、
- 挿入削除などレイアウト変更が伴う処理では、見出し名を使って列番号の変更を無視できる1が便利
- 数式(Formula)の入力を行う処理では、どのみち見出し名を構造化参照数式で使うため1に統一した方が見やすい
- For文などで各セルの読み取りを細かく行う処理では、コード量が少なくEnumのインテリが使える2が便利
このようなイメージで使い分けるとよいと思います。
本問は挿入して数式を入力(上2に該当)する処理ですので、
ListObjectのプロパティ/メソッドを活用した方が楽で見やすいですね。
ListObjectをつかむことで列の挿入がListColumns.Addでできるようになり、
一般的なオブジェクトのAddメソッドと同様、追加列を返り値として取得できます。
Withステートメントを使用しないバージョンも置いておきますので、
オブジェクト構造の参考にしてみてください。
Sub テーブルに合計列を挿入する_変数Set版() Dim TBテーブル1 As ListObject Set TBテーブル1 = WSデータ.ListObjects(1) Dim ListC_挿入列 As ListColumn Set ListC_挿入列 = TBテーブル1.ListColumns.Add(TBテーブル1.ListColumns("列3").Index + 1) ListC_挿入列.Name = "合計列1" ListC_挿入列.DataBodyRange.Formula = "=SUM([@[列1]:[列3]])" Set ListC_挿入列 = TBテーブル1.ListColumns.Add ListC_挿入列.Name = "合計列2" ListC_挿入列.DataBodyRange.Formula = "=SUM([@[列4]:[列5]])" End Sub