繁体   English   中英

在 Excel VBA 中比较具有一个以上小数点的版本号

[英]Comparing version numbers with more than one decimal point in Excel VBA

我有一个在单元格中存储软件版本号的工作表,它使用多个小数点。 例如 5.2.16

我需要能够进行版本号比较。 单元格中的版本号是高于还是低于我与之比较的版本号。

Double 只能存储一个带一个小数点的数字,所以就这样了。

我尝试过的一种方法是使用 Replace 删除小数并将数字存储在 Long 变量中。

lngMyNumber = Replace("5.2.16", ".", "")

然后我可以轻松地比较数字,但当然,如果将版本号 5.1 (51) 与 4.5.10 (4510) 进行比较,则 5.1 不会作为更高的版本号出现。

有没有人对优雅的解决方案提出建议?

我相信这是一种更强大的方法,因为它不假设版本组件的长度相同:

Function VersionCheck(currVer, latestVer) As Boolean
Dim currArr() As String, latestArr() As String
currArr = Split(currVer, ".")
latestArr = Split(latestVer, ".")

'If versions are the same return true
If currVer = latestVer Then
    VersionCheck = True
    Exit Function
End If

'Iterate through the version components
Dim i As Integer
For i = LBound(currArr) To UBound(currArr)

    'If the end of the latest cersion is reached, the current version must be up to greater
    'meaning it is up to date
    If i > UBound(latestArr) Then
        VersionCheck = True
        Exit Function
    End If

    'Cast the component to an integer
    Dim curr As Integer, latest As Integer
    curr = Int(currArr(i))
    latest = Int(latestArr(i))

    'Check which version component is greater in which case return a result
    If curr > latest Then
        VersionCheck = True
        Exit Function
    ElseIf curr < latest Then
        VersionCheck = False
        Exit Function
    End If

    'If the version components are equal, iterate to the next component
Next

'If there are remaining components in the latest version, return false
If i < UBound(latestArr) Then
    VersionCheck = False
    Exit Function
End If

结束函数

这应该有效。 将替换的版本号以及所需的长度传递给函数,该长度应该是版本的最大字符串长度。

Function rightSize(ver, verlen As Integer) As Long
Dim i As Integer
For i = Len(ver) To verlen - 1
    ver = ver & "0"
Next
rightSize = Int(ver)
End Function

一种更简单的解决方法,适用于不同长度的版本号。

Function VersionCheck(CurrVer, PrevVer) As String
    
    Dim A, B, i, CurrVer_0, PrevVer_0 As Variant
    
    CurrVer_0 = CurrVer
    PrevVer_0 = PrevVer
    
    While UBound(Split(CurrVer, ".")) > UBound(Split(PrevVer, "."))
        PrevVer = PrevVer & ".0"
    Wend
    
    While UBound(Split(CurrVer, ".")) < UBound(Split(PrevVer, "."))
        CurrVer = CurrVer & ".0"
    Wend
    
    A = Split(CurrVer, ".")
    B = Split(PrevVer, ".")
    
    For i = 0 To UBound(A)
        If CInt(A(i)) > CInt(B(i)) Then
            VersionCheck = CurrVer_0
            Exit Function
        ElseIf CInt(A(i)) < CInt(B(i)) Then
            VersionCheck = PrevVer_0
            Exit Function
        End If
    Next i
    
    VersionCheck = CurrVer_0
    
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM