0

我想修改这个函数:来自单元格的自定义 Excel VBA 函数(修改后的 VLOOKUP)引用不同文件中的范围会给出错误

我需要的功能在概念上很简单 - 我需要 VlookUp 它的返回值对应于查找值的第 k 次出现而不是标准的第 1 次,例如:

如果第 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,所以我的想法是面向向量的,我首先尝试通过重写一行代码(来自我链接到的帖子)来编写 case 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 循环会很简单(但效率低下)。

我注意到修改后的 .Match() 也将k作为参数,这将使所有工作都需要。使用循环来查找第 k 个值出现的位置似乎很慢,或者我可能对 VBA 不太熟悉。

4

1 回答 1

1

您可以尝试这两个基于 Excel 的公式:根据您的数据表进行调整。

  • 方法一:

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)

来自 CPearson Arbitary Lookups 的参考。就我个人而言,我不喜欢volatile 函数,例如index()......虽然......

于 2012-12-30T19:48:45.373 回答