我试图找到最多3个输入。问题不在算法中,因为当我在python中制作相同的脚本时,它运行得很好。问题是它没有按预期工作。我将写一些场景以及结果如何:
8 5 12 - Max: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
答案 0 :(得分:5)
因为它们是使用InputBox输入的,所以它正在比较文本值。因此,例如“8”大于“12”。而是尝试转换为Longs
,如:
x = CLng(InputBox("Enter the first number!"))
您还可以将代码简化为:
MsgBox WorksheetFunction.Max(x, y, z)
答案 1 :(得分: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编程,这更糟糕!
如果没有指定其他类型,Microsoft应该责备允许Variant成为默认数据类型。它们支持“Option Explicit”来强制声明变量。他们应该更进一步,并且可以选择在所有声明中要求数据类型。