【QUERY関数⑤】コピペ可|複数範囲を参照・結合する方法(データ集約)

関数教室
新任
新任

QUERY関数抽出条件については色々と学んできましたが、そもそも参照範囲って1つしか指定できないんですか

人事のプロ
人事のプロ

結論から言うと、複数の範囲を縦にも横にも結合することが可能よ。

別シート同士もできるし、更にIMPORTRANGE関数を組み合わせればスプレッドシートをまたいだ結合までできてしまうの。

新任
新任

え!それってもうコピペ作業いらないってことですよね?!

人事のプロ
人事のプロ

別々のシートで更新したものを合わせて見たい時なんかは最適ね。

数式の前半を少し工夫するだけなので、覚えてしまいましょう!

この記事を読んだら
  • QUERY関数複数の範囲を指定してデータ結合できる
    • 縦・横に結合
      • シートまたぎ
      • スプレッドシートまたぎ
  • 一度数式を組んでおけば、別々に更新したデータを即反映できる
    • 定例のコピペ作業が不要になる
      • 時間削減
      • 人為的ミス抑制

複数範囲指定の基本

縦に結合( ; )

範囲全体を { } で括る

今回は、プロ野球チームを例に見ていきましょう。

セ・リーグとパ・リーグの成績が分かれて掲載されています。

プロ野球「セ・リーグ」「パ・リーグ」それぞれの順位表
プロ野球データFreak2020年データより

両リーグの計12球団を、1つの表にまとめたいとします。

セ・リーグの下に続けてパ・リーグの球団が並ぶように、赤枠の範囲を縦に結合すると以下のようになります。

スプレッドシートでQUERY関数を使用して、セ・リーグの下に続けてパ・リーグの球団が並ぶように、それぞれの範囲を縦に結合したキャプチャ
  • 範囲全体を { } で囲む
  • 縦結合の場合は範囲同士を ; で繋ぐ

列はアルファベットではなくCol(番号)で指定

新任
新任

これってselect句の列指定や、where句の条件指定もできるんですか?

人事のプロ
人事のプロ

もちろん!

複数条件並び替えも可能よ。

但し、列をアルファベットではなく「Col1,Col2,…」のように「列番号」で指定する必要があるので覚えておいて。

ちなみに、これはColumn(カラム)の略で、「縦の列」を意味しているの。

新任
新任

急にガチっぽくなってきた…。

「シーオーエル」ですね。

頭の「C」は大文字で、末尾の「l」は「大文字のアイ」ではなく「小文字のエル」…っと。

人事のプロ
人事のプロ

これだけ聞いてもよく分からないと思うので、事例を見ていきましょう。

縦に結合した両リーグのデータベースのうち、3位以上の球団を抜き出し、打率順で並び替えると、以下のようになります。

スプレッドシートでQUERY関数を使用して、セ・リーグの下に続けてパ・リーグの球団が並ぶように、それぞれの範囲を縦に結合した上で、3位以上の球団を抜き出し、打率順で並び替えたキャプチャ
新任
新任

1、2、7列目を抜き出して、ということか。

シートではなく指定した参照範囲内での列番号なんですね!
間違えそう…。

人事のプロ
人事のプロ

その通り!先程のシートで言うと赤枠の中ね。

従って、それぞれの範囲が同じ列数でなければ使えないの。

片方の列数が多すぎても、以下のようにエラーが出てしまうので注意してね。

スプレッドシートでQUERY関数を使用して、2つの範囲を縦に結合するも、指定した列数が異なっていることでエラーが出ているキャプチャ
  • 列はアルファベットではなく「Col1,Col2,…」のように「列番号」で指定する
    • シートではなく指定した参照範囲内での列番号
    • それぞれの範囲が同じ列数でなければエラーになる

横に結合( , )

横結合はそれほど使う機会は多くありませんが、縦(行)の順番が変わらないのであればVLOOKUP関数やイコール参照よりも手軽なので、セットで覚えてしまいましょう。

例えば、セ・リーグ6球団の順位表がありますが、勝敗と打撃成績でデータが分かれてしまっている場合。

プロ野球「セ・リーグ」の勝敗と打撃成績のデータが、スプレッドシートで縦に並んでいるキャプチャ

勝敗と打撃成績が並ぶように、赤枠の範囲を横に結合すると以下のようになります。

スプレッドシートでQUERY関数を使用して、勝敗と打撃成績が並ぶように、それぞれの範囲を横に結合したキャプチャ
  • 横結合の場合は範囲同士を , で繋ぐ

以下の文字列をコピーして使用して下さい。(緑文字を置き換え)

縦結合

=query({範囲始点①:範囲終点①;範囲始点②:範囲終点②},"select*")

Copy
  • 範囲全体を { } で囲む
  • 縦結合の場合は範囲同士を ; で繋ぐ

=query({範囲始点①:範囲終点①;範囲始点②:範囲終点②},"select Col1,Col2,Col3 where Col1<=3 order by Col2 desc")

Copy
  • 列はアルファベットではなく「Col1,Col2,…」のように「列番号」で指定する
    • シートではなく指定した参照範囲内での列番号
    • それぞれの範囲が同じ列数でなければエラーになる

横結合

=query({範囲始点①:範囲終点①,範囲始点②:範囲終点②},"select*")

Copy
  • 横結合の場合は範囲同士を , で繋ぐ
【補足】シートに関数をコピーする方法
  • 貼り付けたいセルにカーソルを合わせて「fx」欄に貼り付け
    • キーボード「F2」ボタン(セル編集)を押してから貼り付けでも可
スプレッドシートに関数をコピペするには、対象セルにカーソルを合わせて「fx」欄に貼り付けることを説明したキャプチャ

シートをまたぐ場合

セルで範囲指定

1つのスプレッドシート内であれば、同じ方法でシートまたぎの複数範囲も指定可能です。

例えば、リーグごとにシートが分かれている場合。

参照先シート①「セ・リーグ」
参照先シート①「セ・リーグ」
参照先シート②「パ・リーグ」
参照先シート②「パ・リーグ」

セ・リーグの下に続けてパ・リーグの球団が並ぶように、赤枠の範囲を縦に結合すると以下のようになります。

スプレッドシートでQUERY関数を使用して、セ・リーグの下に続けてパ・リーグの球団が並ぶように、それぞれの範囲を縦に結合したキャプチャ

列で範囲指定(空欄は除外)

これまでは「$B$3:$H$9」のようにセル単位で範囲指定しましたが、それだと参照先シートに新しく行が追加された場合に反映できません

なぜなら、数式を組んだ時点で参照する行が固定されるからです。

新任
新任

でもプロ野球の球団が増えるって、そうないですよね(笑)

人事のプロ
人事のプロ

これはあくまで例だから…。

人事業務で言うと、社員とアルバイトそれぞれの名簿QUERY関数で結合した場合、セルで範囲指定していたら新たに入社した人が反映しなくて困るでしょ?

新任
新任

確かに!

データベースが蓄積されていく管理表等であれば必須ですね。

それでは、先程の数式をセル指定から列指定に変更してみます。

スプレッドシートでQUERY関数を使用して、セ・リーグの下に続けてパ・リーグの球団が並ぶように、それぞれの範囲を「列指定で」縦に結合したものの、パ・リーグが画面から消えてしまったキャプチャ
新任
新任

パ・リーグが消えた?!

スプレッドシートでQUERY関数を使用して、セ・リーグの下に続けてパ・リーグの球団が並ぶように、それぞれの範囲を「列指定で」縦に結合したものの、パ・リーグが922行目まで飛んでしまったキャプチャ
人事のプロ
人事のプロ

スクロールしてみると、992行目にあるわね。

これは列ごと指定したことで、参照先シートの下側にある空白セルまで抽出されているの。

対応としては、空欄を除外する条件を追加すればOKよ。

空白を表す「is null」を活用し、空欄を除外する数式に修正すると、以下のようになります。

スプレッドシートでQUERY関数を使用して、セ・リーグの下に続けてパ・リーグの球団が並ぶように、それぞれの範囲を「列指定で」縦に結合した上で、空欄を除外したキャプチャ

※見出し行は指定していないため、データ内容に基づいて推測される

セル指定

=query({'シート名①'!範囲始点:範囲終点;'シート名②'!範囲始点:範囲終点},"select*")

Copy
  • 1つのスプレッドシート内であれば、同じ方法でシートまたぎの複数範囲も指定可能

列指定

=query({'シート名①'!$この列から:$この列まで;'シート名②'!$この列から:$この列まで},"select* where not Col1 is null")

Copy
  • 列指定にすることで、参照先シートに新しく追加された行も反映可能
  • 参照先シートの空白セルまで抽出されないよう「is null」を活用
    • 数式は「where Col1 is not null」でも可能

スプレッドシートをまたぐ場合

最後に、別のスプレッドシートを参照して範囲指定する方法を紹介します。

ここで登場するのが、言わずと知れたIMPORTRANGE関数です。

文量が多くなってしまったので、本記事では結論だけ記載します。

詳しい解説はこちらの記事をご覧下さい。

=QUERY({IMPORTRANGE("https://●●","シート名!$この列から:$この列まで");IMPORTRANGE("https://▲▲","シート名!$この列から:$この列まで")},"select Col1,Col2,Col3 where not Col1 is null")

Copy
  • 範囲指定の部分をIMPORTRANGE関数にそのまま置き換える(型は変わらない)
    • 範囲全体を { } で囲む
    • 縦結合の場合は範囲同士を ; で繋ぐ

以上、QUERY関数複数範囲を結合する方法について解説しました。

ここまでマスターすれば、クラウド上のあらゆるデータを集約し、自由自在にアウトプットすることができます。

是非、日々の業務改善にお役立て下さい。

タイトルとURLをコピーしました