2013-07-12 39 views
2

我有這個函數,它以字符串的形式返回逗號分隔的字符串中的值,該字符串按照給定的整數值的順序。在VBA中處理一系列逗號分隔值

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 

測試小組將在值的列表中返回"5089"作爲其給定數量的2。

我的問題; 有沒有更好的方法來做到這一點,而不是Mid,Left和InStr的混亂字符串操作?像將逗號分隔的字符串值轉換爲數組的方式一樣?

另一個問題; 字符串格式爲"NUMBERS 5088, 5089, 5090 and 5091"。但爲此,我假設在處理它之前只需用替換","就可以了。

回答

2

另一種方法是使用正則表達式/正則表達式。你的函數將看起來像這樣:

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 
+0

這簡直太棒了...我是「正則表達式禁用」,應該真正學會正確使用正則表達式。他們似乎在許多領域提供了很好的解決方案。所以,「\ d +」的意思是「任何數字(數字)」?因此,無論文本是什麼,它都很簡單,可以將它分隔成字符串中的單獨數字。謝謝,這肯定有幫助。 – Raybarg

+1

我最近很喜歡正則表達式,儘可能使用它;)是的,'\ d +'會在文本中找到任何數字。如果你讓你的號碼更復雜,你可能需要改變模式。我發現[本網站](http://regex101.com/r/qV5jJ5)在學習正則表達式時對測試和試用非常有幫助。 –

+0

該網站看起來不錯,非常有幫助。 – Raybarg

1

您想使用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 
+0

有用的答案,這讓我瞭解斯普利特()函數。謝謝。 – Raybarg

+0

沒問題,對基本數據來說效果很好。正則表達式當然更強大,當然取決於你需要什麼。 – CuberChase