首页 > 解决方案 > 如何获取序列中的第一个和最后一个数字

问题描述

我正在使用 VBA 尝试以分隔的数字序列获取第一个和最后一个数字。

数据仅显示为逗号分隔的数字序列。它们总是按数字升序排列。

所以这方面的一个例子可能是:

1,2,3,5,7,8,9

只需要序列的第一个和最后一个,序列定义为比前一个数字多一个的数字,在这种情况下有两个序列: 1,2,37,8,9。5 不在序列中,因为它前后被不止一个分隔(缺少 4 和 6)。

在这两种情况下,我需要每个序列的第一个和最后一个数字,即1 & 3第一个序列和7 & 9第二个序列。

我想知道正则表达式是否适合这一点,或者将它们放入某个集合中以便能够更轻松地前后导航是否会更好?

不知道从哪里开始——有什么想法吗?

非常感谢。

标签: vbasequence

解决方案


最简单的方法可能是使用Split

NumberSequence = "1,2,3,5,7,8,9"
ValueList = Split(NumberSequence, ",")

然后拉取 ValueList 数组中第一个和最后一个索引的值。

您的问题描述中的复杂之处在于识别数字序列中何时“缺失”数字,但Split也有助于解决此问题。将数字读入数组后,很容易遍历它们并确定“间隙”在哪里。

这说明了该方法:

Sub SampleProject()
    
    GetMinAndMax "1,2,3,5,7,8,9"

End Sub

Sub GetMinAndMax(NumberSequence As String)
    
    ValueList = Split(NumberSequence, ",")
    
    MinValue = CInt(ValueList(0))
    
    For i = 1 To UBound(ValueList)
        If CInt(ValueList(i)) > CInt(ValueList(i - 1)) + 1 Then
            MaxValue = CInt(ValueList(i - 1))
            
            'Ignore single numbers ("5" in your example)
            If Not MinValue = MaxValue Then MsgBox MinValue & " - " & MaxValue
            
            MinValue = CInt(ValueList(i))
            
        ElseIf i = UBound(ValueList) Then
            MaxValue = CInt(ValueList(UBound(ValueList)))
            MsgBox MinValue & " - " & MaxValue
            
        End If
    Next

End Sub

推荐阅读