QUERY関数の抽出条件については色々と学んできましたが、そもそも参照範囲って1つしか指定できないんですか?
結論から言うと、複数の範囲を縦にも横にも結合することが可能よ。
別シート同士もできるし、更にIMPORTRANGE関数を組み合わせればスプレッドシートをまたいだ結合までできてしまうの。
え!それってもうコピペ作業いらないってことですよね?!
別々のシートで更新したものを合わせて見たい時なんかは最適ね。
数式の前半を少し工夫するだけなので、覚えてしまいましょう!
複数範囲指定の基本
縦に結合( ; )
範囲全体を { } で括る
今回は、プロ野球チームを例に見ていきましょう。
セ・リーグとパ・リーグの成績が分かれて掲載されています。
両リーグの計12球団を、1つの表にまとめたいとします。
セ・リーグの下に続けてパ・リーグの球団が並ぶように、赤枠の範囲を縦に結合すると以下のようになります。
- 範囲全体を { } で囲む
- 縦結合の場合は範囲同士を ; で繋ぐ
列はアルファベットではなくCol(番号)で指定
これってselect句の列指定や、where句の条件指定もできるんですか?
急にガチっぽくなってきた…。
「シーオーエル」ですね。
頭の「C」は大文字で、末尾の「l」は「大文字のアイ」ではなく「小文字のエル」…っと。
これだけ聞いてもよく分からないと思うので、事例を見ていきましょう。
縦に結合した両リーグのデータベースのうち、3位以上の球団を抜き出し、打率順で並び替えると、以下のようになります。
1、2、7列目を抜き出して、ということか。
シートではなく指定した参照範囲内での列番号なんですね!
間違えそう…。
その通り!先程のシートで言うと赤枠の中ね。
従って、それぞれの範囲が同じ列数でなければ使えないの。
片方の列数が多すぎても、以下のようにエラーが出てしまうので注意してね。
- 列はアルファベットではなく「Col1,Col2,…」のように「列番号」で指定する
- シートではなく指定した参照範囲内での列番号
- それぞれの範囲が同じ列数でなければエラーになる
横に結合( , )
横結合はそれほど使う機会は多くありませんが、縦(行)の順番が変わらないのであればVLOOKUP関数やイコール参照よりも手軽なので、セットで覚えてしまいましょう。
例えば、セ・リーグ6球団の順位表がありますが、勝敗と打撃成績でデータが分かれてしまっている場合。
勝敗と打撃成績が並ぶように、赤枠の範囲を横に結合すると以下のようになります。
- 横結合の場合は範囲同士を , で繋ぐ
以下の文字列をコピーして使用して下さい。(緑文字を置き換え)
縦結合
=query({範囲始点①:範囲終点①;範囲始点②:範囲終点②},"select*")
- 範囲全体を { } で囲む
- 縦結合の場合は範囲同士を ; で繋ぐ
=query({範囲始点①:範囲終点①;範囲始点②:範囲終点②},"select Col1,Col2,Col3 where Col1<=3 order by Col2 desc")
- 列はアルファベットではなく「Col1,Col2,…」のように「列番号」で指定する
- シートではなく指定した参照範囲内での列番号
- それぞれの範囲が同じ列数でなければエラーになる
横結合
=query({範囲始点①:範囲終点①,範囲始点②:範囲終点②},"select*")
- 横結合の場合は範囲同士を , で繋ぐ
シートをまたぐ場合
セルで範囲指定
1つのスプレッドシート内であれば、同じ方法でシートまたぎの複数範囲も指定可能です。
例えば、リーグごとにシートが分かれている場合。
セ・リーグの下に続けてパ・リーグの球団が並ぶように、赤枠の範囲を縦に結合すると以下のようになります。
列で範囲指定(空欄は除外)
これまでは「$B$3:$H$9」のようにセル単位で範囲指定しましたが、それだと参照先シートに新しく行が追加された場合に反映できません。
なぜなら、数式を組んだ時点で参照する行が固定されるからです。
でもプロ野球の球団が増えるって、そうないですよね(笑)
これはあくまで例だから…。
人事業務で言うと、社員とアルバイトそれぞれの名簿をQUERY関数で結合した場合、セルで範囲指定していたら新たに入社した人が反映しなくて困るでしょ?
確かに!
データベースが蓄積されていく管理表等であれば必須ですね。
それでは、先程の数式をセル指定から列指定に変更してみます。
パ・リーグが消えた?!
スクロールしてみると、992行目にあるわね。
これは列ごと指定したことで、参照先シートの下側にある空白セルまで抽出されているの。
対応としては、空欄を除外する条件を追加すればOKよ。
空白を表す「is null」を活用し、空欄を除外する数式に修正すると、以下のようになります。
※見出し行は指定していないため、データ内容に基づいて推測される
セル指定
=query({'シート名①'!範囲始点:範囲終点;'シート名②'!範囲始点:範囲終点},"select*")
- 1つのスプレッドシート内であれば、同じ方法でシートまたぎの複数範囲も指定可能
列指定
=query({'シート名①'!$この列から:$この列まで;'シート名②'!$この列から:$この列まで},"select* where not Col1 is null")
- 列指定にすることで、参照先シートに新しく追加された行も反映可能
- 参照先シートの空白セルまで抽出されないよう「is null」を活用
- 数式は「where Col1 is not null」でも可能
スプレッドシートをまたぐ場合
最後に、別のスプレッドシートを参照して範囲指定する方法を紹介します。
ここで登場するのが、言わずと知れたIMPORTRANGE関数です。
文量が多くなってしまったので、本記事では結論だけ記載します。
詳しい解説はこちらの記事をご覧下さい。
=QUERY({IMPORTRANGE("https://●●","シート名!$この列から:$この列まで");IMPORTRANGE("https://▲▲","シート名!$この列から:$この列まで")},"select Col1,Col2,Col3 where not Col1 is null")
- 範囲指定の部分をIMPORTRANGE関数にそのまま置き換える(型は変わらない)
- 範囲全体を { } で囲む
- 縦結合の場合は範囲同士を ; で繋ぐ
以上、QUERY関数で複数範囲を結合する方法について解説しました。
ここまでマスターすれば、クラウド上のあらゆるデータを集約し、自由自在にアウトプットすることができます。
是非、日々の業務改善にお役立て下さい。