Lấy ra chuỗi con trong từng cell

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
460
Được thích
19
Em chào mọi người.

Em muốn lấy ra chuỗi con định dạng "AS######" trong các cells cột D .

Ví dụ các cells có định dạng "hsjdjehf AS123762 jfighj12 frigj..." . Thì khi đó nó sẽ lấy ra chuối AS123762 ạ.

Rất mong mọi người cho em xin đoạn code tham khảo ạ.

Em xin cảm ơn!
 
Gửi anh.

Nếu em muốn lấy chuỗi đó sau chữ "CODE" trong mỗi cell thì em them vào thế này không đúng =GetPapPap(RIGHT("CODE",D3))

Ví dụ chuỗi "vevh vrehbjdfnhb 78v CODE AS352617 nehv vrgvug"

Không rõ phải định nghĩa hay sửa lại thế nào vậy anh ?

Em cảm ơn anh ạ.
AS###### thì không có khoảng trắng, giờ chuyển sang CODE lại có à?
Trong lúc chờ bác befain trả lời thì mình tạm sửa code bác ấy:
Mã:
Option Explicit

Function GetPapPap(ByVal Txt As String, ByVal stext As String) As String
Dim str_pattern As String
    str_pattern = "(" & Txt & "[0-9]{6})"
    Static regex As Object
    Dim all_matches As Object
    If regex Is Nothing Then
        Set regex = CreateObject("VBScript.RegExp")
        regex.Global = True
        regex.Pattern = str_pattern
    End If
    Set all_matches = regex.Execute(stext)
    If all_matches.Count <> 0 Then GetPapPap = all_matches(0).Value
End Function
Khi sử dụng thì GetPapPap("CODE",D3)
 
Upvote 0
Bác @befaint , regexp muốn xử lý để lấy chính xác theo sau đúng 6 chữ số, nếu là 7 chữ số trở lên không lấy thì pattern thế nào nhỉ, em hí hoáy mãi vẫn chưa nghĩ ra
Edit:
Em vừa thử, có vẻ là thế này:
Mã:
(AS[0-9]{6})(?=\D|$)
Tối thiểu là 7 ký tự số.

1604903842269.png
 
Upvote 0
Em chào mọi người.

Em muốn lấy ra chuỗi con định dạng "AS######" trong các cells cột D .

Ví dụ các cells có định dạng "hsjdjehf AS123762 jfighj12 frigj..." . Thì khi đó nó sẽ lấy ra chuối AS123762 ạ.

Rất mong mọi người cho em xin đoạn code tham khảo ạ.

Em xin cảm ơn!
Học Regular Expression 15 phút là biết A đến Z xử lý chuỗi.


Phần định nghĩa dưới đây đã có sẵn trong Add-in FastCode để học lập trình VBA do chính tôi phát triển:
bạn có thể tải và sử dụng add-in tại:

\Xóa bỏ định nghĩa của một cú pháp
|Thanh dọc biểu thị toán tử boolean "hoặc"
.Lấy ký tự bất kỳ
?không hoặc lấy một lần của cú pháp
+Một hoặc nhiều lần của cú pháp
*Không hoặc nhiều lần của cú pháp
{9}Giới hạn số ký tự lấy là 9 lần của cú pháp
{9,}9 đến nhiều lần của cú pháp
{,9}0 đến 9 lần của cú pháp
{2,9}Lấy 2 đến 9 lần của cú pháp
^Bắt đầu phải là chuỗi sau nó
[]Đối sánh bất kỳ ký tự đơn nào giữa các dấu ngoặc []
[^]Không chứa các ký tự theo sau nó
[-]Lấy từ ký tự cho đến ký tự
$Kết thúc phải là chuỗi trước nó
\bLấy ký tự đến ký tự phân tách
\BKhông lấy ký tự thuộc ký tự phân tách
\sLấy ký tự phân cách
\SLấy chuỗi không phải ký phân cách
\wKý tự chữ và số và dấu gạch dưới
\WKhông phải Ký tự chữ và số và dấu gạch dưới
\dLấy chuỗi ký tự số
\DLấy chuỗi không phải ký tự số
\tTab
\rTrở lại dòng trên
\nXuống dòng
\u0001Ký tự UTF-8 không phải unicode
\x1Ký tự UTF-8 không phải unicode
()Nhóm
(?:)Không nhóm
(?=)Không nhóm nhưng liền kề sau
(?!)Khác nhóm
 
Upvote 0
AS###### thì không có khoảng trắng, giờ chuyển sang CODE lại có à?
Trong lúc chờ bác befain trả lời thì mình tạm sửa code bác ấy:
Mã:
Option Explicit

Function GetPapPap(ByVal Txt As String, ByVal stext As String) As String
Dim str_pattern As String
    str_pattern = "(" & Txt & "[0-9]{6})"
    Static regex As Object
    Dim all_matches As Object
    If regex Is Nothing Then
        Set regex = CreateObject("VBScript.RegExp")
        regex.Global = True
        regex.Pattern = str_pattern
    End If
    Set all_matches = regex.Execute(stext)
    If all_matches.Count <> 0 Then GetPapPap = all_matches(0).Value
End Function
Khi sử dụng thì GetPapPap("CODE",D3)
Cảm ơn bác.

Em có thử thì nó ra #NAME?

Không rõ sai logic ở đâu ạ ?
 
Upvote 0
Cảm ơn bác.

Em có thử thì nó ra #NAME?

Không rõ sai logic ở đâu ạ ?
Chắc do bác ấy khai báo static nên nó vậy, đổi lại thành như này xem sao
PHP:
Option Explicit
Function GetPapPap(ByVal Txt As String, ByVal stext As String) As String
Dim str_pattern As String, regex As Object, all_matches As Object
    str_pattern = "(" & Txt & "[0-9]{6})"
        Set regex = CreateObject("VBScript.RegExp")
        regex.Global = True
        regex.Pattern = str_pattern
    Set all_matches = regex.Execute(stext)
    If all_matches.Count <> 0 Then GetPapPap = all_matches(0).Value
End Function
 
Upvote 0
Chắc do bác ấy khai báo static nên nó vậy, đổi lại thành như này xem sao
PHP:
Option Explicit
Function GetPapPap(ByVal Txt As String, ByVal stext As String) As String
Dim str_pattern As String, regex As Object, all_matches As Object
    str_pattern = "(" & Txt & "[0-9]{6})"
        Set regex = CreateObject("VBScript.RegExp")
        regex.Global = True
        regex.Pattern = str_pattern
    Set all_matches = regex.Execute(stext)
    If all_matches.Count <> 0 Then GetPapPap = all_matches(0).Value
End Function
Bác thử giúp em như trong file em gửi xem ạ.

Em có sửa lại nhưng chưa được.
 

File đính kèm

  • Book1.xlsm
    19.2 KB · Đọc: 2
Upvote 0
Upvote 0
Nãy mình nhìn nhầm, tưởng đâu "CODE352617".
Thế giờ bạn muốn lấy sau CODE, vậy kết quả trả về có bao gồm chữ CODE không
Không bác ạ. Em muốn lấy 8 ký tự sau chữ " CODE + 'khoang trắng' " của các cells ….. Ví dụ "CODE AS123421 " khi đó sẽ trả về AS123421
 
Upvote 0
Không bác ạ. Em muốn lấy 8 ký tự sau chữ " CODE + 'khoang trắng' " của các cells ….. Ví dụ "CODE AS123421 " khi đó sẽ trả về AS123421
Phần "Code " phía sau công thức là optional, tức là có thể có hoặc không, nếu không nhập thì nó sẽ lấy chuỗi nào có AS######, còn nếu nhập thì chỉ lấy chuỗi sau từ đó
Mình sửa lại chút nên chỉ lấy chính xác sau AS là 6 ký tự số nhé, nếu 7 ký tự không lấy. Nếu bạn muốn sửa lại thì sửa chỗ:
Mã:
str_pattern = "(" & Txt & ")(AS[0-9]{6}(?!\d))"
Thành:
str_pattern = "(" & Txt & ")(AS[0-9]{6})"
Code đây:
Mã:
Option Explicit
Function GetPapPap(ByVal stext As String, Optional ByVal Txt As String) As String
Dim str_pattern As String, regex As Object, all_matches As Object, C
Set regex = CreateObject("VBScript.RegExp")
str_pattern = "(" & Txt & ")(AS[0-9]{6}(?!\d))"
    With regex
        .Global = True
        .ignorecase = True
        .Pattern = str_pattern
        Set all_matches = .Execute(stext)
        If all_matches.Count <> 0 Then
            GetPapPap = VBA.Replace(UCase(all_matches(0).Value), UCase(Txt), "")
        End If
    End With
End Function
 

File đính kèm

  • Book1 (3).xlsm
    17.7 KB · Đọc: 2
Upvote 0
Phần "Code " phía sau công thức là optional, tức là có thể có hoặc không, nếu không nhập thì nó sẽ lấy chuỗi nào có AS######, còn nếu nhập thì chỉ lấy chuỗi sau từ đó
Mình sửa lại chút nên chỉ lấy chính xác sau AS là 6 ký tự số nhé, nếu 7 ký tự không lấy. Nếu bạn muốn sửa lại thì sửa chỗ:
Mã:
str_pattern = "(" & Txt & ")(AS[0-9]{6}(?!\d))"
Thành:
str_pattern = "(" & Txt & ")(AS[0-9]{6})"
Code đây:
Mã:
Option Explicit
Function GetPapPap(ByVal stext As String, Optional ByVal Txt As String) As String
Dim str_pattern As String, regex As Object, all_matches As Object, C
Set regex = CreateObject("VBScript.RegExp")
str_pattern = "(" & Txt & ")(AS[0-9]{6}(?!\d))"
    With regex
        .Global = True
        .ignorecase = True
        .Pattern = str_pattern
        Set all_matches = .Execute(stext)
        If all_matches.Count <> 0 Then
            GetPapPap = VBA.Replace(UCase(all_matches(0).Value), UCase(Txt), "")
        End If
    End With
End Function
Em cảm ơn nhiều nhé :)
 
Upvote 0
Code phải tự xét AS123456 và đoán được cái pattern chứ "nặn lại" pattern mỗi lần thay đổi thì code chi mất công.
 
Upvote 0
Bác cụ thể hơn được không ạ!
Code đọc "~A~S999999", tự động biết điều kiện là 2 ký tự 'AS' cộng 6 chữ số. (dấu ~ là escape theo tinh thần Excel)

Tôi chỉ bàn kháo "code xịn" thôi chứ bản thân tôi không đủ sức viết code xịn. (tiếng xưa, "bàn kháo" có nghĩa là xúi dại, xúi người ta chứ bản thân mình thì chạy)
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom