”,因此 L 之前的列中的值不计入 La 或 Lb。例如: 7 8 5 3 6 2 L 变为 8,但 La(第二大)变为 6(但应该是 7-6ren">
gpt4 book ai didi

vba - 列中的五个最大值

转载 作者:行者123 更新时间:2023-12-02 14:31:30 29 4
gpt4 key购买 nike

我的目标是用消息框显示列中的五个最大值。但因为我使用的是“">”,因此 L 之前的列中的值不计入 La 或 Lb。例如:

7
8
5
3
6
2

L 变为 8,但 La(第二大)变为 6(但应该是 7),Lb(第三大)最大)变为2,Lc =0,Ld=0

Sub maxtest3()

Dim L As Integer, La As Integer, Lb As Integer, Lc As Integer, Ld As Integer
Dim a As Variant
L = 0
La = 0
Lb = 0
Lc = 0
Ld = 0


For Each a In Range("A1:A20")
If a.Value > L Then
L = a.Value
Else
If a.Value > La Then
La = a.Value
Else
If a.Value > Lb Then
Lb = a.Value
Else
If a.Value > Lc Then
Lc = a.Value
Else
If a.Value > Ld Then
Ld = a.Value
Else
End If
End If
End If
End If
End If
Next
MsgBox (L & " " & La & " " & Lb & " " & Lc & " " & Ld)
End Sub

我知道无论谁看到这个都有能力用一行代码解决问题,但是为了教育新手,请克制自己这样做。

最佳答案

您的嵌套 If ... Else ... 语句可以更轻松地编写为 Select Case statement 。它甚至可能提高可读性。

问题是后续值会覆盖之前的值。现有值需要在被覆盖之前进一步插入队列。虽然以下代码有点冗长,但它应该足以演示解决方案。

Sub maxtest3()
Dim L As Variant, a As Range, rng As Range

Set rng = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
ReDim L(1 To 5)

For Each a In rng
Select Case a.Value
Case Is > L(1)
L(5) = L(4)
L(4) = L(3)
L(3) = L(2)
L(2) = L(1)
L(1) = a.Value
Case Is > L(2)
L(5) = L(4)
L(4) = L(3)
L(3) = L(2)
L(2) = a.Value
Case Is > L(3)
L(5) = L(4)
L(4) = L(3)
L(3) = a.Value
Case Is > L(4)
L(5) = L(4)
L(4) = a.Value
Case Is > L(5)
L(5) = a.Value
End Select
Next a

MsgBox Join(L, Chr(32))

End Sub

我已将您的 Lx 变量更改为简单的一维数组。这允许使用 Join Function简化 MsgBox 的字符串连接。

关于vba - 列中的五个最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33008119/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com