TRANSPOSEは、行と列を入れ替える関数です。
縦に並んだデータを横に、横に並んだデータを縦にします。元のデータには手を触れず、入れ替えた結果を別の場所に表示します。
書式
=TRANSPOSE(範囲)
引数は範囲だけです。
基本の動き
| A | B | C | |
|---|---|---|---|
| 1 | 東京 | 大阪 | 名古屋 |
| 2 | 1200 | 800 | 1500 |
=TRANSPOSE(A1:C2)
結果:
| 東京 | 1200 | |
| 大阪 | 800 | |
| 名古屋 | 1500 |
2行3列が、3行2列になりました。
貼り付け機能との違い
同じことは「編集 → 特殊貼り付け → 転置して貼り付け」でもできます。
| 特殊貼り付け | TRANSPOSE | |
|---|---|---|
| 元データとの連動 | しない(固定値) | する(自動更新) |
| 数式の残り方 | 値だけ残る | 数式として残る |
| 使う場面 | 一度きりの変換 | 継続的に見たい |
元データが更新される表なら TRANSPOSE、一度きりの整形なら特殊貼り付けという使い分けになります。
他の関数と組み合わせる
TRANSPOSEは範囲を返すので、他の関数の中でも使えます。
SPLITの結果を縦にする
SPLIT は結果を横方向に返します。縦にしたいときに使います。
=TRANSPOSE(SPLIT(A1, ","))
縦のリストを横に並べる
見出し行を作るときなどに使います。
=TRANSPOSE(マスタ!A2:A20)
FILTERの結果を入れ替える
=TRANSPOSE(FILTER(A2:C100, A2:A100="東京"))
縦横の検索を作る
MATCH と組み合わせて、横方向の検索に使うこともできます。ただし HLOOKUP や XLOOKUP のほうが素直です。
横持ちを縦持ちにしたいとき
TRANSPOSEでは目的を達成できないことがあります。
月ごとに列が伸びる「横持ち」の表を、集計しやすい「縦持ち」に直したい場合を考えてください。
元の表
| 支店 | 4月 | 5月 | 6月 |
|---|---|---|---|
| 東京 | 1200 | 1400 | 1300 |
| 大阪 | 800 | 950 | 900 |
欲しい形
| 支店 | 月 | 金額 |
|---|---|---|
| 東京 | 4月 | 1200 |
| 東京 | 5月 | 1400 |
| … |
TRANSPOSEは単に行列を入れ替えるだけなので、この形にはなりません。 FLATTEN を使った変換が必要です。詳しくは FLATTEN のページで扱っています。
「行列の入れ替え」と「持ち方の変換」は別物です。ここは混同しやすいところです。
エラーの対処
#REF! が出る
結果の展開先にデータが入っています。 TRANSPOSEは元の範囲の縦横を入れ替えた大きさで展開されます。
3行10列の範囲なら、結果は10行3列です。展開先にそれだけの空きが必要になります。
空欄が0になる
TRANSPOSEは空欄を 0 として返します。空欄のまま表示したいなら IF を挟みます。
=ARRAYFORMULA(IF(TRANSPOSE(A1:C2)="", "", TRANSPOSE(A1:C2)))
TRANSPOSEを2回書く必要があり冗長ですが、これが標準的な回避方法です。
書式が引き継がれない
値だけが返ります。 色や罫線は反映されません。書式も含めて入れ替えたいなら、特殊貼り付けを使ってください。
Excelとの違い
TRANSPOSEは共通です。書式も挙動も同じです。
ただし違いがあります。
| Excel | スプレッドシート | |
|---|---|---|
| 入力方法(旧版) | 配列数式(Ctrl+Shift+Enter) | 通常の入力 |
| 入力方法(365) | 通常の入力 | 通常の入力 |
| 特殊貼り付けでの転置 | ある | ある |
Excel 2019以前では、TRANSPOSEは配列数式として Ctrl + Shift + Enter で確定する必要がありました。スプレッドシートでは通常の入力で動きます。
まとめ
- – 書式は
=TRANSPOSE(範囲)。行と列を入れ替える - – 元データと連動するのが特殊貼り付けとの違い
- – 結果は元の縦横が入れ替わった大きさで展開される
- –
#REF!は展開先にデータがあるという意味 - – 空欄は
0になる。避けるなら IF を挟む - – 「横持ち→縦持ち」の変換はTRANSPOSEではできない。FLATTEN を使う