2017-04-20 75 views
0

假设我有两列col1col2(它们都是范围对象,例如,set col1 = range("A1:A100")set col2 = range("C1:C100"))其中col1是随着行号增加其值为1,2,3,...,100的ID列。使用k_val = WorksheetFunction.Small(col2, k)很容易在col2中找到第k个最小数字。现在我想在col1中找到与col2中第k个最小值相对应的匹配ID。我该怎么办?如何使用Excel VBA找到第k个最小元素的匹配ID?

我知道vlookup能够解决这个问题,但有一个缺陷:如果col2有两个或更多的值等于k_val,我可能不会得到正确的ID。另外,我并不想根据col2对两列进行排序,原因是我不想更改原始表格(您可能会说我可以先将原始表格复制到另一个表格中,但无论如何... ),那么我有没有其他办法可以明智地解决这个问题?

+2

不知道你如何指望处理决定正确的ID的问题,当有两个或更多k_vals一样,很难推荐任何东西。 –

+1

同意@RonRosenfeld。除此之外,这只是另一个'与VLOOKUP'问题返回多个匹配。唯一的问题是确定**哪个匹配的行返回,并且您已经决定这不足以包含在您的问题的叙述中。 – Jeeped

+0

*“但有一个缺陷:如果col2有两个或更多的值......”* :(如上面的评论),直到现在的缺陷是在*规范*中你想要如何处理这种情况。 –

回答

0

有许多方法来实现这一目标?

就像一个如下...

Sub getIDForKthSmallestElement() 
Dim col1 As Range, col2 As Range 
Dim k As Integer 
Dim k_val 

Set col1 = Range("A1:A100") 
Set col2 = Range("C1:C100") 

k = 2 'second smallest value 

On Error Resume Next 
k_val = WorksheetFunction.Small(col2, k) 

If k_val > 0 Then 
    col2.AutoFilter field:=1, Criteria1:=k_val 
    col1.SpecialCells(xlCellTypeVisible).Copy Range("D1") 'will write all the ID's in column D 
    col2.AutoFilter 
End If 
End Sub 
相关问题