我正在尝试找到最多 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
因为它们是使用输入框输入的,所以它正在比较文本值。因此,例如“8”大于“12”。相反,请尝试转换为
Longs
,例如:
x = CLng(InputBox("Enter the first number!"))
您还可以将代码简化为:
MsgBox WorksheetFunction.Max(x, y, z)
这是您正在寻找的图案。
由于 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”来强制声明变量。他们应该更进一步,并可以选择在所有声明中要求数据类型。
这里是一个返回任意数量的最大元素的函数:
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