Excelで「テーブル機能」を使わない理由がない ~神Excelから機械判読可能なテーブルへ~

# はじめに
## この記事の概要
* テーブル機能の本来の意義は、**Excelを機械判読可能なデータベースとしてコンピュータに認識させること**である
* テーブル機能を使うことで**様々なメリットが享受できる**というだけでなく、近年では**テーブル機能の使用を必須とするツールが多数存在**する
* テーブル機能を広めることは、**世の中の神Excelを減らし、利用性の高いデータを増やす**ことにつながる

## この記事の目的
[ここ数年のExcelの機能追加](https://qiita.com/an_mogura/items/6f2011c062e2f1309d31)に伴い、テーブル機能はますます重要になってきている。しかしながら、世間ではまだ**認知度が低い**し、存在を知っている人にも**本来の意義が理解されていない**ことが多い。そこで、テーブルとは何か、どのようなメリットがあるのかなどを、本来の意義を踏まえて伝える。そして、それにより**世の中の神Excelを減らし、利用性の高いデータを増やす**ことを目的とする。

[summary]: #https://qiita.com/an_mogura/items/6f2011c062e2f1309d31

# テーブル機能とは
テーブル機能とは、`Ctrl + T`により作成できる特別な領域「テーブル」についての機能である。
![table_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/cdecd947-2f46-1496-851f-42366613fb89.png)
左：通常のセル範囲　　　右：「テーブル」

「table」は日本語の「表」に対応する一般的な英単語だが、ここではテーブル機能によって作られるものを単に「テーブル」、そうでないものを「表」「セル範囲」などと呼び分けることにする。

## テーブル機能についてのよくある誤解
先の図の通り、セル範囲をテーブル化したとき真っ先に気付くのは、行の色が設定されるなど、見やすいスタイルが適用されることだ。それが理由か、ネットなどのテーブル機能の説明では
>テーブル機能とは、見た目のきれいな表が簡単に作れる機能です！

などと書かれていることが多い。**この説明は最悪**である。本来の意義を理解しておらず、テーブル機能の地位を不当に貶める原因になっている。

## テーブル機能の本質的な意義
では、テーブル機能の本来の意義は何かというと、
**領域をデータベース構造としてコンピュータに認識させ、データの整理と分析を効率的かつ効果的に行えるようにする**
というものである。
その結果として、後述する様々なメリットが享受できるようになる。

## テーブルの構造
「データベース構造」と書いたが、これはいわゆる**リスト形式の表**や、**リレーショナルデータベース**（**RDB**）におけるテーブルの構造を指している。具体的には次のようなものである。
* テーブルは、決まった種類のデータを格納する**カラム**の集合である
* テーブルは、**データ**と、カラム名を表す**ヘッダー**を持つ
* データは、1つ1つの出来事などを表す**レコード**の集合である
* レコードは、各カラムに対応した**フィールド**の集合である

詳しい説明は省くが、Excelユーザー的には
* カラム 　　= 列[^1]
* ヘッダー　 = 見出し行
* データ 　　= 見出し以外の行
* レコード　 = データの1つ1つの行
* フィールド = セル

と捉えてしまって構わないだろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/ebdcd42a-55c4-ce34-6b51-bf46b2c6b10b.png)
ただし重要なのは、
**テーブルにおいては行番号、列番号、セル番地という概念が存在しない**
ということだ。
テーブルを扱う上では、
* レコードを指定するときは**ID**
* カラムを指定するときは**カラム名**
* フィールドを指定するときはIDとカラム名（この文脈では**フィールド名**とも呼ぶ）

を用いる。

[^1]: 「カラム」という語は「列」を意味する英単語「column」そのものから来ているが、データベース用語としてカタカナの「カラム」が定着しており、「列」よりも抽象的な、データベースの構造上の概念を指す場合が多い。ここでもそれに従って、テーブルについていうときは「カラム」と呼び、シートのセル範囲については区別のために「列」と呼ぶことにする。

説明のために、下図左のテーブル、セル番地`D5`、すなわちD列5行目にあるデータについて考えてみよう。
もしもこの表周辺のセル範囲について、下図右のように、行・列の挿入・削除や並べ替えを行うと、該当データは`E6`に移動する。つまり、**同じデータを表すのにセル番地が変わる**ということだ。Excel的に考えれば当然の話ではある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/cc20ebaa-0ce8-62f8-81b1-356052d846bf.png)

一方で、テーブルとして考えた場合、いくら行・列の挿入・削除や並べ替えをしようとも、該当データは「買い物ID4の単価フィールド」のまま変わらない。つまり、**同じデータを表すときは常に同じ指定**ができる。
そもそも論として、特定のデータを指定するのに「D列5行目」などと呼ぶのは単なるExcelの都合であって、我々が本来指定したいのは「4というIDが付けられた出来事（買い物）についての、単価の情報」である。データベースの構造はその本来の意味を表すようにできているわけだ。
Excelのテーブル機能とは、このような構造を機械が認識できるよう定義するものであり、それが後述する様々なメリットにつながってくる。

# テーブル機能のメリット
ここまでの話を踏まえ、具体的なテーブル機能のメリットを紹介する。

## 構造化参照が使える
**構造化参照**とは、セル番地ではなく**テーブルの構造を反映して数式を記述できる参照**である。これを使うと**数式の可読性向上**、**データ増減時の保守性向上**などの効果が得られる。Excel内で見た場合の最大のメリットだろう。具体例を見ていく。

### 数式の可読性向上
#### テーブル内からの参照
通常のエクセル数式は、`D2*E2`のように、セル番地で数式を記述する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/50f52748-81fc-8fb5-77b2-72568028a761.png)
見慣れた書き方ではあるが、`D2`、`E2`が何を指すのかは、そのセルを見に行かないとわからない。

一方、テーブル化してある場合、`[@単価]*[@個数]`のように、フィールド名を使って数式を記述できる。これが構造化参照である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/6f5db7d0-31ca-e8dc-12be-d73a69fe6afd.png)
これなら数式単独を見ただけで何の計算なのか即座に理解でき、非常に**可読性が高い**。

#### テーブル外からの参照
テーブル外からもテーブルの値を使って計算したい場合もあるだろう。たとえば列の集計をするときに`F2:F6`などと書く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/5344eed8-c475-db68-70d7-7e8498474056.png)
この例のように参照先がすぐ近くにあればよいのだが、集計は元データから離れた場所や別のシートになっていることも多い。そうすると、やはり数式が具体的に何を参照しているのか、わざわざ確認しにいかなければならない。

構造化参照では`tbl_買い物[小計]`のように書ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/141451a0-fa28-9c43-d852-20626d8b3c03.png)
`tbl_買い物`というのは、このテーブルの**テーブル名**で、それに`[カラム名]`を続けることで、そのテーブルのカラムを参照できる。この場合も通常の参照より圧倒的に可読性が高い。また、**テーブルは必ずブック内で重複しない名前を持つ**ので、他シート含め**ブックのどこからでも同じ記述で参照できる**。
なお、[先ほどの例](#テーブル内からの参照)ではカラム名に`@`がついていたが、この記号は数式が記述されている行の参照であることを表す。カラムの全データを参照するときは`[カラム名]`、テーブル内から[^2]自身のレコードのフィールドを参照するときは`[@カラム名`]のように書かれる。

[^2]: テーブルの外からも`@`は使えるが、その場合は「自身のレコード」ではなく単に「同じ行」という意味しかなく、誤りの元になるので避けたほうが良い。

### データ増減時の保守性向上
Excel長年の課題として、データの増減にどのように対応するか、というものがあった。例えば、データの全ての行を集計したいような場合に、データ行が増えると集計数式の参照範囲を直さねばならない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/d707300a-31f5-7fec-571c-6702ae89ecbb.png)
図：データが追加されて集計の数式に修正が必要な例

この対策として、
1. 最初から多めの範囲（`F2:F100`など）を参照しておく
1. 列全体（`F:F`）を参照しておく
1. `COUNT`関数や`OFFSET`関数などを駆使してデータ範囲を判定する

などの手法が存在した。
1は明らかに無駄かつ美しくない。2は全行（約104万行）を参照するので余計な負荷をかけてしまう。3はいくらかマシだが結局`COUNT`で余計なデータ範囲を選んでおかねばならないし、参照のためだけにこのような数式を組むのも面倒である[^3]。

[^3]: [同様のロジックだがもっとスマートに書ける機能](https://techcommunity.microsoft.com/t5/excel-blog/announcing-trimrange-and-accompanying-trim-references/ba-p/4230202#:~:text=The%20TRIMRANGE%20function%20removes%20empty,optimizing%20lambda%20functions%20for%20performance.)が導入される予定らしい。

構造化参照を使えばこの問題は簡単に解決する。
まず、**テーブル最下行のすぐ下にデータを入力すると、自動でテーブルの範囲が拡張される**
（これは構造化参照というよりテーブル機能の仕様）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/4cffe546-4b0e-fc3c-c4ef-32b039052e21.png)
このとき、集計数式の参照範囲も変わらねばならないが、構造化参照の`[カラム名]`は**テーブルのカラム全体を参照する**という仕組みなので、**特別な工夫をすることも数式を書き換えることもなく、常に正しい範囲を参照できる**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869613/6be65dd6-5841-87d0-dee4-44a9cc170dbf.png)

### VBAでのテーブル参照
VBAでもワークシートと同様に構造化参照が使えるほか、テーブルに与えられる`ListObject`型を使って操作することもできる。できることの大きな違いとして、構造化参照では特定のレコードを示すのが不可能だが、`ListObject`型では可能という点がある。ループを回すことを考えると`ListObject`のほうが使い勝手はいいだろう。

### 余談：VLOOKUPとXLOOKUPの参照方法の違い
`XLOOKUP`関数が登場したとき、`VLOOKUP`関数の上位互換だとして話題になった。この`XLOOKUP`関数の参照方法も、セル範囲ではなくテーブルを想定したものである。`VLOOKUP`は検索列と戻り列を列インデックスで決定するため、[先に述べたような列の挿入・削除や並べ替え](#テーブルの構造)に弱かった。一方、`XLOOKUP`では検索列と戻り列そのものをそれぞれ指定するため、列位置という**ワークシート的な制約から解放**され、純粋にテーブルの構造だけに対応して数式を書ける。

## 他のツールとの連携に必須
ここ数年はローコード・ノーコードの業務効率化系ツールがトレンドになっており、MicrosoftでいうとPower Query、Power Automate、Power Appsなどが代表的である。これらはいずれもExcelと連携できるが、基本的には**テーブル機能の使用が必須**である。フォーマットの自由度が高すぎるExcelでそのようなツールを使うためには、対象をテーブルに限るのは必然と言える。Microsoftエコシステムの恩恵を受けるためには、テーブルにした方がいい、というレベルではなく、**必ずテーブルにしないといけない**という時代が既に来ているのだ。

## その他
### セル結合ができない
レコードは独立しているものなので**セル結合ができない**。これだけでもすごく嬉しいという人は多いだろう。
たまに
>テーブル機能を使うとセル結合ができないのが「デメリット」である

という人がいるが、それは**テーブルを理解していない証拠**なので要注意である。

### オートフィルターが自動で設定される
テーブルには行番号という概念がないので、**フィルタリングや並べ替えは常に可能**である。だからオートフィルターは自動で設定される。

### スクロールしてもヘッダーが常に表示される
Excel側がヘッダーを認識しているので、スクロールした際に常に自動でヘッダーを表示させることができる。ただのセル範囲であればExcelにはどこがヘッダーか判断できないので、手動で固定表示を設定してやる必要がある。

### 数式や書式などはカラムごとに全レコードで同じになる
1つのカラムには同じ種類のデータが入っているので、基本的に**数式や書式などは全レコードで同じものが自動で適用される**。「基本的に」と書いたのは、手動で個別に設定することもできるからだが、もちろんそれは避けたほうが良い。
Excelをデータベースとして使うときネックになるのが**入力関連機能の弱さ**だが、それをある程度カバーする、**改良された**[**チェックボックス**](https://qiita.com/an_mogura/items/6f2011c062e2f1309d31#%E4%BD%BF%E3%81%84%E5%8B%9D%E6%89%8B%E3%81%AE%E3%81%84%E3%81%84%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9)や[**ドロップダウンリスト**](https://qiita.com/an_mogura/items/6f2011c062e2f1309d31#%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A7%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88)も自動で追加行に設定されるからありがたい。

### 集計行の追加や設定が簡単
1つのカラムには同じ種類のデータが入っているので、適切な関数を選べば集計ができる。また、集計すべき範囲も全レコードと決まっている。だからワンクリックで集計行有無や計算の種類を設定することができる。

### 見た目が設定される
デザインを簡単に設定できる。人間に対してテーブルの構造を伝えるという意味では有効な手段である。

# テーブル機能の基本的な使い方
具体的な操作方法については他でもいろいろと説明があるので詳細は省くが、ここでは本来の意義を踏まえて使うためのポイントを紹介していく。

## テーブルの作成
### テーブル設計
どのようなテーブルを用意し、どのようなカラムを設け、どのようにお互いを関連付けるか決めることを**テーブル設計**という。これはExcelというより完全にリレーショナルデータベース（RDB）の領域であるのでここでは触れないが、テーブル機能を使うなら**RDBの基礎知識は調べておくことを強く推奨**する。

### セル範囲をテーブル化するタイミング
いつでもテーブル化は可能だが、基本的にできるだけ早め、具体的には**ヘッダー行とレコード1行を入力し終えた直後**までを推奨する。
理由は以下の通り。

* テーブルにすると専用の入力支援機能が使えるから
* レコードを2行以上作成すると、数式や書式等が行ごとに変わってしまう恐れがあるから

### セル範囲のテーブル化
テーブルにしたいセル範囲内をどこでもいいので選択し、`Ctrl + T`（テーブルのT）、または`Ctrl + L`（リストのL）をクリックする[^4]。

[^4]: リボンメニューからも操作できるが、表現が誤解を招くので推奨しない。

### テーブル名の設定
テーブルを作成したら、すかさず「テーブルデザイン」タブから**テーブル名を設定**しよう。デフォルトでは「テーブル1」などの名称が付けられているが、後々のため分かりやすい名前にすることが望ましい。その際、**名前は半角アルファベットまたはアンダースコア（_）から始める**と、数式編集中に入力支援が使えるのでおすすめ。ちなみにExcelでは基本的に大文字小文字が区別されない。
テーブル名はいつでも変更できるが、Power QueryやPower Automateなどのツールはテーブル名の文字列で参照するため、**後からExcelでテーブル名を変えるとツール側も都度修正が必要になる**。したがって、それらツールの運用を開始する前には確定しておく必要がある。
ブック中に存在するテーブル名は、以下のいずれかから一元管理することもできる。
* 「数式」タブ「定義された名前」、もしくは`Ctrl + F3`の**名前の管理**
* ステータスバーのシート名をクリック、もしくは「表示」タブ「表示」の**ナビゲーション**（`Alt → W → K`）

## テーブル上での選択や移動
テーブル専用の選択や移動の方法が用意されている。詳細はここでは省くが、使えばすぐに慣れるだろう。

## テーブルの参照
マウスで参照先を選択すれば自動的に構造化参照になる。自力でキーボードから入力する場合は支援機能が使える。

# おわりに
## テーブル機能のメタ的な意義
これまで見てきたように、テーブル機能を使おうとすると「テーブルは1行のヘッダーをもつ」「テーブル内ではセル結合できない」など、RDBのテーブルに準じた制約が課される。また、正しい意義が理解されれば、自動的にRDBの概念の一部も理解されたことになる。さらに、テーブル機能の魅力に気付いたユーザーはRDBについて自発的に調べるようになるだろう。したがって、**テーブル機能が世間に広まれば、自然と神Excelが減少し、きれいなデータが世の中に増えていく**のではと筆者は思う。これがこの記事を書いた一番の動機である。

## まとめ
* テーブル機能の本質的な意義は、**領域をデータベース構造としてコンピュータに認識させ、データの整理と分析を効率的かつ効果的に行えるようにする**機能である
* テーブル機能を使うと**様々なメリットが享受できる**。それだけでなく、**テーブル機能なしでは実現できない**ことも増えている
* テーブル機能を広めることは、**世の中の神Excelを減らし、利用性の高いデータを増やす**ことにつながる