Excel VBA - 为什么包含数字的拆分字符串的算术比较有效?

时间:2018-02-18 12:01:46

标签: excel vba excel-vba

我想知道为什么下面的代码按照我的希望工作,考虑到我将一个字符串拆分成一个数组(也被定义为一个字符串),然后以算术(数字)方式进行比较。 / 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被触发,显示:

  • 12不大于20
  • 9不大于20
  • 30 大于20

我不知道/认为这样的比较可以像希望的那样工作,因为我基本上将字符串与整数进行比较。我假设有一些我不知道的东西,但在那种情况下,它是什么?

PS。我对要发布的论坛有点怀疑,但是我的选择基于this meta question

2 个答案:

答案 0 :(得分:6)

要获得答案,请参阅以下文章:https://msdn.microsoft.com/en-us/library/aa263418(v=vs.60).aspx

简而言之,如果将字符串与数字类型变量进行比较,则将字符串变量转换为double * type。

enter image description here

* double基于来自VB .net比较运算符引用(https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/comparison-operators),VB 6.0,VBA和VBA .net的信息不一样,但比较逻辑应该是相同的。

enter image description here

答案 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