[[20200523184742]] 『特定の文字の記載された項目の抽出』(ショシンシャ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『特定の文字の記載された項目の抽出』(ショシンシャ)

空白も含まれる表中から特定の記号を探しその項目(日付等)を表示したいと思います。
その際に使った関数について疑問がわいたので質問をさせてください。

作りたい関数の目的条件:
条件1_下表のB列に行内の最も左にある特定記号の日付を取得したい。
条件2_下表のC列に行内の最も右にある特定記号の日付を取得したい。

作成表のイメージ:
_A___B___C___D___E___F___G____
1|記号 |開始 |終了 |5月1日|5月2日|5月3日|5月4日|
2|〇  |5月2日|5月3日|   |〇  |〇  |   | 
3|◇  |5月4日|5月4日|◆  |   |◆  |◇  |
4|▼  |5月1日|5月4日|▼  |△  |〇  |▼  |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

作成した関数:
B2セルに下記を入れてみたところうまくいきました。
=IFERROR(INDEX($D$1:$G$4,1,MATCH($A2,$D2:$G2,0)),"-")

次にC2の関数をindexやmatchなど色々検索してみましたが、うまくいかず。
似たような質問で使われていたものを流用して、下記のようにしたところ目的は達成できました。
=IF(COUNTIF($D2:$G2,$A2)=0,"-",LOOKUP(1,0/($D2:$G2=$A2),$D$1:$G$1))

質問:
質問1_indexやmatch関数でも同じように条件2の日付をC列に表示することはできますか?
質問2_上記に出てくるLOOKUPで使われている、検索値1の意味
質問3_上記に出てくるLOOKUPで使われている、検索範囲0/(D2:G2=A2)の意味
※検索範囲にゼロ/(検索範囲=検索値)???さっぱりわかりません。

以上の3つです。よろしくお願いします。

< 使用 Excel:Office365、使用 OS:Windows10 >


 Office365では、そう言う凝った数式は使わなくて済むようになりました。

 けど、知的好奇心もあるでしょうから、その解説は他の回答者にお任せするとして、、

 B2セル =IF(A2="","",XLOOKUP(A2,D2:G2,D$1:G$1,"",0,{1,-1}))

 下にコピー

 ※C列は勝手にスピルしますので、入力不要です。

 <結果図>
  行  __A__  ___B___  ___C___  ___D___  __ E __  __ F __  ___G___
   1  記号   開始     終了     5月1日   5月2日   5月3日   5月4日 
   2  〇     5月2日   5月3日            〇       〇              
   3  ◇     5月4日   5月4日   ◆                ◆       ◇     
   4  ▼     5月1日   5月4日   ▼       △       〇       ▼     

(半平太) 2020/05/23(土) 21:56


Xlookupすごいですね一気に解決しました。
ありがとうございました!!

もし可能であればどなたか質問の回答をいただけると大変うれしいです。
(ショシンシャ) 2020/05/24(日) 11:30


 まず。LOOKUPとよー似た処理する関数含めて。

 LOOKUP          ・・・ 検索値を範囲から昇順でみて検索(二分探索、バイナリサーチ)

 VLOOKUP/HLOOKUP ・・・ 検索値を範囲から検索
                          ・第4引数がTRUEなら二分探索
                          ・第4引数がFALSEならリニアサーチ(線形探索)

 MATCH           ・・・ 検索値を範囲から検索
                          ・第3引数が1、-1なら二分探索(1は昇順、-1は降順)
                          ・第3引数が0ならリニアサーチ(線形探索)

 探索にはバイナリサーチとリニアサーチがあります。んで、LOOKUPはバイナリサーチ処理のみっす。
 ※バイナリサーチ(二分探索)の説明はネットで検索してちょ。
 んでバイナリサーチの処理は、検索値が範囲の最大値データより大きかったら結局範囲の
 最終値のデータを返しますわ。

 バイナリサーチ ・・・ 検索値が10 、 範囲が{0,1,2,3,4,5} なら  5を返す。
 リニアサーチ   ・・・ 検索値が10 、 範囲が{0,1,2,3,4,5} なら  エラー(絶対値探索なので)

 この特性を使って処理してま。 

 LOOKUP(1,0/($D2:$G2=$A2),$D$1:$G$1)) 

 (1) D2〜G2セルがA2と同じか? → TRUEとFALSEで結果が返る
 (2) 0 ÷ (1)の結果を計算する ・・・ TRUEは「1」 FALSEは「0」で処理されるので、0÷1 と 0÷0の結果が範囲となる → 0とエラーの範囲(配列)
 (3) その範囲から「1」をバイナリサーチする ・・・ エラーは無視される。1は0より大きいので、0がある最終位置のデータが返る。
 (4) その位置と同じ位置のデータをD1:G1より返す。
(GobGob) 2020/05/25(月) 08:45

返信おそくなりスイマセン。
大変勉強になりました!!
ありがとうございました。
(ショシンシャ) 2020/06/04(木) 08:56

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.