2016-05-13 3 views
4

1つのシートの列に値のリストがあります。別のシートには2つの列があります。 1つはワイルドカードのリストで、もう1つは値の別のリストです。最初のシートの列の横に、追加の列に2番目のシートのワイルドカードと比較して最初の列の値をチェックする式が含まれています。一致するものが見つかると、そのワイルドカードの横に値が表示されます。Excel:vlookupを使用していますが、配列内にワイルドカードを使用しています

これを行う方法はありますか?数時間それをして、私はそれを働かせることはできません。

ありがとうございます。

いくつかのサンプルデータ:

シート一つ

randomunnecessarydataUSEFULTHINGS123INFOmoregarbage

morerandomstuffIMPORTANT456junkjunkjunk

IMPORTANT456lotsofmorejunk

morejunkUSEFULTHINGS789INFOgarbage

列B

<some formula>

<some formula>

"

"

シート二

*usefulthings???INFO*

*important456*

列B

役に立つこと - インフォ重要

<some formula>は、シート1の列Aの値をシート2の表と照合したいと思っています。シート2の列Aのワイルドカードの1つが一致する場合、数式を含むセルはシート2の列B 。

+1

一部のデータが役立ちます。いくつかのデータをモックアップし、元の投稿に編集オプション –

答えて

1

私はあなたが正しい、あなたがこのような何かしたい(B1内をし、その後ダウンコピー)しまった場合:

=IF(MIN(IFERROR(MATCH(Sheet2!$A$1:$A$100,A1,0)*ROW($1:$100),FALSE)),INDEX(Sheet2!B:B,MIN(IFERROR(MATCH(Sheet2!$A$1:$A$100,A1,0)*ROW($1:$100),FALSE))),"") 

これは、配列数式であるとCTRL + シフトで確認しなければならない + と入力します。

enter image description here
左は検索用語と右にシート1でのワイルドカードリストと値をSheet2のです。それは単純に次の式を使用して、オートレンジに

EDIT

=IF(MIN(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!A:A,MATCH("zzz",Sheet2!A:A)),A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE)),INDEX(Sheet2!B:B,MIN(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!A:A,MATCH("zzz",Sheet2!A:A)),A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE))),"") 

そして、はい、最初の値のみが出力されます...あなたは複数の値を取得したい場合は、あなたが使用することができますこの式(常にB1で、次にように、左にも、このダウンタイムをコピーして):

*² =IFERROR(IF(SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1),INDEX(Sheet2!$B:$B,SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1)),""),"") 

しかし、すべての数式はより多くの細胞は、それらを使用するあなたのExcelを遅くすることに注意してください(最後のものは一番です)。あなたのリストがかなり長い場合、私はUDFを提案します。

EDIT 2

あなたが(ちょうど唯一の列Bのための最後の式を使用します)(/右を下にコピーする)C1のために、この式を使用することができ、再びそれを少しスピードアップする:

=IF(B1="","",IFERROR(IF(SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1),INDEX(Sheet2!$B:$B,SMALL(IFERROR(MATCH(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A)),$A1,0)*ROW(Sheet2!$A$1:INDEX(Sheet2!$A:$A,MATCH("zzz",Sheet2!$A:$A))),FALSE),COLUMN()-1)),""),"")) 

*²列Bの最初のEDIT式と列C +のEDIT 2の式を使用する場合、2番目のEDIT式は不要です。 UDF-方法については

EDIT 3

は、あなたのVBAエディタに行く(ALT +F11を打つ)と、そこに "挿入" - > "モジュール"。

Option Explicit 

Public Function getLikeLookup(str As String, rng As Range, Optional nCou As Long, Optional outCol As Range) As String 

    'for not case sensitive 
    str = LCase(str) 

    'set ranges 
    If nCou < 1 Then nCou = 1 
    If outCol Is Nothing Then Set outCol = rng.Offset(, rng.Columns.Count - 1).Resize(, 1) 
    Set rng = Intersect(rng.Resize(, 1), rng.Parent.UsedRange.EntireRow) 
    Set outCol = Intersect(outCol.Resize(, 1), outCol.Parent.UsedRange.EntireRow) 

    'get check-array (will be faster than running the sheet directly) 
    Dim inArr As Variant 
    inArr = rng.Value 

    'run checks 
    Dim i As Long 
    For i = 1 To UBound(inArr) 
    'If str Like inArr(i, 1) Then nCou = nCou - 1 
    If str Like LCase(inArr(i, 1)) Then nCou = nCou - 1 'for not case sensitive 
    If nCou = 0 Then Exit For 
    Next 

    'check for valid output 
    If i > UBound(inArr) Or i > outCol.Rows.Count Then Exit Function 

    'set output 
    getLikeLookup = outCol.Offset(i - 1).Resize(1, 1).Value 

End Function 

これで、他のワークシート関数と同様にUDFを使用できるようになりました。これを詳細に説明する。

getLikeLookup(lookup_string,lookup_range,[#_occurrence,[output_range]]) 
  • lookup_string:あなたはに対してチェックしたい文字列(文字列全体は、プレースホルダでは動作しません)

  • lookup_range:この範囲の左端の列のようなであることを確認されますlookup_stringoutput_rangeを省略すると、lookup_rangeの右端の列が出力に使用されます。

  • #_occurrence:[任意]一致する出力を示します。最初のものよりも省略された場合(1のように)、選択されます。

  • output_range:[オプション] output_rangeの最初の列が出力に使用されます。

    =getLikeLookup($A1,Sheet2!$A:$B,COLUMN()-1) 
    

    とビット使用(まだB1で始まる)、それをスピードアップするために:

は今、たとえば、あなたは(B1で始まる)を使用することができます

=IF(A1="","",getLikeLookup($A1,Sheet2!$A:$B,COLUMN()-1)) 

これを2式は配列ではなく、と入力すると確認できます。を入力します。

+0

を入れて試してみましょう。その間に、100行の制限なしにこれを行う方法はありますか? – creepblockedunderturret

+0

また、値が複数のワイルドカードと一致していれば、リストの最初のものと一緒に行くだろうと推測していますか? – creepblockedunderturret

+0

ここで構造化された参照を使用しても、シート2のデータがヘッダ – creepblockedunderturret

関連する問題