スプレッドシートで、月別や支店別の表を1つにまとめたいことってありますよね。1月分の売上データの下に2月分を追加したり、東京支店と大阪支店の一覧をつなげたり。手作業でコピーすると、行がズレたりヘッダーが重複したりで大変です。
VSTACK関数を使えば、複数の表を数式ひとつで縦方向に結合できます。元データが更新されれば結合結果も自動で反映されるので、メンテナンスの手間もかかりません。
この記事では、VSTACK関数の基本から、HSTACK関数や中カッコ配列記法との違いまでわかりやすく解説します。
スプレッドシートのVSTACK関数とは?
VSTACK関数(読み方: ブイスタック関数)は、複数の配列やセル範囲を縦方向(垂直方向)に結合する関数です。「V」はVertical(垂直)、「STACK」は積み重ねるという意味で、表を縦に積み重ねるイメージです。
たとえば、3行の1月売上と3行の2月売上を結合して、6行の売上一覧表を作れます。元データと数式でつながっているため、元データを変更すれば結合結果も自動で更新されますよ。
VSTACK関数にできることをまとめると、次のとおりです。
- 複数の表やセル範囲を縦方向に結合する
- 引数を追加するだけで3つ以上の表もまとめて結合できる
- 列数が異なる表を結合した場合、不足列は自動で補完される
- FILTER関数やSORT関数と組み合わせて結合後のデータを加工できる
NOTE
VSTACK関数はGoogleスプレッドシート独自の関数ではなく、ExcelのMicrosoft 365やExcel 2024でも使用できます。ただし、Excel 2021以前のバージョンでは使えません。
VSTACK関数の基本構文
=VSTACK(配列1, [配列2], ...)
カッコの中に、縦方向に結合したい範囲を順番に指定します。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列1 | 必須 | 結合する最初のセル範囲または配列 |
| 配列2以降 | 任意 | 追加で結合するセル範囲または配列(最大254個) |
結合したい表をカンマ区切りで並べるだけのシンプルな構文です。引数は最大254個まで指定できますが、実務では2〜4個程度を使うことがほとんどですよ。
列数が異なる表を結合した場合
VSTACK関数では、結合する表の列数が異なっても結合自体は成功します。ただし、列数が少ない側の不足分は#N/Aエラーで自動的に埋められます。
たとえば、3列の表と5列の表を結合すると、3列の表側の4〜5列目に#N/Aが入ります。この#N/Aを消したい場合は、IFERROR関数で囲みましょう。
=IFERROR(VSTACK(A1:C3, A5:E7), "")
これで#N/Aの部分が空白に置き換わります。列数が異なる表を扱うときは、セットで覚えておいてくださいね。
VSTACK関数の基本的な使い方
ここでは、月別の売上データを使ってVSTACK関数の基本操作を紹介します。
サンプルデータ
A1:C4に1月の売上データ、A6:C8に2月の売上データが入っているとします。
1月売上(A1:C4):
| A | B | C | |
|---|---|---|---|
| 1 | 担当者 | 商品 | 売上 |
| 2 | 佐藤 | 商品A | 50,000 |
| 3 | 田中 | 商品B | 30,000 |
| 4 | 鈴木 | 商品C | 45,000 |
2月売上(A6:C8):
| A | B | C | |
|---|---|---|---|
| 6 | 佐藤 | 商品A | 55,000 |
| 7 | 田中 | 商品B | 28,000 |
| 8 | 鈴木 | 商品D | 60,000 |
2つの表を縦に結合する
出力先のセル(たとえばE1)に以下の数式を入力して、Enterを押します。
=VSTACK(A1:C4, A6:C8)
| E | F | G | |
|---|---|---|---|
| 1 | 担当者 | 商品 | 売上 |
| 2 | 佐藤 | 商品A | 50,000 |
| 3 | 田中 | 商品B | 30,000 |
| 4 | 鈴木 | 商品C | 45,000 |
| 5 | 佐藤 | 商品A | 55,000 |
| 6 | 田中 | 商品B | 28,000 |
| 7 | 鈴木 | 商品D | 60,000 |
1月の売上データの下に2月のデータがきれいに結合されました。1つの数式を入力するだけで、7行分のデータがスピルで自動展開されます。
3つ以上の表を結合する
結合する表が3つ以上ある場合も、カンマで区切って引数を追加するだけです。
=VSTACK(A1:C4, A6:C8, A10:C12)
1月・2月・3月の売上データを一気に結合できます。月次データが増えても数式に追加するだけなので、管理がラクですよ。
VSTACK関数の実務活用パターン
パターン1: ヘッダーを除外して結合する
月別データを結合するとき、各テーブルにヘッダー行があると重複してしまいますよね。1つ目の表はヘッダー込み、2つ目以降はヘッダーを除外して結合しましょう。
=VSTACK(A1:C4, A7:C8)
2つ目の範囲をヘッダー行の次(A7)から指定すれば、ヘッダーの重複を防げます。テーブルが多い場合はこのパターンを基本にしてくださいね。
パターン2: FILTER関数と組み合わせて絞り込む
複数の表を結合した後、条件に合うデータだけ抽出したいことがありますよね。FILTER関数と組み合わせましょう。
=FILTER(VSTACK(A2:C4, A6:C8), VSTACK(C2:C4, C6:C8)>=50000)
VSTACKで結合した表に対して、売上が50,000以上のデータだけを抽出しています。条件列もVSTACKで結合するのがポイントです。
パターン3: SORT関数と組み合わせて並べ替える
結合したデータを特定の列で並べ替えたい場合は、SORT関数が便利です。
=SORT(VSTACK(A2:C4, A6:C8), 3, FALSE)
第2引数の「3」は結合後の3列目(売上)を基準にソートします。第3引数のFALSEは降順です。結合と並べ替えが1つの数式で完結しますよ。
パターン4: 別シートの表を結合する
別シートにある表を縦に結合することもできます。
=VSTACK(A1:C4, '2月'!A1:C4, '3月'!A1:C4)
シート名をシングルクォーテーションで囲んで指定します。月別に別シートで管理しているデータを、1つの一覧表にまとめたいときに便利ですよ。
パターン5: UNIQUE関数で重複なしリストを作る
複数の範囲から重複を除外した一覧を作るパターンです。
=UNIQUE(VSTACK(A2:A10, D2:D10))
2つの列を縦に結合した後、UNIQUE関数で重複行を除外しています。部署名や商品名などの一意なリストを作りたいときに使えます。
HSTACK関数との違い・使い分け
VSTACK関数には、ペアとなるHSTACK関数があります。どちらも表を結合する関数ですが、結合の方向が異なります。
| 比較項目 | VSTACK関数 | HSTACK関数 |
|---|---|---|
| 結合方向 | 縦方向(下に積み重ねる) | 横方向(右に並べる) |
| 語源 | Vertical Stack(垂直に積む) | Horizontal Stack(水平に積む) |
| 結果の行数 | 各配列の行数の合計 | 各配列の行数の最大値 |
| 結果の列数 | 各配列の列数の最大値 | 各配列の列数の合計 |
| サイズ不一致時 | 不足列を#N/Aで埋める | 不足行を#N/Aで埋める |
| 主な用途 | 月別・支店別データを縦にまとめる | 項目(列)を横に追加する |
使い分けはシンプルです。
- 行(データ件数)を増やしたい → VSTACK関数
- 列(項目)を増やしたい → HSTACK関数
たとえば「1月〜3月の売上データを1つの表にまとめたい」ならVSTACK関数です。「社員名簿に評価列を追加したい」ならHSTACK関数を使いましょう。
TIP
VSTACKとHSTACKは組み合わせて使うこともできます。VSTACKで月別データを縦に結合してから、HSTACKで集計列を横に追加する、といった使い方も可能ですよ。
中カッコ{配列}記法との違い・使い分け
スプレッドシートには、中カッコ {} を使って配列を作る記法があります。VSTACK関数と似た結果を得られますが、いくつかの違いがあります。
中カッコ配列記法とは
中カッコの中でセミコロン区切りにすると、縦方向に結合できます。
={A1:C4; A6:C8}
これは =VSTACK(A1:C4, A6:C8) とほぼ同じ結果になります。なお、カンマ区切り {A1:C4, A6:C8} にすると横方向の結合(HSTACK相当)になります。
VSTACK関数と配列記法の比較
| 比較項目 | VSTACK関数 | 中カッコ配列記法 |
|---|---|---|
| 構文 | =VSTACK(範囲1, 範囲2) | ={範囲1; 範囲2} |
| 列数不一致時 | #N/Aで自動補完 | エラーになる場合がある |
| 3つ以上の結合 | カンマで追加するだけ | ネストが深くなりがち |
| 他関数との組み合わせ | FILTER・SORTの引数に直接渡せる | 配列記法ごと渡す必要がある |
| 可読性 | 関数名から意図が明確 | 慣れないと読みにくい |
| Excel互換性 | あり(Microsoft 365) | Sheets固有の記法 |
使い分けの目安は次のとおりです。
- 列数が異なる表を結合する、3つ以上の表を結合する → VSTACK関数
- 列数が同じ2つの表をサッと結合したい → 中カッコ配列記法
中カッコ記法は手軽ですが、列数が異なる表を結合すると意図しない結果になることがあります。VSTACK関数は列数不一致を#N/Aで自動補完するため、安全に使えますよ。
TIP
中カッコ配列記法はGoogleスプレッドシート特有の記法です。Excelとの互換性を意識する場合は、VSTACK関数を使うのがおすすめです。
よくあるエラーと対処法
VSTACK関数はシンプルですが、使い方によってはエラーが発生します。
| エラー | 原因 | 対処法 |
|---|---|---|
#REF! | 出力先のセルに既にデータがある | 出力先の範囲を空にしてください |
#REF! | 参照先の行や列が削除された | 参照先セルが存在するか確認してください |
#N/A | 列数が異なる表を結合した | IFERRORで空白に置換してください |
#NAME? | 関数名のスペルミス | 「VSTACK」のスペルを確認してください |
#ERROR! | 引数にセル範囲以外の不正な値を指定した | セル範囲または配列を正しく指定してください |
特に注意したいのが #N/A です。これはエラーではなく、列数不一致時の仕様による自動補完です。見た目が気になる場合はIFERROR関数で対処しましょう。
=IFERROR(VSTACK(A1:C3, A5:E7), "")
TIP
「出力先のセルに既にデータがある」ケースが最も多いトラブルです。数式を入力するセルの下側に、結合後の行数分の空きスペースを確保してくださいね。
QUERY関数と組み合わせて結合後のデータを集計する
VSTACK関数で複数の表を結合した後、QUERY関数と組み合わせると、SQLライクな集計・絞り込みが可能になります。
複数月のデータを結合して担当者別に集計する
たとえば、1月〜3月の売上データを結合して、担当者ごとの売上合計を集計したい場合は次のように書きます。
=QUERY(VSTACK(A1:C4, A6:C8, A10:C12),
"SELECT Col1, SUM(Col3) GROUP BY Col1 LABEL Col1 '担当者', SUM(Col3) '売上合計'", 0)
VSTACK で結合した配列をQUERY関数の第1引数に渡しています。Col1 は1列目(担当者)、Col3 は3列目(売上)を指し、GROUP BY で担当者ごとに集計します。最後の 0 はヘッダー行がないことを示しています(VSTACKで結合した表にヘッダーが含まれる場合は 1 にしてください)。
WHERE句で特定条件だけ抽出する
結合したデータのうち、売上50,000以上のレコードだけ抽出するには次のようにします。
=QUERY(VSTACK(A2:C4, A6:C8),
"SELECT * WHERE Col3 >= 50000")
FILTER関数と役割が重なりますが、AND/OR条件の組み合わせや、ORDER BY(並べ替え)、LIMIT(件数制限)もSQL風に書けるのがQUERYの強みです。
IMPORTRANGE関数との組み合わせ:別スプレッドシートのデータを縦に結合する
同じファイル内の複数シートを結合するだけでなく、別のスプレッドシートファイルのデータも縦に結合できます。そのときに使うのがIMPORTRANGE関数です。
IMPORTRANGE関数は、別のスプレッドシートURLとセル範囲を指定して、外部ファイルのデータを取り込む関数です。これをVSTACKと組み合わせると、複数のファイルに分散しているデータを1か所に集約できます。
別スプレッドシートのデータを結合する数式
=VSTACK(
IMPORTRANGE("スプレッドシートURL_A", "Sheet1!A2:C100"),
IMPORTRANGE("スプレッドシートURL_B", "Sheet1!A2:C100")
)
URLには各スプレッドシートの共有URLを指定します。ヘッダー行を除いた範囲(A2以降)を渡すと、重複なしでデータが縦に結合されます。
実務での活用シーン
部門ごとのスプレッドシートを集約する場合を考えてみましょう。東京支店・大阪支店・名古屋支店がそれぞれ別ファイルで売上データを管理しているとき、全社集計シートに上記の数式を1つ書くだけで各支店のデータをまとめた一覧表ができあがります。
各支店が自分のファイルを更新すれば、集計シートにも自動で反映されます。これにより「月末に各支店からデータを集めてコピペする」作業が不要になりますよ。
IMPORTRANGE使用時の注意点
初めて別スプレッドシートを参照するときは、アクセスの許可が必要です。数式を入力すると「アクセスを許可する」というポップアップが出るので、クリックして承認してください。許可後は自動更新されます。
また、IMPORTRANGE はデータ取得に少し時間がかかる場合があります。シートを開いた直後は「読み込み中…」と表示されることがありますが、そのまま待てばデータが表示されます。
IMPORTRANGE関数の使い方を詳しく知りたい方は、スプレッドシートのIMPORTRANGE関数の使い方もあわせてご覧ください。
VSTACK関数のよくある質問(FAQ)
Q1. VSTACKとFLATTEN関数は何が違う?
VSTACK関数は「複数の範囲を縦に並べる」関数で、表の構造(列)を保ったまま結合します。一方、FLATTEN関数は範囲内のすべての値を「1列に変換する」関数です。
たとえば3行3列の表をFLATTENに渡すと9行1列になりますが、VSTACKは複数の表を縦に積み重ねるため列数は保持されます。「行数を増やす(表を縦につなぐ)」なら VSTACK、「全要素を1列にまとめる」なら FLATTEN と使い分けましょう。
Q2. VSTACKとTOCOL関数の使い分けは?
TOCOL関数は「1つの範囲を1列に変換する」関数です。複数の表を縦に結合するVSTACKとは用途が異なります。
「複数の列・範囲から値を1列のリストにまとめたい」場合は TOCOL や FLATTEN が向いています。「複数の表をそのまま縦につなぎたい」場合は VSTACK が適切です。
Q3. INDIRECT関数と組み合わせて動的に結合できる?
INDIRECT関数でシート名を動的に指定しようとしても、VSTACKの引数に直接 INDIRECT を渡すことはできません(配列引数としてサポートされていないため)。
代わりに、対象シートのデータを参照する補助列を各シートに作り、VSTACKでその補助列を結合する方法が現実的です。シートが多い場合はGASでデータを集約するアプローチも検討してください。
Q4. VSTACKはExcelでも使える?
はい。Microsoft 365(サブスクリプション版)およびExcel 2024以降で使用できます。Excel 2021以前のバージョンでは VSTACK 関数自体が存在しないため、代替として {A1:C3; A5:C7} のような中カッコ配列記法か、Power Queryでの結合を検討してください。
Googleスプレッドシートで書いたVSTACK数式は、Excel365でもそのまま動作します。
まとめ
VSTACK関数は、複数の表やセル範囲を縦方向に結合するための関数です。数式ひとつでデータを積み重ねでき、元データの更新も自動で反映されます。
この記事のポイントをおさらいしておきましょう。
- VSTACK関数は
=VSTACK(範囲1, 範囲2)で、表を縦方向に結合する - 引数をカンマで追加するだけで、3つ以上の表もまとめて結合できる
- 列数が異なる表を結合すると、不足列は#N/Aで埋まる。IFERRORで対処する
- HSTACK関数はペア関数で、横方向に結合する。行を増やすならVSTACK、列を増やすならHSTACK
- 中カッコ配列記法
={範囲1; 範囲2}でも縦結合できるが、列数不一致時はVSTACK関数のほうが安全 - FILTER関数やSORT関数と組み合わせれば、結合と加工が1つの数式で完結する
まずは =VSTACK(A1:C3, A5:C7) のシンプルな縦結合から試してみてください。月別データの集約や支店別データの統合など、使い道がどんどん広がりますよ。
