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

Finding highest and subsequent values in a range

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

它目前非常基础,我让它在 MsgBox 中提供值,这样我就可以确认它是否正常工作。

但是,它只能找到最高值和第二高值。第三个和第四个值返回为 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 Craner建议的更好的方法。但是,为了回答您的问题,您只返回了有限数量的值,因为您正在覆盖这些值,而没有将原始值转移到较低的等级。

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)

Excel wroksheetfuntion 将是一个更好的选择,因为 task.This 将允许用户 select 范围,并将它们发布在任何具有无效数据的范围内。可以为 Top4 值声明另一种 Double 数据类型,也可以更新相同的 msgbox。这将避免宏中出现任何类型的错误。

Sub top_three()

Dim Area As Range
Dim Tone As Double, Ttwo As Double, Tthree As Double

On Error GoTo Skip

Set Area = Excel.Application.InputBox("Select the Range", "Data Visulaization", 
Type:=8)

If Excel.Application.WorksheetFunction.Count(Area) >= 3 Then

Tone = Excel.WorksheetFunction.Large(Area, 1)
Ttwo = Excel.WorksheetFunction.Large(Area, 2)
Tthree = Excel.WorksheetFunction.Large(Area, 3)

VBA.Interaction.MsgBox "Top 1: " & Tone & VBA.Constants.vbNewLine & _
"Top 2: " & Ttwo & VBA.Constants.vbNewLine & "Top 3:" & Tthree, Title:= _
"Top 3 values"

Else

VBA.Interaction.MsgBox "No Enough Data type to perform the task", vbInformation

End If

Skip:

End Sub