查找 3 个输入的最大值 VBA

问题描述 投票:0回答:3

我正在尝试找到最多 3 个输入。问题不在于算法,因为当我在 python 中制作相同的脚本时,它工作得很好。问题是它没有按预期工作。我会写一些场景以及结果:

8 5 12 - 最多:12
5 8 12 - 最多:12
12 5 8 - 最多:8
12 8 5 - 最多:8
5 12 8 - 最多:8
8 12 5 - 最大:8
100 22 33 - 最大:33
22 3 100 - 最大:100
100 22 3 - 最大:22

它似乎适用于相当多的组合,但不适用于每一种组合。我还没有找到模式,也不知道出了什么问题。

我附上代码:

Sub Maxthree()
'Calculates the maximum of three numbers'
Dim x, y, z As Single
x = InputBox("Enter the first number!")
y = InputBox("Enter the second number!")
z = InputBox("Enter the third number!")
MsgBox ("X: " & x & " Y: " & y & " Z: " & z)
If x > y Then
    If x > z Then
        MsgBox ("the maximum is : " & x)
    Else
        MsgBox ("the maximum is : " & z)
    End If
Else
    If y > z Then
        MsgBox ("the maximum is : " & y)
    Else
        MsgBox ("the maximum is : " & z)
    End If
End If
End Sub
excel vba max
3个回答
9
投票

因为它们是使用输入框输入的,所以它正在比较文本值。因此,例如“8”大于“12”。相反,请尝试转换为

Longs
,例如:

x = CLng(InputBox("Enter the first number!"))

您还可以将代码简化为:

MsgBox WorksheetFunction.Max(x, y, z)

1
投票

这是您正在寻找的图案。

由于 X 和 Y 是 Variant,而 Z 是 Single,这就是 VBA 执行比较的方式:

X vs Y:字符串 vs 字符串(这就是造成所有麻烦的原因)

X vs Z:数字(X会自动转换)

Y vs Z:数字(Y会自动转换)

重新评估所有 9 个场景,将 X 和 Y 作为字符串进行比较,将(X 或 Y)与 Z 作为数字进行比较。您观察到的结果虽然出乎意料,但却是正确的。

庆幸你不是用 PHP 编程,这更糟糕!

如果没有指定其他类型,微软应该为允许 Variant 作为默认数据类型而受到指责。它们支持“Option Explicit”来强制声明变量。他们应该更进一步,并可以选择在所有声明中要求数据类型。


0
投票

这里是一个返回任意数量的最大元素的函数:

Function Largest(ParamArray a() As Variant) As Variant
'returns the largest element of list
'List is supposed to be consistent: all nummbers or all strings
'e.g:   largest(2,6,-9,7,3)         -> 7
'       largest("d", "z", "c", "x") -> "z"
'by Patrick Honorez --- www.idevlop.com

    Dim result As Variant
    Dim i As Integer
    
    result = Null
    
    For i = LBound(a) To UBound(a)
        If result > a(i) Then
            'nothing to do. This construct will properly handle Null values
        Else
            result = a(i)
        End If
    Next i
    Largest = result
End Function
© www.soinside.com 2019 - 2024. All rights reserved.