【问题标题】:Handling series of comma separated values in VBA在 VBA 中处理一系列逗号分隔值
【发布时间】:2013-07-12 15:03:47
【问题描述】:

我有这个函数,它以字符串形式返回逗号分隔字符串中的值,该字符串按给定整数值的顺序排列。

Private Sub TestGetNthNumber()
    Debug.Print GetNthNumber("NUMBERS 5088, 5089, 5090, 5091", 2)
End Sub

Public Function GetNthNumber(sMark As String, iOrder As Integer) As String
    Dim sTemp As String
    Dim sNumber As String
    Dim iLoop As Integer

    If sMark = "" Then
        Exit Function
    End If

    sTemp = sMark & ","

    For iLoop = 1 To iOrder
        sTemp = Mid(sTemp, InStr(sTemp, " "))
        sNumber = Trim(Left(sTemp, InStr(sTemp, ",") - 1))
        sTemp = Mid(sTemp, InStr(sTemp, ",") + 1)
    Next

    GetNthNumber = sNumber
End Function

测试 Sub 将返回 "5089" 作为其值列表中的给定数字 2。

我的问题; 有没有更好的方法来做到这一点,而不是使用 Mid、Left 和 InStr 进行凌乱的字符串操作?喜欢将逗号分隔的字符串值转换为数组的方法吗?

另一个问题; 字符串的格式可能是"NUMBERS 5088, 5089, 5090 and 5091"。但为此,我假设在处理它之前只需将 " and" 替换为 "," 即可。

【问题讨论】:

    标签: vba


    【解决方案1】:

    另一种选择是使用 RegEx/RegExp。您的函数将如下所示:

    Public Function GetNthNumberAlternative(sMark As String, iOrder As Integer) As String
    
        'regexp declaration
        Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
    
        With objRegExp
            .Global = True
            .Pattern = "\d+"
    
            GetNthNumberAlternative = .Execute(sMark)(iOrder - 1).Value 
        End With
    
    End Function
    

    你可以这样称呼它:

    Private Sub TestGetNthNumber()
        Debug.Print GetNthNumberAlternative("NUMBERS 5088 AND 5089 OR 5090, 5091", 1)
    End Sub
    

    【讨论】:

    • 这简直太棒了......我是“禁用正则表达式”,应该真正学会正确使用正则表达式。他们似乎在许多领域都给出了很好的解决方案。那么,“\d+”的意思是“任何数字(数字)”?因此,无论文本是什么,它都可以简单地将其分成字符串中的单独数字?谢谢,这肯定有帮助。
    • 我对最近尽可能多地使用正则表达式感到非常兴奋;)是的,\d+ 会在文本中找到任何数字。如果你让你的数字更复杂,你可能需要改变模式。我发现this site 在学习正则表达式时对测试和试用非常有帮助。
    • 那个网站看起来很棒,很有帮助。
    • 这个post 可能会帮助您了解 Excel 中的正则表达式功能。
    【解决方案2】:

    您想使用Split 函数。如果您每次都有相同的值,那么您可以删除NUMBERS 和最终的AND。像这样的:

    Private Sub TestGetNthNumber()
        Debug.Print GetNthNumber("NUMBERS 5088, 5089, 5090, 5091", 2)
    End Sub
    
    Public Function GetNthNumber(sMark As String, iOrder As Integer) As String
        Dim vArray As Variant
    
        sMark = Replace(sMark, "NUMBERS", "")
        sMark = Replace(sMark, "AND", "")
        vArray = Split(sMark, ",")
    
        GetNthNumber = vArray(iOrder)
    
    End Function
    

    【讨论】:

    • 有用的答案,这让我了解了 Split() 函数。谢谢。
    • 是的,没问题,对于基本数据,它工作得很好。正则表达式当然更强大,具体取决于您的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多