Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11全般 : Microsoft 365)
vlookupでのワイルドカードの使い方を教えてください
投稿日時: 23/06/01 18:44:18
投稿者: シャオT

北海道ですと1,青森ですと2なのですが,
特定の住所(北海道の奥尻郡だと10,樺戸郡だと11・・・)の様な全国の都道府県リストがあります.
 
■sheet1
 
    A     B
1    北海道      1
2    北海道奥尻郡    10
3    北海道樺戸郡    11
4    北海道利尻郡    20
 
 
 
 
sheet2には,番地までの細かい住所まで入力されているリストがあります.
 
■sheet2
 
    A     B
1    北海道札幌市中央区北1条西1-1-1     1
2    北海道奥尻郡奥尻町奥尻1-1-1     10
 
sheet2のB列に,sheet1のC列の番号を引っ張ってきたく,
vlookup関数で前方一致で出来るかと思い以下を試したのですが
ワイルドカードを理解できておらずうまくいきません.
 
=VLOOKUP(A1&"*",Sheet1!A:B,2,FALSE)
 
よろしくお願いします

回答
投稿日時: 23/06/01 19:28:09
投稿者: んなっと

なるべく一致する文字数が多いものを探すという意味でしたら、
 
Sheet2のB1
=LET(a,Sheet1!A1:A500,b,TAKE(a,COUNTA(a)),c,A1:A500,
BYROW(TAKE(c,COUNTA(c)),LAMBDA(r,
  LET(d,FILTER(OFFSET(b,,,,2),ISNUMBER(FIND(b,r))*LEN(b)),
         IFERROR(INDEX(SORTBY(d,LEN(TAKE(d,,1)),-1),1,2),"")))))

回答
投稿日時: 23/06/02 05:48:50
投稿者: んなっと

一致したもののうち、なるべく下の方を返したいなら
 
=LET(a,Sheet1!A1:A500,b,TAKE(a,COUNTA(a)),c,A1:A500,
BYROW(TAKE(c,COUNTA(c)),LAMBDA(r,
XLOOKUP(1,ISNUMBER(FIND(b,r))*(LEN(b)>0),OFFSET(b,,1),"",,-1))))

回答
投稿日時: 23/06/02 06:10:07
投稿者: んなっと

式を短くしたいなら
 
=LET(a,Sheet1!A1:A500,XLOOKUP(1,ISNUMBER(FIND(a,A1))*(LEN(a)>0),OFFSET(a,,1),"",,-1))
下方向・↓

投稿日時: 23/06/02 09:06:27
投稿者: シャオT

んなっとさん
多数ご教示くださいましてどうもありがとうございました.
LAMBDA関数は難し過ぎて私には理解不能でしたので,三番目の短い式を使わせていただこうと思います.
 
お時間ございましたら質問してもよろしいでしょうか.
 
@ LET(a ← この a は,sheet1のA列の対象範囲に名前を付けているのでしょうか
 
A XLOOKUP(1 ←この 1ですが,どのデータなのか列を入れる部分かと思っていましたが,ここの 1がわかりません.

回答
投稿日時: 23/06/02 09:47:40
投稿者: んなっと

$を付け忘れたので、修正。
=LET(a,Sheet1!A$1:A$500,XLOOKUP(1,ISNUMBER(FIND(a,A1))*(LEN(a)>0),OFFSET(a,,1),"",,-1))
 
【解説・上から目線バージョン】
ISNUMBER(FIND(Sheet1!A$1:A$4,A1))でSheet1!A$1:A$4の文字列が含まれていればTRUE,いなければFALSEになるぞ。
 
第1形態 赤字部分がTRUEになる行を下から探すよ。
=XLOOKUP(TRUE,ISNUMBER(FIND(Sheet1!A$1:A$4,A1)),Sheet1!B$1:B$4,"",,-1)
 
 
TRUE,FLASEにかけ算などをすると、それぞれ数字の1,0とみなされるぞ。
だから1*ISNUMBER(FIND(Sheet1!A$1:A$4,A1))1*1まはた1*0だから、結果は10のどちらかになるぞ。
 
第2形態 赤字部分が1になる行を下から探すよ。
=XLOOKUP(1,1*ISNUMBER(FIND(Sheet1!A$1:A$4,A1)),Sheet1!B$1:B$4,"",,-1)
 
 
●A$4をA$500などに変えると失敗する。これは、範囲を広めにとったら「空白行」が紛れ込んできたからだ。
そこでLEN(Sheet1!A$1:A$500)>0を条件に追加しよう。これもかけ算にして追加すればTRUE1に変わるぞ。
 
第3形態 赤字部分が1*11になる行を探すよ。
=XLOOKUP(1,ISNUMBER(FIND(Sheet1!A$1:A$500,A1))*(LEN(Sheet1!A$1:A$500)>0),Sheet1!B$1:B$500,"",,-1)
 
 
●Sheet1!A$1:A$500が変更になったら、式を3か所修正しなければならない。LETで定義すれば1か所にまとめられるぞ。
 
最終形態だよ
=LET(a,Sheet1!A$1:A$500,XLOOKUP(1,ISNUMBER(FIND(a,A1))*(LEN(a)>0),OFFSET(a,,1),"",,-1))
 
...どう?イラっとした?

投稿日時: 23/06/02 13:27:12
投稿者: シャオT

んなっとさん
 
どうもありがとうございます.
イラっとはしません(笑)
感謝感謝です.
これから一つずつ,ご説明くださいました内容を追っていきます.

投稿日時: 23/06/06 16:03:15
投稿者: シャオT

んなっとさん
お時間かかってしまいました.
読み込み元シートのデータを変更してTRUE/FALSEになる動きを確認しました.
また,第2形態,第1形態で1になる行を探す動きがやっと理解できました.
本番データで,期待通りの動きが確認できています.
LET関数は既存の式でも書き換えが出来そうなのでいろいろ試しています.
 
どうもありがとうございました.