【解消】質問投稿時のカテゴリ選択の不具合について

エクセルでA1を参照してその文字列が予定というシートの6行目と部分一致すればその列の1行目の値を返したいのですが、

=IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A1, 予定!$6:$6)), 0)), "")

だとうまくいくのですが、6行目から9行目を参照させたい場合

=IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A1, 予定!$6:$9)), 0)), "")

としたのですが、うまくいきません。

どのようにすれば6行目から9行目を参照させる事が出来ますでしょうか。

A 回答 (3件)

>あまりに冗長すぎる気がします


プログラマーとしては「勝てば官軍」なんですよ。動かないプログラムはゴミ以下ですが、とりあえず動くプログラムは使い物になります。あとは高速化ができればいいのですが。
私もながーいプログラムを書いて先輩に「長いね」とよく言われました。
    • good
    • 0

こんばんは



従来のSEARCH関数だとご提示の内容ではうまく行かないと思いますので、多分スピル機能が使えるバージョン(=Office365等)をご利用と推測しました。

そうであるなら、各列ごとに該当が存在するかをチェックするようにすれば良いので、
=INDEX(予定!1:1,INDEX(FILTER(COLUMN(1:1),ISNUMBER(BYCOL(予定!6:9,LAMBDA(a,MATCH("*"&A1&"*",a,0)))),""),1))
のような関数式で求められると思います。

※ 上式では複数列に該当するものが存在する場合には、最初の列の1行目を返します。
(全部を抽出することも可能ですが、その場合には「INDEX(~~,1)」で最初の列だけを取り出しているのを止めれば良いです。)

※ 該当が存在しない場合には、上式は#VALUE!エラーを返します。
 エラー値を表示したくなければ、IFERRORなどを加えてください。
    • good
    • 0

こういう質問は得意なのですが、歳を取って長文が面倒なので ChatGPTに丸投げしました。

以下はその回答です。

エクセルの MATCH 関数では、列全体の中から検索条件に合う行を見つけ出すのが基本です。しかし、SEARCH 関数を複数行に対して使用しようとすると、配列の扱いに注意する必要があります。
直接的な解決方法は、6行目から9行目の範囲を SEARCH 関数に与えた場合、それが縦方向の範囲であることを明示することです。この場合、MATCH の中で TRUE を見つけ出すために、範囲全体を評価して検索する工夫が必要です。

以下のように、TEXTJOIN や INDEX を使って解決できます:

修正版の数式
=IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A1, TEXTJOIN("",,予定!$6:$9))), 0)), "")

解説
1. TEXTJOIN を使う理由
TEXTJOIN("",,予定!$6:$9) により、6行目から9行目のデータを1つの文字列として結合しています。この文字列に対して SEARCH を適用することで、複数行にまたがる部分一致の評価が可能になります。

2. ISNUMBER と SEARCH の組み合わせ
SEARCH(A1, TEXTJOIN("",,予定!$6:$9)) は、A1 の内容が結合された文字列のどこかに部分一致するかをチェックします。

3. INDEX と MATCH の活用
MATCH によって、条件が一致した場合にその列の位置を取得し、INDEX によって対応する1行目の値を返します。

注意点
・この方法では、TEXTJOIN を使って範囲を結合しているため、結合された文字列の長さが長すぎる場合(例えば、非常に多くのセルに長い文字列がある場合)、エラーが出る可能性があります。その場合は別の方法(VBAなど)を検討してください。
・予定!$6:$9 のデータが非常に大きい場合、この数式の計算速度に影響が出ることもあります。
もしうまく動作しない場合や追加の条件があればお知らせください!
    • good
    • 0
この回答へのお礼

ありがとうございます。
僕もChatGPTに聞いて頑張ってみたのですが、ご提示の方法でもうまくいきませんでした。
いろいろと質問の仕方を変えて試してみたところ、下記の方法では望んだ結果が得られたのですが、あまりに冗長すぎる気がします...

=IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A2, 予定!$6:$6)), 0)),
IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A2, 予定!$7:$7)), 0)),
IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A2, 予定!$8:$8)), 0)),
IFERROR(INDEX(予定!$1:$1, MATCH(TRUE, ISNUMBER(SEARCH(A2, 予定!$9:$9)), 0)),
"Not Found"))))

お礼日時:2025/01/22 17:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A