我想知道为什么下面的代码按照我的希望工作,考虑到我将一个字符串拆分成一个数组(也被定义为一个字符串),然后以算术(数字)方式进行比较。 / p>
Option Explicit
Sub test()
Dim str As String, arr() As String
Dim num As Integer, i As Integer
str = "12 9 30"
num = 20
arr() = Split(str, " ")
For i = LBound(arr) To UBound(arr)
If arr(i) > num Then
MsgBox (arr(i) & " is larger than " & num)
End If
Next i
End Sub
根据预期,msgBox
内的if statement
被触发,显示:
我不知道/认为这样的比较可以像希望的那样工作,因为我基本上将字符串与整数进行比较。我假设有一些我不知道的东西,但在那种情况下,它是什么?
PS。我对要发布的论坛有点怀疑,但是我的选择基于this meta question
答案 0 :(得分:6)
要获得答案,请参阅以下文章:https://msdn.microsoft.com/en-us/library/aa263418(v=vs.60).aspx
简而言之,如果将字符串与数字类型变量进行比较,则将字符串变量转换为double * type。
* double基于来自VB .net比较运算符引用(https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/comparison-operators),VB 6.0,VBA和VBA .net的信息不一样,但比较逻辑应该是相同的。
答案 1 :(得分:2)
VBA似乎在运行时隐式转换数据类型。
考虑以下代码也可以。
Sub test2()
Dim str As String, arr() As String, num As String
Dim i As Integer
str = "12 9 30"
num = 12 '\\ Note the way number is being passed.
arr() = Split(str, " ")
For i = LBound(arr) To UBound(arr)
If arr(i) = num Then
MsgBox (arr(i) & " is equal to " & num)
End If
Next i
End Sub
然后低于算术运算在运行时强制它为数字的那个。
Sub test3()
Dim str As String, arr() As String, num As String
Dim i As Integer
str = "12 9 30"
num = 12
arr() = Split(str, " ")
For i = LBound(arr) To UBound(arr)
If (arr(i) - num) > 0 Then
MsgBox (arr(i) & " is greater than " & num)
End If
Next i
End Sub
我知道它不会完全回答你的问题,但可以解释为什么它会给出正确的结果。建议转换为正确的数据类型,而不是依赖于默认值,即
If CInt(arr(i)) > num Then