3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

QUERY関数の条件が空白セルでもエラーにしない方法

Last updated at Posted at 2023-03-14

はじめに

A~C列の元データに対して、D列の条件を指定し抽出した結果をE~G列に参照します。
image.png

このとき、D列の条件「天気」「気温最高値」「気温最低値」のうち、
「天気」と「気温最低値」だけで条件を設定したいとき、
条件を指定しなくていい「気温最高値」を空白にするとエラーになってしまいます。
そこで、どの条件が空白になってもエラーにならないような方法を考えました。

これがエラーにならないようにしたい

image.png

E1セルの数式(エラーになる)

=QUERY(A1:C,
"select A, B, C where B = '"&D2&"'
and C <= "&D4&"
and C >= "&D6&"",1)

※セル参照"&D4&"するときにセルを"&&"で囲む理由は過去の記事で説明しています。

完成イメージ

image.png

E1セルの数式

=QUERY(A1:C,
"select A, B, C where  B = '"&D2&"'
"&IF(D4="","","and C <= "&D4&"")
&IF(D6="","","and C >= "&D6&"")&"
",1)

今回はB列「天気」の条件が必ず設定されるという前提で、
C列「気温最高値」と「気温最低値」が空欄になる可能性を考慮します。
以下順番に説明していきます。

条件にIFで分岐を入れる

D4セルが空白だったら、空を設定、それ以外の時はC列の気温がD4セルの値よりも低い気温のデータを抽出する、IF文を作成します。

まずは、D4セルが空白のときは、空を設定する式を作成します。

IF(D4="","",〇〇)

次に、空白以外のとき(〇〇部分)にC列<=D4セルのデータを抽出する条件を設定します。
C列<=D4セルの条件はC <= "&D4&"ですが、

B列「天気」の条件が必ず設定される

ため、条件をandでつなげます。(直前に条件が必ず存在するので先頭にandをつける)

and C <= "&D4&"

さらに、and C <= "&D4&"はQUERY関数用の式なので、外側を「"」で囲みます。
"and C <= "&D4&""を一番最初に作成したIF文の〇〇部分に代入すると以下のようになります。

IF(D4="","","and C <= "&D4&"")

この作成したIF文の前後の他の条件も入れるため、「&」で繋げます。

&IF(D4="","","and C <= "&D4&"")&

D6セルの「最低気温値」についても条件を作成し、&でつなげます。

&IF(D4="","","and C <= "&D4&"")
&IF(D6="","","and C >= "&D6&"")&

QUERY関数の中に組み込みます。

=QUERY(A1:C,
"select A, B, C where  B = '"&D2&"'
"&IF(D4="","","and C <= "&D4&"")
&IF(D6="","","and C >= "&D6&"")&"
",1)

※組み込むときに、外側の「&」を「"」で囲んであげます。
理屈はセル参照"&D4&"と同じです。

=QUERY(A1:C,
"select A, B, C where B = '"&D2&"'
"&IF(D4="","","and C <= "&D4&"")
&IF(D6="","","and C >= "&D6&"")&"
",1)

完成です。
「最低気温値」「最高気温値」どちらを空白にしても、エラーにならなくなりました。
ちなみに、どっちも空白にしても「天気」の条件が入っている限りエラーになりません。
image.png

無題.png

補足:すべての条件が空白セルのときの対応方法

今回のように、必ず設定される条件が1つでもあるときは上記のような対応で問題ないのですが、すべての条件に対して、空白セルの判定を行いたいときは、少し工夫が必要になります。

たとえば、D2セル「天気」の条件も空白セルになることを考慮した場合、以下のような式を作成したとします。

=QUERY(A1:C,
"select A, B, C where 
"&IF(D2="",""," B = '"&D2&"'")
&IF(D4="","","and C <= "&D4&"")
&IF(D6="","","and C >= "&D6&"")&"
",1)

これだと、D2セルが空白かつD4セルが空白のとき、式が

=QUERY(A1:C,"select A, B, C where and C >= "&D6&"",1)

となり、andでつなげる前の条件がないので、エラーになります。

image.png

解決するためには

where句の直後に必ず存在する条件を入力します。
例えば、1=1'a'='a'です。
加えて、「天気」の条件の頭にもandをつけます。

=QUERY(A1:C,
"select A, B, C where 1=1
"&IF(D2="","","and B = '"&D2&"'")
&IF(D4="","","and C <= "&D4&"")
&IF(D6="","","and C >= "&D6&"")&"
",1)

image.png

どの条件のセルを空白にしてもエラーが起きなくなりました。
ちなみに、すべての条件を空白にすると、元データがそのまま反映されます。
image.png

おわりに

QUERY関数のwhere句の条件を柔軟に対応できるようにしたいと思いましたが、IF文などの数式と組み合わせている記事があまりなく、調べるときに大変だったので、自分なりにまとめました。

参考記事

スプレッドシートでフィルタ機能を使わずに絞り込みを行う

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?