2017-04-20 74 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 
相關問題