Nhờ mọi người giúp đỡ tách 2 chuỗi số trong chuỗi ra với.

Liên hệ QC

hongquan85army

Thành viên mới
Tham gia
13/9/10
Bài viết
16
Được thích
0
Untitled.pngNhờ các bạn giúp tách 2 chuỗi số trong chuỗi này với, Cámơn nhiều
 
Nhờ các bạn giúp tách 2 chuỗi số trong chuỗi này với, Cámơn nhiều
Mượn code bạn @PacificPR, bạn thử xem sao
Mã:
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
 
Thầy cho hỏi nếu không dùng vòng lặp thì làm như nào để đưa kết quả vào mảng để dùng ResizeKQ như file vậy ạ? Hình như regex.execute nó là collection
Đại khái vầy:
Mã:
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
 
Theo tôi thì điều kiện của thớt là chuỗi số nằm riêng biệt (có dấu cách với các phần khác).
Cái mẫu của quý vị lấy cả các số.

Chú: Space(1) phải gọi hàm Space ra để trả về 1 dấu cách. " " là hằng, nằm chèn trong code.
 
Hoặc thử UDF này:
PHP:
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
 
Hoặc thử UDF này:
PHP:
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
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom