皆さんは「QUERY」というスプレッドシート関数を聞いたことはありますか?
私はIT企業で人事をしているのですが、正直コレを使い始めてから月10時間ほど削減できました。
人事業務でいうと、必要な行(従業員)と列(項目)だけを瞬時に抽出して、リスト作成や分析ができるスグレモノです。
「そんな便利な関数、初耳だ!」という方には是非使って頂きたいのですが、トップ画像のサ●ヤ人のように
selectとかwhereとか何なん?!
なぜエラー?!?!
と発狂しながらPCを閉じてしまう未来が、残念ながら見えています。
そうならぬよう、本記事ではQUERY関数を「体系的に」「事例と図解も交えながら」「日本語で(笑)」解説していきます。
ITリテラシー皆無の新任人事担当がルーティン業務に忙殺されているシーンからスタートしますので、是非ご覧下さい。
毎日スプレッドシートの更新作業ばかりでしんどいです。
人事担当者は、ルーティンワークよりもっと脳に汗かく仕事に集中するべきよ。
ちなみにどんな作業をしているの?
えっと、従業員情報をシステムから落として、それをスプレッドシートで雇用形態ごとにフィルターして、不要な行は削除して…
うんうん、なるほど。
そんなこと毎日やっていたら、定時で帰れないのも当然ね。
あれこれ考えず、まずはQUERY関数を覚えるといいわ。
QUERY関数の基本
「●●の人たちだけを抜き出して▲▲と■■の項目だけ持ってきたい!」
そんな時に便利なのがQUERY関数です。
(スプレッドシート限定のため、Excelでは使用できません)
データベースの中から正社員の従業員番号と名前だけ持ってきたい時とか、よくあります!
QUERYなら従業員リストの作成くらいお手の物ね。
1つの条件で抽出(〜と一致するもの)
実際の活用方法について見ていきましょう。
まずは、最も基本的な単一条件による抽出です。
読売ジャイアンツの2020年データで解説していきます。
例えば、この中から「投手」だけを抜き出し、項目を守備・選手名・年俸(推定)の順番で並べたい時。
真っ先に思いつくのは以下の手順かと思います。
- 守備が「投手」以外の行をフィルター・削除する
- 選手名と守備の列を入れ替える(切り取り・貼り付け)
- 使用しない列を削除する
これじゃいけないんですか?
条件を変えたり他の項目を追加したくなったら、また同じ作業を繰り返さないといけないでしょ?
元データの情報が更新された時も、全てやり直しというのは非効率的じゃない?
確かに…!
早くQUERYってやつを教えて下さい!
QUERY関数を使用すると、以下のようになります。
僕が知ってる関数(VLOOKUPとか)と何か違う…。
左上の1箇所しか入力してないし、なんか変な感じ。
でもたったこれだけで作業終了ですか?!
これがQUERY関数の最も基本的な使い方よ。
まずは型を覚えて、たくさん使って慣れること!
QUERY関数の構成を箱で表現すると、以下のようになります。
- 式の前半では「どこから」という「参照範囲」を指定
- select句で成り立つ後半では、その範囲から「何を」取ってくるか「列」を指定
- where句では、その列を「どのように」取ってくるか「行」を指定
以下の文字列をコピーして、早速使ってみましょう。(緑文字を置き換え)
=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where 検索列='検索条件'",見出し行番号)
- 前半の赤下線部分で参照先を指定
- シートとセルの範囲を指定するだけ(VLOOKUP等と同様)
- 後半の黄下線部分で条件を指定
- selectは列指定
- 「▲▲と■■の項目だけ持ってきたい!」
- 今回のケースでは、[D列]守備・[C列]選手名・[M列]年俸(推定)
- 列は指定した順番で抽出される(前後してもOK)
- 今回のケースでは、[D列]守備・[C列]選手名・[M列]年俸(推定)
- select*にすると、前半の赤下線部分で指定した全ての列を抽出できる
- 始まりと終わりに「"(ダブルコーテーション)」をつける 忘れがち!
- 「▲▲と■■の項目だけ持ってきたい!」
- whereは行指定
- 「●●の人たちだけを抜き出したい!」
- 今回のケースでは、[D列]守備=投手
- 検索条件(文字)の始まりと終わりに「'(シングルコーテーション)」をつける 忘れがち!
- 「●●の人たちだけを抜き出したい!」
- selectは列指定
- 見出し行番号は省略可
- 参照先データの内容に基づいて推測される
- 先程の「投手」を抽出した例では、見出し行番号は「2」になるが、基本的には省略しても問題ない
- 参照先データの内容に基づいて推測される
否定形による抽出(〜以外のもの全て)
先程とは反対に、「野手(投手以外)」だけを抜き出し、項目を守備・選手名・年俸(推定)の順番で並べたい時。
方法は2種類あるので、それぞれ紹介します。
「<>(不等号)」を使用する場合
これはそのまま置き換えるだけですね!
等号(=)・不等号(<>)の関係性は数式内でも変わらないわ。
それより、もう一つの方がQUERYの様々な応用に使えるので覚えてちょうだい。
「not(文否定)」を使用する場合
ヒィーーー!
英語ムリィーーー!!
いやいや、中学1年生レベルよ!(というか関数ってそういうものだから…)
notが前につくと、後ろの文を否定することになるの。
D列(守備)が「投手」と一致(=)していない、という意味だから、不等号(<>)を使用した場合と同じ結果になるわね。
「<>(不等号)」を使用する場合
=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where 検索列①<>'検索条件①'")
「not(文否定)」を使用する場合
=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where not 検索列①='検索条件①'")
よくあるエラー事例(形式にうるさい関数)
「#VALUE!」の対処法
何度試しても「#VALUE!」となってしまい、もう挫けそうです…。
おそらく半角スペースやシングルコーテーション、ダブルコーテーションが抜けていることが原因ね。
あとはカンマの使い方も確認してみて。
便利である反面、形式にうるさい関数なので、何度も使って覚えていきましょう。
よくあるエラー事例を以下に掲載しているので、どのパターンか(どこに原因があるか)確認して、改善にお役立て下さい。
「#REF!」の対処法
今度は「#REF!」というエラーが出てしまい、もう帰りたいです。
大したことじゃないわ。
その入力したセルの下とかに、何か値は入ってない?
あ、前に作業していたものが残っていました。
そして消したらエラー解決しました!
上表のように、関数を入力したセルと同じ列(右方向)または行(下方向)に値が入っているとエラーになるため、事前にシートを全選択・消去しておくと安心です。
今回は、QUERY関数の基本について解説しました。
「形式にうるさい関数」であるため、見様見真似で使おうとしても、エラー解決できないまま嫌になってしまうこともあります。
まずは構造を体系的にインプットしてから、ひとつずつ覚えていきましょう。
次の記事では、より実務的な内容として、ターゲットが明確で更に絞り込みたい時の「複数条件」と、逆に不明確でキーワード抽出したい時の「部分一致」について解説します。