0

この関数を変更したい:別のファイルの範囲を参照しているセルのカスタムExcel VBA関数(変更されたVLOOKUP)でエラーが発生する

必要な機能は概念的に単純です。標準の1番目ではなくk番目のルックアップ値の出現に対応する値を返すVlookUpが必要です。例:

k番目のオカレンスが存在しない場合、関数はエラーを返す必要があります。

スプレッドシートのようなデータ:

     A       B   
1   "a"    "1a"   
2   "a"    "2a"    
3   "b"    "1b"
4   "a"    "3a"
5   "b"    "2a"

VLOOKUPnew(lookup_value =A1, table_array =A1:B3, 
        col_index_num = 2, exactMatch =0, k=1) should return 1a

VLOOKUPnew(lookup_value =A1, table_array =A1:B3, 
        col_index_num = 2, exactMatch =0, k=2) should return 2a

VLOOKUPnew(lookup_value =A1, table_array =A1:B3, 
        col_index_num = 2, exactMatch =0, k=3) should return 3a

VLOOKUPnew(lookup_value =A3, table_array =A1:B3, 
        col_index_num = 2, exactMatch =0, k=1) should return 1b

VLOOKUPnew(lookup_value =A3, table_array =A1:B3, 
        col_index_num = 2, exactMatch =0, k=2) should return 2b

VLOOKUPnew(lookup_value =A3, table_array =A1:B3, 
        col_index_num = 2, exactMatch =0, k=3) should return error

私はRとMatlabに精通しているので、私の考え方はベクトル指向です。最初に、1行のコードを書き直すことによってケースwitk k = 1または2のコードを書き込もうとしました(リンク先の投稿から):

row = .Match(lookup_value, table_array.Columns(1), 0)

の中へ :

If k =2 Then row_1 = .Match(lookup_value, table_array.Columns(1), 0) number_of_rows=table_array.Columns(1).Rows.Count

row = .Match(lookup_value, table_array.Columns(1).Rows( (row_1+1):number_of_rows ), 0)

上記の行は、適切に記述する方法がわからないため、擬似コードです(.Rows( (row_1+1):number_of_rows )数値のベクトルであり、非常に面白く見えます)

else
row = .Match(lookup_value, table_array.Columns(1), 0)
End If

k> 2の場合、このコードをforループに入れるのは簡単です(ただし非効率的です)。

パラメータとしてkも使用する変更された.Match()により、すべてのジョブが必要になることに気付きました。ループを使用してk番目の値の出現位置を見つけるのは非常に遅いようです。または、VBAにあまり詳しくない可能性があります。

4

1 に答える 1

1

これらのExcelベースの数式の両方を試すことができます。データテーブルに従って調整します。

  • 方法1:

CountIF関数を使用すると、列範囲内のルックアップ値の発生数をカウントできます。

=COUNTIF(columnRange,lookupvalue)

これがあなたが探しているかもしれないものであると仮定してください:参照から抽出されたデータ。

CUST列はを使用して入力されます=F78&COUNTIF($F$75:$F78,F78)

Master Data Starts from `F75 to H84`    
Customer    CUST    Phone number
Smith   Smith1  320-966-4023
Smith   Smith2  686-612-7782
Jason   Jason1  122-617-7154
Albert  Albert1 547-436-7376
Nancy   Nancy1  956-633-7322
Smith   Smith3  132-716-5240
Grove   Grove1  340-267-0529
Andy    Andy1   531-413-4718
Jason   Jason2  613-228-4294
Nancy   Nancy2  272-525-2042

最後のn番目のルックアップ:

例:顧客の4回目の発生の電話番号=Smith

=VLOOKUP($D$74&"4",$G$75:$H$93,2,FALSE)

Lookup  
Customer    Smith
Phone number    
1st 320-966-4023
2nd 686-612-7782
3rd 132-716-5240
4th 185-813-8883

Chandooからの参照:4。リスト内のアイテムの2番目/3番目/4番目の出現を検索します

  • 方法2:次の式に使用されるサンプルデータ:

ここに画像の説明を入力してください

方式:

=INDEX(ALTable,SMALL(IF(OFFSET(ALTable,0,0,ROWS(ALTable),1)=F90,
ROW(OFFSET(ALTable,0,0,ROWS(ALTable),1))-ROW(OFFSET(ALTable,0,0,1,1))+1,
ROW(OFFSET(ALTable,ROWS(ALTable)-1,0,1,1))+1),F91),2)

CPearsonArbitaryLookupsからの参照。個人的には、 ...のような揮発性の関数は好きではありません。index()

于 2012-12-30T19:48:45.373 に答える