Calcにgoogle spread sheetにおける"query関数"に相当するものはあるか?

食べた食品の記録をつけていきたいです。
シート1に日付と食べた食品のデータを記述していき、シート2には食品のデータをおいておきたいと思います。シート2の食品データを後から変更したいということがあるかもしれません。

例えば、以下は卵のデータになります。

2行目が食品データで、3行目のように呼び出したいのです。
そして4行目はvlookup関数を使って呼び出したものです。
=VLOOKUP(A2,A2:D2,1)

しかし、vlookupでは問題があります。
問題1:元データ(2行目)を移動させた場合、呼び出し先の式(A4)も自動で変更されるわけではない。セル右下のつまみをA4からD4までドラッグした後、元データを移動させた場合、B4からD4の範囲でエラーが起こります。
問題2:A4に式を入力しても、query関数のようにB4からD4まで自動的に挿入されるわけではない。

この要求を満たす関数、方法はありませんか?

質問内容で理解できないでいるところも多いのですが、ひとまず把握できた範囲で。

問題1

現象再現しました。#N/Aになりますね。 vlookup関数の第2引数(行列)のセル参照(ここではA2:D2)が自動修正されてくれないようです。

どうも…バグっぽいですね(苦笑)。 vlookup関数では起こりますが、他の関数や演算子では起こらなさそうです。 いや…、第2引数以降の参照が自動修正されないのかも知れません。match関数でも似た状況が見られる気がします(2021-09-30 16:22 追記)。

「元データを移動」のやり方にもよるように見えます。 (手元ではカット&ペーストとAlt+ドラッグで確認しています。)

  • A2:D2を範囲選択して移動するとエラー
  • 2行目を行選択して移動すると問題なさそう
データが行単位で扱える場合に限られますが、2つ目の方法(行選択)で問題を回避できるかも知れません。
Bugzillaにバグ報告が上がってるかどうか、ちゃんとチェックできてません。 チラッと見た感じでは見つけられませんでした。私、情報検索が苦手で…(苦笑)。 報告がないようだと直らないですね…。

2021-09-30 22:20頃 追記

誤った回答をしてしまったようでした。申し訳ありません。
問題1の原因はバグではなく、使い方の間違いと思われます。

「=VLOOKUP(A2,A2:D2,1)」の式を「セル右下のつまみをA4からD4までドラッグ」してはいけません。
それをするには数式内のセル参照の書き方を見直す必要があります(絶対参照の適切な使用)。

その操作をした後、D4セルの数式を確認してみてください。
「=VLOOKUP(D2,D2:G2,1)」となっているのではないかと思います。
第1引数の検索基準は「A2」(「卵1個」)ではなく「D2」(「5」)になり、第2引数の行列も「A2:D2」ではなく「D2:G2」とG列まではみ出してしまっています。
これは「=VLOOKUP(A2,A2:D2,1)」のセル参照が相対参照($を含まない指定方法)となっているためで、正常な動作です。

ここで「A2:D2を範囲選択して移動」すると、vlookupの第2引数である行列「D2:G2」が途中で分断され、E2:G2が取り残されてしまいます。そのため式で指定した行列全体を移動したとは見なせなくなり、仕方がないので行列の指定は元の「D2:G2」のまま変わらない、という動作になっているようです。

更に第1引数(検索基準)の使い方の間違い(続くコメントで4つ目に指摘した件と、ここでも相対参照が関係します)が輪をかけ、結果としてエラーとなってしまっているものと思われます。

問題の解消には表計算ソフトの関数式におけるセル参照の記述方法と、vlookup関数の使い方について学ぶ必要がありそうです。

問題2のサンプルはこの辺り是正した作りにしてあるつもりです。参考にしてください。

問題2

QUERY関数の何たるかを存じ上げない私では力不足につき、ズバリの回答は他の方の登場を待ちたいと思います。

ただ、もしかして問いの主旨が「B4:D4セルは空のまま、A4セルへの数式入力だけでB4:D4セルを書き換えたい」ということなのであれば、(LibreOfficeにそういう関数があるのかどうかも知りませんが、)そういう使い方は個人的にはオススメしかねます。
表計算ソフトの一般論として、関数式はよそのセルを書き換えには行かないのが基本と思えます。同じセルを書き換える数式が複数設定されてしまうと処理が衝突しかねないので。通常の利用ではそのつもりで扱っておくのが無難ではないでしょうか。
習得したいのが汎用な「表計算ソフト」の使い方なのか、特殊機能を含んだ「個別ソフト」(GoogleスプレッドシートやLibreOffice)の使い方なのか、という話かも知れませんね。個別ソフト固有の機能を安易に使ってると、今回のように他ソフトで融通が利かず、逆に不自由するようなことが往々にして起こると思います。

一方で「A4セルの値に応じて結果の変わる数式をB4:D4に入力する」(A4とB4:D4で数式を変える)であれば、やりようはいくらもあると思います。
こんなサンプルを作ってみましたが、参考にならないでしょうか。

サンプルファイル:無題 1.ods (10.8 キロバイト)

B:D列に数式を書く必要はありますが、セル参照をきっちり作り込めばコピー&ペーストで済み、さほど手間にはならないように思えます。

やりたいことと、違ってますかね…? その辺り、質問内容を充分汲めていなくて…(汗)。

ご所望の機能(複数セルへの結果反映)を満足する代替策ではありませんけどね。
データテーブルから値を引っ張ってくる方法の例として。
(ちょっと深入りしすぎましたね…query関数を知らぬ身で。すみません。)

参考ですが。
質問の内容では、次のようなところが私には汲み取りきれず、困惑しました。

  • シート1,2の話はどこにいった? スクリーンショットはシート1?シート2?

  • スクリーンショットの3,4行目は「食品のデータ」ではなくて検索処理欄?

  • 3行目は何? 何をどう呼び出した?(2行目を単純コピーしただけに見えます)

  • A4のvlookupで検索基準がA2なのは何故?(検索基準が検索対象キー列A2:A2の中にあるのはvlookupの使い方として変に思える)

  • そもそも何故vlookupを使ってる?(参照レコードが2行目だけなのでvlookupの意味がなさそう)

もし回答の内容が的外れであるようなら、これらの点補足いただけると理解の助けになります。

回答ありがとうございます。

1に関して

バグか何かということなら、使い方を変えるしかないですね。

2に関して

query関数は範囲を指定するだけで、その範囲の数値を返してくれるものです。例えば、A4に以下のように式を記述しますと、A4からD4までを自動的に埋めてくれるものです。
=query(A2:D2)
式を1つのセルに入力すれば、それ以降のセルを埋めてくれるという関数があれば便利だなと思っています。
元データを1度設定したら二度と動かさないのが適切なのですか?まだ理由がよく理解出来ていませんが、トラブルが起こりやすいのならそうします。

補足に関して

>> シート1,2の話はどこにいった? スクリーンショットはシート1?シート2?

これに関しては、呼び出し元と呼び出し先のデータを1つの画像にまとめました。そのほうが説明しやすいかなと思ってですね。

>>スクリーンショットの3,4行目は「食品のデータ」ではなくて検索処理欄?

2行目が食品の元データ。
3行目が”このように表示したい”という例です。
4行目(A4)は以下の式を記述した結果です。
=VLOOKUP(A2,A2:D2,1)

シート1,2の話と関連しますが、1,2行目をシート2(呼び出し元)、3,4行目をシート1(呼び出し先)とみなしています。

3行目は何? 何をどう呼び出した?(2行目を単純コピーしただけに見えます)

3行目は2行目のコピペです。すみません、、、(´・ω

A4のvlookupで検索基準がA2なのは何故?(検索基準が検索対象キー列A2:A2の中にあるのはvlookupの使い方として変に思える)

これは使い方がまだ分かっていないからですね。検索基準という意味がよく分かっていません。引数2で指定した範囲内で、検索を開始する位置でしょうか。

そもそも何故vlookupを使ってる?(参照レコードが2行目だけなのでvlookupの意味がなさそう)

これは複数セルのデータを取ってくるのに良さげと考えたからです。これも理解が甘いからですね。
A2:D2などのように範囲を指定してデータを取ってきたかったのです。

よろしくおねがいします。

回答に誤りがあり、追記しました。ご確認いただければと思います。

1に関して

追記の通り、バグではなく正常動作のようです。お騒がせして申し訳ありません。
正しく使えばエラーは起こりません。

2に関して

なるほど…Googleスプレッドシートで少し試してみましたが、トリッキーな関数ですね…。
ヘルプを見た感じだとかなり難解な使い方の出来る関数に見受けられますが、教えていただいたような「=query(A2:D2)」程度であればあるいは便利に使えるのかも知れません。
ですがあくまで私見ながら、私には割と扱いの難しい関数に思えます。

元データの移動は別にやって構わないと思いますよ。
範囲の端の行や列を移動させる場合などは注意が要りますけどね(範囲が変わったりします)。
範囲の端や外に移動させる場合なども(範囲から外れてしまいます)。
移動やコピーは指定した範囲の「中」で行うのが吉です。
そのためサンプルでは値の入っているブロックの上下1行を行列範囲に含めています。
先に範囲の中で行挿入などして範囲を広げてから、移動したい行をその範囲内で移動させます。

補足に関して

補足ありがとうございます。概ね承知しました。

A4のvlookupで検索基準がA2なのは何故?(検索基準が検索対象キー列A2:A2の中にあるのはvlookupの使い方として変に思える)

検索基準は、検索キーですね。用語がいまいちかも知れませんがw。
vlookup関数は、第2引数(行列)で指定した範囲の左端列から第1引数(検索基準)に一致する値を含む行を探し、その行の第3引数(インデックス)番目の列の値を返します。
具体例は回答の問題2を参照ください。

そもそも何故vlookupを使ってる?(参照レコードが2行目だけなのでvlookupの意味がなさそう)

お気づきの通り、vlookupは複数セルのデータを取ってくる関数ではありません。
指定した範囲からの検索で特定セルの値を拾ってくる関数です。
残念ながらquery関数の代替にはならないと思います。

もしかするとLibreOfficeにも複数セルに直接結果を与えるような関数があるかも知れませんが、不勉強で私は存じ上げません…。
ちょっと見たところではBugzillaにもquery関数の実装要望は見られなさそうです(これまた節穴かも知れませんが…)。
どうやらMS Excelにもないようですね。現状ではGoogleスプレッドシート固有の機能でしょうか。
回答で述べた通り、表計算ソフトの基本は「各セルに数式を書く」、かと。
今後の動向は分かりませんが。

回答ありがとうございます。
この他に範囲を作成したりしてみましたが、なかなかうまくいかず、、、。

各セルに式を書くとしたら、何の関数が適切なのですか?
この場合はvlookupで良いのでしょうか?

えっと…

シート1に日付と食べた食品のデータを記述していき、シート2には食品のデータをおいておきたいと思います。

シート1に記述した「食べた食品」の品名をキーにして、シート2に列挙された食品データを検索・引用したい

という意味なのであれば、使う関数はvlookupでいいと思います。
その場合のサンプルが回答2で示したものです(ファイル添付あり)。これがbgegg2dさんの目的と合ってるかどうか、と言うところなのですが…。ご確認いただければと思います。


「範囲の作成」などはかなり高度な使い方になります。私自身習得できていません(苦笑)。普段ちょっと表計算ソフトを使う分には触れる必要のない機能なので。
その辺りを模索する前に、セル参照(絶対参照・相対参照)など、まずは関数の基本を身につけることが先決と思えます。
vlookupはやや難易度が高い複合的な機能の関数なので、より単機能でシンプルなmatchやoffsetを組み合わせることから模索するのもいいかも知れません。式の構造が少々複雑になりますが、より基礎的な考え方を学びつつ、vlookupと同様の機能を実装することが出来ると思います。

もしオンタイムでの相談をご希望なら、Telegramチャット(Telegram LibreOffice-JA)など覗いてみるといいかも知れません。
ま、常に人がいるわけでも必ず親切に助言を受けられるわけでもないですが(苦笑)。雑多ですし。

1 Like

ありがとうございました。
match関数と、頂いたサンプルを試してみます。

わからないことがあれば後日また質問するかもしれません。

1 Like

bgegg2dさんのニーズを充分理解できていない中、深入りし過ぎで余計なこととは思いますが、現状のこちらの理解の状況をお示しする程度の意味で、サンプルをでっち上げてみました。気が向けば参考としてご笑納ください。

無題 5.ods (15.8 キロバイト)

MATCH関数と、OFFSET関数ではなく代わりにINDEX関数を使っています。こちらの方がシンプルっぽいので。
VLOOKUP関数は内部で似たような処理をしているのだと思います。一足飛ばしなので、便利な反面やや難易度が上がります。

回答遅れました。サンプルを試させていただきます。
ありがとうございました。

今更のリプライになります。
どうやら私の不勉強であったようで、 bgegg2dさんがquery関数でお求めであったようなことは、LibreOffice Calcでも可能であることをその後このフォーラムで知りました。

「行列式」という機能が使えるようです。
https://help.libreoffice.org/7.3/ja/text/scalc/01/04060107.html

「=query(A2:D2)」に相当することを実現するには、数式バー(ないしセル編集モード)で「=A2:D2」と入力し、「Enter」の代わりに「Ctrl+Shift+Enter」で決定します(関数ウィザードでは「行列」チェックボックスをチェックして「OK」します)。
これで、1セルへの数式入力で複数セルに値を得ることができます。
VLOOKUP()でも応用可能です(列方向にも行方向にも応用可能です)。
詳しくはヘルプを参照下さい。
一応、サンプルを添付しておきます。
無題 6.ods (22.4 KB)(行ごとに行列式に)
無題 7.ods (19.5 KB)(複数行まとめて行列式に)

私は次のトピックで学びました。ご参考まで。

excelで動く数式がcalcでERROR 代替の方法はないでしょうか

(個人的にはあんまりオススメしたくない使い方ですが…、今はもうそんな時代じゃないのかも知れませんね…。)