普段、私はテーブルを好んで使用しています。テーブルを使う理由、テーブルを使わない理由について、個人的に思いつく限りのことを書いてみました。
個人的な解釈に基づいた表現をしており、見方によっては評価が逆転することもある点にご注意ください。
- テーブル化するメリット
- 良い感じに着色とオートフィルタが設定される(好みによる)
- ウィンドウ枠の固定が不要(好みによる)
- スライサーが設定できる
- 範囲選択が簡単になる(マウス:矢印選択、キーボード:Ctrl+Space / Shift+Space / Ctrl+Shift+Space / Ctrl+A)
- セル結合が絶対に使われていない表にできる
- 列の数式が自動入力される
- データを追加したときに領域が自動拡張される。
- 集計行が増やせる
- 数式を組むときに構造化参照が使用できる=数式が読みやすくなる
- ヘッダの重複を禁止し具体的な名付けを強制できる
- VBAからListObjectでアクセスできる
- ピボットテーブル / パワークエリの内部データソースとして使える
- 外部データソースのインポートで必要(SharePoint、Access、CSV、その他)
- SharePoint リストへエクスポートできる
- 残念なところ(使用上の注意とも言う)
- テーブル知らない人は操作性の変化に戸惑う
- 列の数式を壊す人が現れる(列の保護が貧弱・・・)
- 値が無い行を削除せずそのままにする人が現れる
- インプットデータには適しているが、アウトプットには適していない
- 中間データでは使いづらい場合がある(列のMATCHと構造化参照の反発)
- DBのように行へユニークIDを付与できない → なぜなのか・・・
- Excel Onlineでの操作性がデスクトップアプリと違って、イマイチ使いづらい
- GoogleSpreadsheetには構造化参照が無い
- コピーするとテーブルの書式が付いてきてしまう
- 列の入れ替えをすると、そこから右の列の幅がズレる
- テーブルの列の挿入をすると、そこから右の列の幅がズレる
- テーブルを横に2つ並べて置くと、シートの行の挿入などができなくなる
- テーブルを横に2つ並べて置くと、片方で絞り込みをしたとき、もう片方の行も非表示になってしまう
- テーブルを横に2つ並べて置くと、左のテーブルの列の入れ替えをしたとき、右の列のデータがずれるというあってはならない挙動をする
- テーブルの行が切り取り挿入貼り付けで入れ替えられなくなる(シートの行として入れ替えることはできる)
- 構造化参照をA1参照に、A1参照を構造化参照に変える正当な方法が用意されていない
- テーブルを含むと2つ以上のシートが同時にコピーできない
- テーブルにも名前を付けないと数式が読みづらくなるのだが、(シート名と違って)運用上は必要ないため名付けが重視されない。
- ヘッダを空欄にできない。重複も出来ないので、スペースで埋めて誤魔化す
- 集計行をヘッダの上にできないため、集計結果を常時見ることができない
- ヘッダが階層化されている表に使用しづらい(列名が冗長になりがち)
- 列名に改行Alt+Enterがあると構造化参照にも影響して式が読みづらくなる
- 並び順に依存する積み上げ型の集計(累計を求める式)と相性が悪い
- ヘッダ部に数式が使用できない
- 誤って列全体/行全体に貼り付けしてテーブルが拡張されるときExcelがフリーズして死ぬ
- その他のTips
- まとめ
- 個人的な意見
- 後日談
テーブル化するメリット
良い感じに着色とオートフィルタが設定される(好みによる)
ご存じの通り、セルの書式設定とは別次元で、行が交互に着色されデータ範囲が明確になります。
加えて、オートフィルタが自動で設定されます。※後で消してもOK
ウィンドウ枠の固定が不要(好みによる)
テーブル内にカーソルがある状態で、ヘッダ部分が見えないところまでスクロールすると、自動的に列番号(A,B,C,D)が、テーブルの列名に変化します。
そのため、ヘッダより上に常駐させたいデータの無いシートなら、ウィンドウ枠の固定が不要です。
スライサーが設定できる
ワンクリックで絞り込みが実行できるユーザーインターフェース(スライサー)を設置することができます。
スライサーを使いこなすと、簡単な台帳ならVBAを使わずに短時間でグラフィカルなツールが開発できるようになります。
詳しくは、次のツイートのツリーをご覧下さい。
Excelのテーブルとスライサーを使えば、VBAなんて使わなくても台帳検索ツールくらいは作れるという事実は知っておいた方が良いと思う。
— ちゅん🐣VBAer (@KotorinChunChun) 2021年12月17日
コツは、欲しい検索方法を満たす「検索結果」の列をテーブルに追加すること。 pic.twitter.com/cHyv2GCGou
※スライサーはExcel2010でピボットテーブル専用で搭載され、Excel2013から普通のテーブルにも使用可能となりました。
範囲選択が簡単になる(マウス:矢印選択、キーボード:Ctrl+Space / Shift+Space / Ctrl+Shift+Space / Ctrl+A)
マウス操作の場合は、テーブルの端っこにカーソルを持って行ったとき、行選択や列選択をするための領域が増えます。
キーボード操作の場合は、範囲選択を行うショートカットキーの操作が、テーブル内の選択→シート全体の選択という二段階に変化します。
- 行選択:
Shift+Space
※IME半角時。又はIMEのオプション変更 - 列選択:
Ctrl+Space
- すべて選択:
Ctrl+A
- すべて選択:
Ctrl+Shift+Space
※数式組み立て中の「参照モード」に対応
Range.CurrentRegion って、てっきりCtrl+Aと同じ動きをするものだとばかり思っていたのだけど、そうとは限らないらしい。
— ちゅん🐣VBAer (@KotorinChunChun) 2020年6月15日
図のようにCurrentRegionは、テーブルのことを考慮してくれない。#Excel #VBA #ExcelVBA pic.twitter.com/6V8kn9rvXW
セル結合が絶対に使われていない表にできる
テーブル定義された範囲には、セル結合を行うことができません。
セル結合されている範囲をテーブルへ変換すると、セル結合が解除されます。
解除されたセルは左上以外は空欄となるため、全てのセルに直接「値」を欠かざるを得なくなります。
結果として、関数やVBAで処理する際に、データが埋まっていることを信頼できるようになり、ロジックが簡単になります。
もちろん「々」や「〃」を使われる可能性は否定できませんが、少なくともセル結合が出来なくなります。オートフィルタが設定されることで、ユーザー並び替えや絞り込みを使うために、自然と「本来の値」を入力するように学習されることが期待できます。
ユーザーが「(セル結合された)見やすい表がいい」より「(セル結合されていない)使いやすい表がいい」という心境へ変化させるのが狙いです。
列の数式が自動入力される
新しい数式を組んだとき、全ての行に数式が自動でフィルされます。
数式を変更したとき、全ての行に数式を反映させる案内が表示されます。
データを追加したときに領域が自動拡張される。
テーブルの末尾にデータを入力したとき、勝手にテーブル範囲が拡大されます。
テーブル右下端でTABキーを押したとき、勝手に新規レコードが増加します。
このとき、書式設定や入力規則も拡大され、列の数式は自動入力されます。
集計行が増やせる
表の末尾に集計行を増やすことができます。
プルダウン選択で目的の集計方法を選べば、適切な数式が自動入力されます。
レコードが増加したら、集計範囲が自動で拡張されます。
なお、合計なら Ctrl+Shift+=
で、ワンタッチで増やせます。
集計行のON/OFFは Ctrl+Shift+T
です。
数式を組むときに構造化参照が使用できる=数式が読みやすくなる
テーブル内のセルを参照しようとすると、勝手に構造化参照という形式になります。
たとえば、同じ行のデータを使用するときは [@列名]
、他のテーブルのデータ範囲を参照するときは、 テーブル名
となります。
一般的なA1参照形式 $A1
や Sheet1!$A2:$B6
のような、ぱっと見で分からないセル座標から意味を読み解く必要がなくなります。
ヘッダの重複を禁止し具体的な名付けを強制できる
テーブルのヘッダ(表の横方向の項目名)には、同じ名前が使えません。
テーブル化する時に重複した項目名には、末尾に2,3,4と数字が付与されます。
このままではいけないので、必然的に一意な名前をつけさせることができます。
これにより、MATCH関数で狙った列を確実にヒットさせることができます。
従って、VLOOKUPやINDEX-MATCHの数式で、任意の行の任意の列を抽出するような数式を組むときに重宝します。
VBAからListObjectでアクセスできる
VBAから表を読み書きする場合に、テーブル(ListObject)を通したRangeアクセスが可能となります。
例えば、 Worksheets("Sheet1").Range("A2:X100")
のような式は、 ListObjects("TBL名簿").DataBodyRange
と書くことが出来ます。
実務においては「最終行を求める式」や、「データの開始行を表すマジックナンバーの記載」が不要となり、断然コードが簡単になります。
Rangeは相対アクセスとなるため、普段からシート範囲をRangeに入れてから操作することに慣れていないと、このメリットは理解しづらいかもしれません。
CurrentRegionやUsedRangeは検出するデータ範囲に信頼性がありませんが、ListObjectのDataBodyRangeで取得されるのは必ずデータ範囲のみです。
最近TLでCurrentRegionを見かけるので、私の意見を述べておくと、CurrentRegionは基本的に使わない。
— ちゅん🐣VBAer (@KotorinChunChun) 2021年5月5日
優先順に
1. ListObject.DataBodyRange(テーブル定義)
2. AutoFilter.Range (オートフィルタ定義)
3. UsedRange(使用済み全セル範囲)からのハードコーディングで範囲変更
となる
ListObject.ListColumns("列名").DataBodyRange
を使って、列名を使ったデータアクセスができます。
Sub Test_国語の列を選択する() Dim lo As ListObject Set lo = ActiveSheet.ListObjects(1) lo.ListColumns("国語").DataBodyRange.Select End Sub
ListObject.HeaderRowRange.
を使って、列名の一覧を知ることができます。
Sub Test_ヘッダの一覧を出力する() Dim lo As ListObject Set lo = ActiveSheet.ListObjects(1) Dim rng As Range For Each rng In lo.HeaderRowRange Debug.Print rng.Value Next End Sub
このほか多数の使い道があります。
ピボットテーブル / パワークエリの内部データソースとして使える
「テーブルまたは範囲から」でセル範囲のテーブル化が強制され、PowerQueryのソースにできます。
外部データソースのインポートで必要(SharePoint、Access、CSV、その他)
外部のデータソースを取り込んだ時、必然的にテーブル化された状態で取り込まれます。
SharePoint リストへエクスポートできる
テーブルの内容を、SharePointリストとしてアップロードできます。
残念なところ(使用上の注意とも言う)
テーブル知らない人は操作性の変化に戸惑う
テーブル内では、挿入削除とか貼り付けのコマンドの表現が変わります。
列の数式を壊す人が現れる(列の保護が貧弱・・・)
値が無い行を削除せずそのままにする人が現れる
インプットデータには適しているが、アウトプットには適していない
テーブル内ではスピルしないので、SEQENCE関数やUNIQUE関数でキー列を生成して、必要な情報と連結させるといったことができない・・・
アウトプットのテーブルでは、ピボットテーブルや、FILTER関数、UNIQUE関数を使ってスピルさせるのがオススメ。
中間データでは使いづらい場合がある(列のMATCHと構造化参照の反発)
DBのように行へユニークIDを付与できない → なぜなのか・・・
Excel Onlineでの操作性がデスクトップアプリと違って、イマイチ使いづらい
GoogleSpreadsheetには構造化参照が無い
コピーするとテーブルの書式が付いてきてしまう
背景色はもちろん、既定のヘッダの文字色が白なので、たまにヘッダが見えなくて消えたかのような状態になっていることがある
列の入れ替えをすると、そこから右の列の幅がズレる
コツは、列の挿入→切り取り→貼り付け→削除の順で入れ替えること
テーブルをコピーして、別のシートに形式を選択して貼り付け→列幅を複製しておくこと
テーブルの列の挿入をすると、そこから右の列の幅がズレる
シートの列として挿入すればズレが発生しなくて良いが、テーブル左端に列を増やしたい場合はどうにもならない。
テーブルを横に2つ並べて置くと、シートの行の挿入などができなくなる
テーブルを横に2つ並べて置くと、片方で絞り込みをしたとき、もう片方の行も非表示になってしまう
テーブルを横に2つ並べて置くと、左のテーブルの列の入れ替えをしたとき、右の列のデータがずれるというあってはならない挙動をする
Excelで行数の異なるテーブルを横に2つ並べて配置すると、左のテーブルの列を入れ替えたとき、右のテーブルのデータが一つ左にズレるバグなんとかしてほしい・・・
— ちゅん🐣VBAer (@KotorinChunChun) 2021年11月26日
※列の入れ替え=シートの列まるごと『切り取り』/『切り取ったセルの挿入』をする操作 pic.twitter.com/EfLZi21xNL
テーブルの行が切り取り挿入貼り付けで入れ替えられなくなる(シートの行として入れ替えることはできる)
Google Spreadsheet等のように、ドラッグで行の入れ替えが出来ると良いのだが・・・
「並び順」列を作って、ソート用の連番を降っておくと幸せになれます。
構造化参照をA1参照に、A1参照を構造化参照に変える正当な方法が用意されていない
A1参照形式にする方法は、無いことは無いけども・・・(後述)
テーブルを含むと2つ以上のシートが同時にコピーできない
2シート間で数式の参照がある場合に、1シートづつコピーすると、参照が途切れるという問題が生じるのが致命的。
- ブックをまるごとコピーして、不要なシートを取り除き、必要なシートを取り込む とか
- コピーしたいシートセットを「移動」して、コピー元ブックは保存せずに閉じる といった強引な手法が必要となる
テーブルにも名前を付けないと数式が読みづらくなるのだが、(シート名と違って)運用上は必要ないため名付けが重視されない。
テーブル名を設定するのは癖つけた方が良い。本当に。
ヘッダを空欄にできない。重複も出来ないので、スペースで埋めて誤魔化す
、
、
、
みたいな列がいっぱい増えていく。
集計行をヘッダの上にできないため、集計結果を常時見ることができない
どうしても、欲しければこれ。
ちなみに【分割】って機能もあって、これを使えば下側の行を固定するっぽいことは出来なくもない。行数が変動するとズレるけど。
— ちゅん🐣VBAer (@KotorinChunChun) 2020年9月9日
しかし、ウィンドウ枠の固定と併用出来ないという謎仕様w
テーブル定義済みなら列番号が見出しに化けるので、ウィンドウ枠の固定の代用として使える場合もある。 pic.twitter.com/v9wIaPqs0R
ヘッダが階層化されている表に使用しづらい(列名が冗長になりがち)
列名に改行Alt+Enterがあると構造化参照にも影響して式が読みづらくなる
いっそ、ヘッダ行は縦長にして、折り返して全体表示にしてしまうのも吉かと。
並び順に依存する積み上げ型の集計(累計を求める式)と相性が悪い
ヘッダ部に数式が使用できない
たとえば、日付を羅列したいとき 4/1 4/2 4/3 ・・・
たとえば、直上の社員番号から社員名をつけたいとき・・・
こういうときは、行と列を入れ替えたり、テーブルは入力用にして、クロス集計シートを作成したら改善しないか検討してみましょう。
誤って列全体/行全体に貼り付けしてテーブルが拡張されるときExcelがフリーズして死ぬ
テーブルで厄介なのが、行・列の貼り付けをしたときに自動拡張の影響でExcelがフリーズすることです。
— ちゅん🐣VBAer (@KotorinChunChun) 2020年11月27日
横に最大サイズまで増やすだけでも数分フリーズ。
縦だと終わらないことでしょう。
このブックだけなら兎も角、一緒に開いている全てのブックが全滅。
欲しいのは警告ON/OFF設定じゃないんだー。 pic.twitter.com/yJWF8R5YN4
その他のTips
表が横長になりがち
横長の表は、横スクロール Ctrl+Shift+Scroll
を覚えれば、ある程度許容できるようになる。
列の非表示ではなく、アウトラインによる列の折りたたみを使うと良い。
あとはマクロなど。
横に長いテーブルを使うときに便利な、任意のシートの表示列切替ができるユーザーフォームをリメイクしてみました。
— ちゅん🐣VBAer (@KotorinChunChun) 2021年9月18日
ユーザーは、オートフィルタより上の行によく使用する表示列の組み合わせを記述するだけで、このマクロを活用することができます。
ソースコードはリプへ続く https://t.co/4X05Zzv2OE pic.twitter.com/vD3FLHbZaI
テーブルの右端、下端に書いたコメントが、テーブルに取り込まれてしまった
Ctrl+Z
で自動拡張を取り消すことができる。
なお、テーブルより右か下にデータを置くのは、基本的に使い方を間違えている。
行の入れ替え機能が無いことから、左に書くのも使い勝手を阻害する。余分なデータは上に書いたほうがいい。
それでもやるなら、1列開けて、拡張されないようにすると良いかもしれない。
構造化参照をA1参照形式に変換したい:範囲に変換
「範囲に変換」で構造化参照をA1形式に戻すことができる。
構造化参照を使いたくない:xlsに変換
xls形式で保存していると、GUI操作でも構造化参照とならなくなり、A1形式で参照式を組むことができる。
構造化参照の列を横に変化させたい:横方向フィルの特殊な挙動
コピーだと構造化参照の列は変更しないが、マウス操作でフィルハンドルをドラッグしてフィルした場合は、構造化参照の項目名の部分が変化する。
特に、集計行の数式を複製するときは手間がかかるので、この操作の出番が多い。
入力規則のリストにテーブルを使いたい
まとめ
テーブルの機能大半は、Excelの単なる表を、リスト形式のデータベースとして使えるようにするためにあるものばかりです。
代わりに、Excelの操作性が若干落ちる傾向にあります。
本気で使い始めると、たまに目的を阻害するケースがあります。
テーブルの癖を知っていれば便利なものですが、何も知らない状態の人は戸惑うかもしれません。
テーブルを採用するかは、各自、各現場の事情に合わせて判断してください。
個人的な意見
さて、最後の最後に身も蓋もない理由で閉めさせてください。
私がテーブル化する最大の理由は、
入力データがテーブル化されていないと気持ち悪いから
です。もちろん「構造化参照を使いたい」「行と列の選択を楽にしたい」「スライサー使いたい」という思いがありますが、究極的にはこの一言に収束します。
なぜテーブル化するのか?
それは、
そこにテーブル化できそうな表があるから
です!
というわけで、今回は以上です。
Ctrl+T を押して、どんどんテーブル化していきましょう♪
2021/12/15時点で本書は未完成なので、後日加筆修正を行います。
後日談
何も考えずに全部テーブルにすると、こうなります。
アンケート(的なもの)の調査結果のテーブルを送ったら・・・
— ちゅん🐣VBAer (@KotorinChunChun) 2020年12月12日
(・8・)がくれるExcelは、見かたが分からないからダメだと言われました。
違うのよ。それは生データだから。
自分でフィルタなり、ピボットなりして好きな見かたに変えるのよ。
ちょっとは自分で分析して欲しい・・・。
あるいは、こうなります。
5年前、役所のデータのマスタ部分がテーブルで全部定義されてて感心していたのに、今年のデータを見たら全部解除されてて泣いた。
— ちゅん🐣VBAer (@KotorinChunChun) 2020年11月18日
しょうが無いからテーブル化するマクロ書いたんだけどさ。
やっぱり使えないって人が多いのかもねー。 https://t.co/BmjrzvjFBC