Excel VBA – 查找范围内的最高值和后续值

我有下面的代码,应该find一个范围内的第一,第二,第三和第四个最高值。

这是目前非常基本的,我提供了一个MsgBox的值,所以我可以确认它正在工作。

但是,它只能find最高和最高的值。 第三个和第四个值返回为0.我错过了什么?

Sub Macro1() Dim rng As Range, cell As Range Dim firstVal As Double, secondVal As Double, thirdVal As Double, fourthVal As Double Set rng = [C4:C16] For Each cell In rng If cell.Value > firstVal Then firstVal = cell.Value If cell.Value > secondVal And cell.Value < firstVal Then secondVal = cell.Value If cell.Value > thirdVal And cell.Value < secondVal Then thirdVal = cell.Value If cell.Value > fourthVal And cell.Value < thirdVal Then fourthVal = cell.Value Next cell MsgBox "First Highest Value is " & firstVal MsgBox "Second Highest Value is " & secondVal MsgBox "Third Highest Value is " & thirdVal MsgBox "Fourth Highest Value is " & fourthVal End Sub 

使用Application.WorksheetFunction.Large():

 Sub Macro1() Dim rng As Range, cell As Range Dim firstVal As Double, secondVal As Double, thirdVal As Double, fourthVal As Double Set rng = [C4:C16] firstVal = Application.WorksheetFunction.Large(rng,1) secondVal = Application.WorksheetFunction.Large(rng,2) thirdVal = Application.WorksheetFunction.Large(rng,3) fourthVal = Application.WorksheetFunction.Large(rng,4) MsgBox "First Highest Value is " & firstVal MsgBox "Second Highest Value is " & secondVal MsgBox "Third Highest Value is " & thirdVal MsgBox "Fourth Highest Value is " & fourthVal End Sub 

上面的Scott Cranerbuild议你有一个更好的方法。 但是,要回答您的问题,您只返回有限数量的值,因为您正在覆盖这些值,而不将原始值转换为较低的值。

 Dim myVALs As Variant myVALs = Array(0, 0, 0, 0, 0) For Each cell In rng Select Case True Case cell.Value2 > myVALs(0) myVALs(4) = myVALs(3) myVALs(3) = myVALs(2) myVALs(2) = myVALs(1) myVALs(1) = myVALs(0) myVALs(0) = cell.Value2 Case cell.Value2 > myVALs(1) myVALs(4) = myVALs(3) myVALs(3) = myVALs(2) myVALs(2) = myVALs(1) myVALs(1) = cell.Value2 Case cell.Value2 > myVALs(2) myVALs(4) = myVALs(3) myVALs(3) = myVALs(2) myVALs(2) = cell.Value2 Case cell.Value2 > myVALs(3) myVALs(4) = myVALs(3) myVALs(3) = cell.Value2 Case cell.Value2 > myVALs(4) myVALs(4) = cell.Value2 Case Else 'do nothing End Select Next cell Debug.Print "first: " & myVALs(0) Debug.Print "second: " & myVALs(1) Debug.Print "third: " & myVALs(2) Debug.Print "fourth: " & myVALs(3) Debug.Print "fifth: " & myVALs(4)