この関数を変更したい:別のファイルの範囲を参照しているセルのカスタム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にあまり詳しくない可能性があります。