• ベストアンサー

EXCEL 部分一致でLookup 条件が増えてしまいました

お世話になります。 先日、こちらの質問をさせていただいた者です。 EXCEL 部分一致でLookup http://oshiete1.goo.ne.jp/qa5552745.html 同じようなエクセルの処理なのですが、 さらに条件が増えたものが登場し困っております。 以下のような形式になっています。 Sheet1 (☆に値段を入れたい)   機種名 値段 1 A5     ☆ 2 AA23SS   ☆ 3 ABB101   ☆ 4 A56DAB   ☆ 5 BA1234   ☆ ・ ・ ・ (以下数千行) Sheet2 (値段表のマスターデータ、ソート済)   機種名 値段 1 A5   1000 2 A56D  2000 3 AA23  3000 4 ABB101 4000 5 B1234 5000 ・ ・ ・ 【望む結果】 Sheet1   機種名 値段 1 A5    1000 2 AA23SS  3000 3 ABB101  4000 4 A56DAB  2000 5 BA1234  5000 ・ ・ ・ 数字の後にアルファベットが付くものは派生機種です。 (上記Sheet1の「AA23『SS』」「A56D『AB』」のようなもの) 数字の前が「アルファベット1文字+ハイフン」だった場合は、先日ご回答いただいた B2~ =VLOOKUP(MID(A2,1,MATCH(TRUE,INDEX(ISERROR(MID(A2,ROW($A$1:$A$10)+2,1)*1),,),0)+1),Sheet2!A:B,2,0) で解決したのですが、今回は ・数字の前のアルファベットが1~3文字(ハイフンは無し) ・派生機種でなくとも、後ろにアルファベットがついている場合がある と、さらにややこしいものになってしまいました。 なお、派生記号に関してはアルファベットのみとなっています。 当方EXCEL2003を使用しておりますので、関数のネスト制限の問題もあり途方に暮れています。 どなたか知恵をお貸しいただけませんでしょうか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

参考程度に。 =INDEX(Sheet2!B:B,LOOKUP(10000,MATCH(MID(A2,1,ROW($A$1:$A$6)),Sheet2!A:A,0))) こんな感じの関数で参照する事は可能です。 ※『10000』...はマスタデータの最大行数より多く設定する必要があります。 ※『ROW($A$1:$A$6)』...の範囲行数(6)はマスタデータの最大文字数より多く設定する必要があります。 ...ですが、マスタデータが数千件で、参照データも数千件あるとなると、重くて使い物にならないと思われます。 Sheet1に入力する派生機種とは、いわゆる付加データでしょうから、マスタのkeyである文字列とは別の列に入力するなど、 データの持たせ方を見直したほうが良いです。 数千件ものデータを関数で部分一致させるのはちょっと無理があります。

k8-stk
質問者

お礼

ありがとうございます! 望んでいた結果が出ました! データは他者が作ったものなので、どうにもなりませんでした。 確かに重くはなりましたが、再計算を手動にするとなんとか使えました。 本当にありがとうございました。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! お役に立てるかどうか判りませんが・・・ 考え方として、Sheet1・2共に数字のみを拾い出し、それを参照して値段を表示させてみるようにしてみました。 尚、この場合、機種名の列にA5 B5というように数値のみを表示させた場合同じ物があると使えないと思いますので、 とりあえず、数値のみの重複はないものとしています。 ↓の画像のようにSheet1・2共に作業用の列を使わせてもらっています。 Sheet1開いたまま、Ctrlキーを押しながらSheet2のSheetタブをクリックします。 これでSheetのグループ化ができましたので、Sheet1の作業列C2セルに 数式を入力するとSheet2も同じ数式が入ります。 配列数式になってしまいますので Shift+Ctrl+Enterキーで確定してください。 C2セルに =IF(A2="","",MID(A2,MATCH(TRUE,ISNUMBER(MID(A2,ROW($A$1:$A$20),1)*1),0),COUNT(MID(A2,ROW($A$1:$A$20),1)*1))) としてShift+Ctrl+Enterキーで確定です。 (A列のセル内が20文字まで対応できるようにしています) これをオートフィルで下へずぃ~~~!っとコピーします。 C列は数値のみの表示になりますので、この数値を参照します。 B2セルに =IF(C2="","",INDEX(Sheet2!$B$2:$B$1000,MATCH(C2,Sheet2!$C$2:$C$1000,0))) (配列数式ではありません!) としてフィルハンドルでダブルクリック、またはオートフィルで下へコピーしてみてください。 以上、長々と書きましたが 参考になれば幸いです。 しかし、最初に書いたように数値だけの参照では 希望通りにならなかったら読み流してくださいね。m(__)m

k8-stk
質問者

お礼

わざわざ画像までご用意いただきありがとうございます! ですが、今回は数値の重複がありましたので使えませんでした。 私の説明不足だったようで申し訳ございません。 同様のケースがあった場合にはぜひ利用させていただきたいと思います。 本当にありがとうございました。

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.1

こんにちは。 ユーザー定義関数を使用したほうが簡単かと思います。 以下を標準モジュールに追記してください。 Option Explicit Function NVLOOKUP(Str As String) Dim I As Integer For I = Len(Str) To 1 Step -1 NVLOOKUP = Application.VLookup(Left(Str, I), Range("Sheet2!A1:B5").Value, 2, False) If IsError(NVLOOKUP) = False Then Exit For Next I End Function Sheet1のB1に =NVLOOKUP(A1) にして、以降コピーで良いです。 これで結果が出ると思います。 動作の説明ですが ユーザー定義関数NVLOOKUPの中で引数をVLOOKUPしています。 ただし、引数をLEFTを使い一文字づつ減らして検索します。 VLOOKUPの戻り値がエラーでなければそのときのVLOOKUPの戻り値が返されます。

k8-stk
質問者

お礼

ご回答ありがとうございます! VBAはあまりわからないので勉強になりました。 試してみましたが、なぜか上手くいかない箇所がありました。 私のやり方がまずかったのかもしれませんが、今回はend-u様の方法を使わせていただきました。 VBAも学んでいきたいと思います。 本当にありがとうございました。

関連するQ&A

  • EXCEL 部分一致でLookup

    お世話になります。 エクセルで悩んでいます。 Sheet2(値段表マスターデータ)を参考に、 Sheet1へ機種の値段を入力していきたいと思っています。 以下のような形式になっています。 Sheet1 (☆に値段を入れたい)   機種名 値段 1 A-5    ☆ 2 A-23SS   ☆ 3 A-101   ☆ 4 A-56ABC  ☆ 5 B-1234   ☆ ・ ・ ・ Sheet2 (値段表のマスターデータ)   機種名 値段 1 A-5 1000 2 A-23 2000 3 A-56 3000 4 A-101 4000 5 B-1234 5000 ・ ・ ・ (以下数千行) 【望む結果】 Sheet1   機種名 値段 1 A-5    1000 2 A-23SS   2000 3 A-101   4000 4 A-56ABC  3000 5 B-1234   5000 ・ ・ ・ VLOOKUP関数で処理できるかと思ったのですが、 派生機種などがあり、後ろに違うアルファベットがついたりするので不可能でした。  (上記Sheet1の「A-23SS」「A-56ABC」のようなもの) Sheet2を参考に、「A-5」「A-56」などをちゃんと区別して 結果を出すことは可能でしょうか。 よろしくお願いします。

  • 条件に合ったデータを抜き出す

      A   B   C   D 1 あ   AA   VV   FF 2 い   CC   FF   HH 3 あ   SS   FF   DD 4 う   SS   EE   AA 以上のようなデータが有るときに、別シートに A列のデータを条件に以下のように抜き出したいのです。 別シートの各セルに式が入っていて、上記データを 変更しても別シートの抽出結果が自動で変わるようにしたいです。 ”あ”の抽出   あ   AA   VV   FF   あ   SS   FF   DD ”い”の抽出   い   CC   FF   HH ”う”の抽出   う   SS   EE   AA

  • エクセルの関数の使い方(ルックアップ?)

    エクセルの関数の使い方(ルックアップ?) 例えばシートが2枚あります。 ・1シート目 A列に 1 2 3 4 5 と並べます。 ・2シート目 A列に 3 5 と並べます。 この時、2シート目のA列に該当する数字が1シート目のA列に存在した場合、 1シート目のB列(A列の横)に○又は1を入力したいです。 どうすればできるでしょうか?

  • エクセル:データ一致したとき1を足す

    教えて下さい。 シート(1)A列とB列に Aさん 2 Bさん 1 Cさん 3 Dさん 5  と1000行くらいあります。 シート(2)A列に Aさん Dさん Eさん   とあります。 シート(2)にある人のみシート(1)のB列の数字に1足したいのですが何か方法はありますか? 自慢じゃないけどVBAは分かりません。 どうぞよろしくm(__)m

  • Excel 条件付き書式に付いて

    Excel のシートでA1からA10まで4桁の数字が入っています。 その中に、例えば 3546c のように語尾にアルファベットが一文字入っているもんもあります。このアルファベットの入った行のG列のセルに色をつけたいのですが、どうしたらよいか教えて下さい。 A1 2365 A2 8634e A3 8635 A4 2975f 宜しくお願いいたします。

  • エクセルのLOOKUP関数について

    いつもお世話になってます。 Win98 Excel97です。 以前教わったIF関数でがんばろうとしたら7つまでしか入らないみたいで(T_T) Aのセルに数字1~10(これ以外の数字は入りません)までを入れると色々と反映するようにしたいのです。 入力はシート1のAセルのみにしたいのですが A B     C 1 ○○会社  03-×○ 2 ▲▲会社  045- 3 ■■会社  03- ・ ・ ・ のように10種類まであります。 受注するたびに手入力なんですが条件が多い上、手入力でミスが多発してます(T_T) 毎日のことなので固定させたいのですが、元となる表をシート2の1~10行で作りました。 シート1のAセルに1と入力したらシート2のA1行を丸ごと持ってきたいのですが?。 シート1のAセルは1000行まであり、1~10までのどれかしか入らないので何とかしたいのです。 説明不足でしたら補足はすぐお入れ致します。 どうぞよろしくお願い致します。  

  • 複数の条件で他のシートを検索する

    先日教えてくださった方々ありがとうございました。 また質問なんですが、先生方知恵を貸してください。 sheet1 A | B | C | D | E | F | G ======================= 1 | 2 | 3 | AA | BB | 00 | 空欄 1 | 2 | 3 | BB | CC | 11 | 空欄 2 | 3 | 4 | CC | AA | 22 | 空欄 5 | 6 | 7 | BA | CA | 12 | 空欄 sheet2 A | B | C | D ========================== AA | BB | 00 | 3 AD | C | 01 | 4 BB | CC | 11 | 2 CC | AA | 22 | 4 CA | BA | 20 | 5 BA | CA | 12 | 1 このように入力されています sheet1のDEFに完全に一致する組み合わせをsheet2のABCから探し Dをsheet1の空欄Gに出力させる さらにそのGと一致するsheet1のABCがあれば文字色を変える というものです。 分かり難いですが、教えてください。 関数のVLOOKUPで出力までは出来たのですが、 文字色を変えることが出来ませんでした。 マクロで全部やってしまった方が早そうなので知恵をお貸しください。 。

  • excelで文字列の部分一致の抽出について

    excel初心者です。excelの文字列中の一部が、決まった検索ワード(複数、別シートに一覧になっている)と一致する場合に、その検索ワードに対応する数字がふられるようにする数式を教えてください。countifやvookupでやってみましたが、検索ワードが複数なのでワイルドカード*が使えず、挫折しました。 sheet1が基データで、sheet2が検索ワードとそれに対応する数字のリストです。sheet1のB列に検索ワードの対応数字を入れたいです。sheet1のB列にどんな数式を入れたらいいのでしょうか。 sheet2の検索ワードの範囲はA1~B65です。 *追伸:サンプルの各シートのA列とB列の間にスペースを入れたつもりですが、質問文では削除?されて、くっついた表示になっています。見づらくてすみませんが、数字はB列だと思ってください。もうしわけありません。 サンプル: sheet1 (A列) 山口理事長 佐藤名誉会長 小林事業本部長 高橋代表取締役社長 高田課長 山本専務理事 sheet2 (A列) (B列) 社長 1 会長 1 代表取締役 1 理事 2 本部長 2 専務 3 (以下50個ほど続きます。B列の数字は重複します) ↓以下のようにしたいです sheet1 (A列) (B列) 山口理事長 2 佐藤名誉会長 1 小林事業本部長 2 高橋代表取締役社長 1,1 高田課長 山本専務理事 3,2 アドバイスの程、何卒よろしくお願いします。

  • エクセルでアルファベットの連続を簡単に入力するには

    以下のようにアルファベットを連続して 簡単に入力する方法があれば教えてください A B ・ ・ Y Z AA AB ・ ・ AZ BA BB BC ・ ・ ZZ

  • Excelで条件に満たしたセルを飛ばす

    色々と前の投稿を見ましたが、どうしても答えが分からず質問させてもらいます!! 1から31(1ヶ月)のセルの中で、毎月ランダムにたくさんのアルファベットが入ります。 その中で、「a」というアルファベットのみを別シートに飛ばし、その別シート上では「1」として表記したいです。さらに、その「a」が入った日付も一緒に別シートに飛ばしたいです。 一ヶ月の中で「a」が入るのは2~5回ぐらいなので、別シートには7日分の表を用意するつもりです。 ただ、その1ヶ月の中でどこに「a」が入るかは決まっていません。 日付も全く未定なので、「a」が入ったら別シートに1として、さらに日付が入ったセルの数字も一緒に飛ばす。 マクロは全く分からないので、出来れば関数が良いです!!

専門家に質問してみよう