Function TachSo_P(ByVal Text As String) As Variant
Dim objRe As Object, match As Object, Arr(), n As Long
Set objRe = CreateObject("VBScript.RegExp")
objRe.Global = True
objRe.Pattern = "\D+(\d+)"
If objRe.test(Text) Then
TachSo_P = Trim(objRe.Replace(Text, " $1"))
End If
End Function
Function ExtractNum(ByVal Text As String)
Dim sTmp As String
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "\D+"
sTmp = .Replace(Text, Space(1))
ExtractNum = Split(Trim(sTmp), Space(1))
End With
End Function
Function xxx(ByVal s As String, ByVal vitri As Long) As String
Dim i As Long, V As Variant
For i = 1 To Len(s)
If Mid(s, i, 1) Like "#" = False Then Mid(s, i, 1) = " "
Next i
V = Split(Application.Trim(s), " ")
If UBound(V) + 1 >= vitri Then xxx = V(vitri - 1)
End Function
Function xxx(ByVal s As String, ByVal vitri As Long) As String
Dim i As Long, V As Variant
For i = 1 To Len(s)
If Mid(s, i, 1) Like "#" = False Then Mid(s, i, 1) = " "
Next i
V = Split(Application.Trim(s), " ")
If UBound(V) + 1 >= vitri Then xxx = V(vitri - 1)
End Function
Nếu chỉ lấy chữ số thì đây là giải thuật tương đối giản dị và hiệu quả.
Tôi không hiểu nổi tại sao ở GPE người ta có khuynh hướng tránh số vòng lặp? (vòng lặp lồng vào nhau thì cần giảm thiểu)
Tuy nhiên, nếu là tôi thì tách ra thành một cặp hàm.
(một thói quen khác của GPE là mọi thứ dồn vào một hàm)
Function xxx(ByVal s As String, ByVal vitri As Long) As String
' đây là hàm UDF, tuỳ theo sở thích mà bạn bẫy lỗi. Tôi thường không bẫy lỗi, cứ để nó #N/A! để dễ biết
xxx = yyy(s)(vitri-1)
End Function
Function yyy(ByVal s As String) As Variant
Dim i As Long
For i = 1 To Len(s)
If Mid(s, i, 1) Like "#" = False Then Mid(s, i, 1) = " "
' thường thì duyệt từng phần tử chuỗi, người ta dùng select
' select case Mid(s, i, 1)
' case "0" To "9" ...
' case "A" To "Z", "a" To "z"...
' tuy nhiên, ở đây, bạn chỉ xét 1 dạng duy nhất của ký tự (dạng chữ số), dùng If là đúng rồi
Next i
yyy = Split(Application.Trim(s), " ")
End Function