Tách chuỗi dữ liệu lấy tên nhà cung cấp

Liên hệ QC
Cho em muốn hỏi anh là có thể tạo 1 Function Tổng quát dùng với
vbscript.regexp
Để lấy được những dữ liệu theo ý muốn Dạng kiểu Hàm lấy ký tự sau những kí tự đặc biệt như #, ? , * đại diện cho 1 hay nhiều kí tự: Ví dụ như Hàng hóa theo số #45786 của ngày 01/2017 > kết quả muốn lấy là 45786 hay kết quả ra là 01/2017 ....Giống kiểu crtl+h của excel kèm theo excel được không anh !
Bạn hỏi nhầm người rồi, vbscript.regexp có các tham số quá nhức đầu nên mình không bao giờ đụng tới
Bạn nên nhờ @excel_lv1.5 là chuyên gia về regexp
 
Không biết làm được không nhưng bạn đưa file ví dụ lên đi bạn , tất cả trường hợp tổng quát luôn nhe!!
Em gửi anh 1 số trường hợp tổng quát như thế này và kết quả mong muốn ! Mong sự giúp đỡ của anh !
Trong chỗ này thêm cả chuỗi ký tự : Ngày 01/01/2017; 01/02/2017 hạch toán nhà hàng nguyễn văn A: Chuỗi cần kết quả chính xác là 01/01/2017; 01/02/2017
 

File đính kèm

Em gửi anh 1 số trường hợp tổng quát như thế này và kết quả mong muốn ! Mong sự giúp đỡ của anh !
Trong chỗ này thêm cả chuỗi ký tự : Ngày 01/01/2017; 01/02/2017 hạch toán nhà hàng nguyễn văn A: Chuỗi cần kết quả chính xác là 01/01/2017; 01/02/2017
Bạn dùng code này thử xem:
PHP:
Function tach(str As String, n As Long)
With CreateObject("vbscript.regexp")
    .Pattern = "([^\#\&\\\s]+)[\#\&\\]+([^\#\&\\\s]+).*,(.*)"
    If .test(str) Then
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(1)
            Case 2
                tach = .Execute(str)(0).submatches(0)
            Case 3
                tach = .Execute(str)(0).submatches(2)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(0)
            Case 2
                tach = .Execute(str)(0).submatches(1)
        End Select
    End If
End With
End Function
 

File đính kèm

Bạn dùng code này thử xem:
PHP:
Function tach(str As String, n As Long)
With CreateObject("vbscript.regexp")
    .Pattern = "([^\#\&\\\s]+)[\#\&\\]+([^\#\&\\\s]+).*,(.*)"
    If .test(str) Then
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(1)
            Case 2
                tach = .Execute(str)(0).submatches(0)
            Case 3
                tach = .Execute(str)(0).submatches(2)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(0)
            Case 2
                tach = .Execute(str)(0).submatches(1)
        End Select
    End If
End With
End Function
Dạ vâng em cảm ơn anh ạ ! Hàm này có thể làm thành kiểu Tach(A1,"&") ra kết quả như trường hợp 1 hay đối với trường hợp giữa 2 kí tự đặc biệt .. được không Anh giống kiểu Ctrl + H ạ. Ngoài ra em muốn hỏi anh cách thức phân tích 1 chuỗi dạng này để em có thể vận dụng ở các bài sau ạ. EM cảm ơn anh ạ !
 
Dạ vâng em cảm ơn anh ạ ! Hàm này có thể làm thành kiểu Tach(A1,"&") ra kết quả như trường hợp 1 hay đối với trường hợp giữa 2 kí tự đặc biệt .. được không Anh giống kiểu Ctrl + H ạ. Ngoài ra em muốn hỏi anh cách thức phân tích 1 chuỗi dạng này để em có thể vận dụng ở các bài sau ạ. EM cảm ơn anh ạ !
Bạn sữa code lại như vầy :
PHP:
Function tach(str As String, n As Long, Optional demi As String = "")
With CreateObject("vbscript.regexp")
    .Pattern = "([^" & demi & "\s]+)[" & demi & "]+([^" & demi & "\s]+).*,(.*)"
    If .test(str) Then
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(1)
            Case 2
                tach = .Execute(str)(0).submatches(0)
            Case 3
                tach = .Execute(str)(0).submatches(2)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(0)
            Case 2
                tach = .Execute(str)(0).submatches(1)
        End Select
    End If
End With
End Function
Công thức là: =tach($A3,COLUMN(A1),"&#|")
Các dấu khác thì bình thường riêng dấu "\" thì bạn phải gõ là "\\"
 

File đính kèm

Bạn sữa code lại như vầy :
PHP:
Function tach(str As String, n As Long, Optional demi As String = "")
With CreateObject("vbscript.regexp")
    .Pattern = "([^" & demi & "\s]+)[" & demi & "]+([^" & demi & "\s]+).*,(.*)"
    If .test(str) Then
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(1)
            Case 2
                tach = .Execute(str)(0).submatches(0)
            Case 3
                tach = .Execute(str)(0).submatches(2)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(0)
            Case 2
                tach = .Execute(str)(0).submatches(1)
        End Select
    End If
End With
End Function
Công thức là: =tach($A3,COLUMN(A1),"&#|")
Các dấu khác thì bình thường riêng dấu "\" thì bạn phải gõ là "\\"
Em thử với chuỗi "Nguyễn văn A #AFF-UV Hơn" thì ra được kết quả là Value anh ạ. Ngoài ra cái chuỗi này em muốn dạng * đại điện cho 1 chuỗi kí tự và ? đại diện 1 ký tự anh ạ
 

File đính kèm

Bạn sữa code lại như vầy :
PHP:
Function tach(str As String, n As Long, Optional demi As String = "")
With CreateObject("vbscript.regexp")
    .Pattern = "([^" & demi & "\s]+)[" & demi & "]+([^" & demi & "\s]+).*,(.*)"
    If .test(str) Then
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(1)
            Case 2
                tach = .Execute(str)(0).submatches(0)
            Case 3
                tach = .Execute(str)(0).submatches(2)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        Select Case n
            Case 1
                tach = .Execute(str)(0).submatches(0)
            Case 2
                tach = .Execute(str)(0).submatches(1)
        End Select
    End If
End With
End Function
Công thức là: =tach($A3,COLUMN(A1),"&#|")
Các dấu khác thì bình thường riêng dấu "\" thì bạn phải gõ là "\\"
.
1. Có nhiều ký tự cần escape lắm - điển hình là dấu chấm, dấu thị.... Bạn chỉ bảo dấu chéo ngược ( \ ) là còn nhiều sơ sót.
Nếu là hàm thì nó phải tự có cái list cần escape và tự giải quyết luôn. Chỉ riêng dấu nháy kép ( " ) thì bạn mới cần dặn ngừoi dùng phải cẩn thận.

2. Code của bạn chỉ test cái pattern thứ nhất nhưng không test pattern thứ hai?
 
Em thử với chuỗi "Nguyễn văn A #AFF-UV Hơn" thì ra được kết quả là Value anh ạ. Ngoài ra cái chuỗi này em muốn dạng * đại điện cho 1 chuỗi kí tự và ? đại diện 1 ký tự anh ạ
Trường hợp này của bạn dựa vào đâu vào lấy, nó không cùng chung quy luật với chuỗi trên sao?
 
Trường hợp này nó chỉ lấy sau dấu # không kèm trường hợp " " Hơn anh ạ
Bạn chỉnh code như vầy:
PHP:
Function tach(str As String, n As Long, Optional demi As String = "")
str = str & ","
With CreateObject("vbscript.regexp")
    .Pattern = "([^" & demi & "\s]+)(\s*)[" & demi & "]+(\s*)([^" & demi & "\s]+)"
    If .test(str) Then
        Select Case n
            Case 1
                 If Len(.Execute(str)(0).submatches(2)) = 0 Then tach = .Execute(str)(0).submatches(3)
            Case 2
                If Len(.Execute(str)(0).submatches(1)) = 0 Then tach = .Execute(str)(0).submatches(0)
            Case 3
                .Pattern = ".*,([^,]+)"
                If .test(str) Then tach = .Execute(str)(0).submatches(0)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        If .test(str) Then
            Select Case n
                Case 1
                    tach = .Execute(str)(0).submatches(0)
                Case 2
                    tach = .Execute(str)(0).submatches(1)
            End Select
        End If
    End If
End With
End Function
 

File đính kèm

Em cảm ơn anh Ạ
 
Lần chỉnh sửa cuối:
Bạn chỉnh code như vầy:
PHP:
Function tach(str As String, n As Long, Optional demi As String = "")
str = str & ","
With CreateObject("vbscript.regexp")
    .Pattern = "([^" & demi & "\s]+)(\s*)[" & demi & "]+(\s*)([^" & demi & "\s]+)"
    If .test(str) Then
        Select Case n
            Case 1
                 If Len(.Execute(str)(0).submatches(2)) = 0 Then tach = .Execute(str)(0).submatches(3)
            Case 2
                If Len(.Execute(str)(0).submatches(1)) = 0 Then tach = .Execute(str)(0).submatches(0)
            Case 3
                .Pattern = ".*,([^,]+)"
                If .test(str) Then tach = .Execute(str)(0).submatches(0)
        End Select
    Else
        .Pattern = "\b(\d[\d\s\,]+)\b\D+\b((\d{1,2}/)?\d{1,2}\/\d{4})\b"
        If .test(str) Then
            Select Case n
                Case 1
                    tach = .Execute(str)(0).submatches(0)
                Case 2
                    tach = .Execute(str)(0).submatches(1)
            End Select
        End If
    End If
End With
End Function
Ngoài ra anh cho em hỏi với Cách thức để phân tích chuỗi này để các trường hợp sau em nghiên cứu và thực hiện với ! Mỗi lần dùng công thức này em lại phải xác định được chuỗi pattern nhưng chưa biết phân tách kiểu gì cho ổn cho nên ví vụ công thức này mà em muốn lấy số trong chuỗi thì em để ở ngoài là :LayTextDk(E6,"[^0-9]","",FALSE). Anh có thể giúp em phần này được không ạ !
Function LayTextDk(Chuoi As String, MaChuoi As String, CanThayThe, DieuKienTrueFalse As Boolean) As String
Dim objRegExp As Object
Set objRegExp = CreateObject("vbscript.regexp")
With objRegExp
.pattern = MaChuoi
.IgnoreCase = DieuKienTrueFalse
.Global = True
End With
LayTextDk = objRegExp.Replace(Chuoi, CanThayThe)
Set objRegExp = Nothing
End Function
 
Lần chỉnh sửa cuối:
Ngoài ra anh cho em hỏi với Cách thức để phân tích chuỗi này để các trường hợp sau em nghiên cứu và thực hiện với ! Mỗi lần dùng công thức này em lại phải xác định được chuỗi pattern nhưng chưa biết phân tách kiểu gì cho ổn cho nên ví vụ công thức này mà em muốn lấy số trong chuỗi thì em để ở ngoài là :LayTextDk(E6,"[^0-9]","",FALSE). Anh có thể giúp em phần này được không ạ !
Function LayTextDk(Chuoi As String, MaChuoi As String, CanThayThe, DieuKienTrueFalse As Boolean) As String
Dim objRegExp As Object
Set objRegExp = CreateObject("vbscript.regexp")
With objRegExp
.pattern = MaChuoi
.IgnoreCase = DieuKienTrueFalse
.Global = True
End With
LayTextDk = objRegExp.Replace(Chuoi, CanThayThe)
Set objRegExp = Nothing
End Function
Bạn đọc mấy bài này thử xem:
https://www.giaiphapexcel.com/diendan/threads/vbscript-regexp.76017/
https://www.giaiphapexcel.com/diendan/threads/thử-nghiệm-vbscript-regexp.69985/#post430042
Regex thì hơi khó hơn các object khác, thuộc tính thì nó có vài cái, tham số trong pattern cũng không nhiều , nhưng cái quan trọng là kết hợp các tham số để định dạng chuỗi, một chuỗi có nhiều cách viết pattern khác nhau. Cái này chắc không ai giúp được bạn đâu tùy vào khả năng bạn hiểu tới đâu thôi.
 
Bạn đọc mấy bài này thử xem:
https://www.giaiphapexcel.com/diendan/threads/vbscript-regexp.76017/
https://www.giaiphapexcel.com/diendan/threads/thử-nghiệm-vbscript-regexp.69985/#post430042
Regex thì hơi khó hơn các object khác, thuộc tính thì nó có vài cái, tham số trong pattern cũng không nhiều , nhưng cái quan trọng là kết hợp các tham số để định dạng chuỗi, một chuỗi có nhiều cách viết pattern khác nhau. Cái này chắc không ai giúp được bạn đâu tùy vào khả năng bạn hiểu tới đâu thôi.
Bạn đọc mấy bài này thử xem:
https://www.giaiphapexcel.com/diendan/threads/vbscript-regexp.76017/
https://www.giaiphapexcel.com/diendan/threads/thử-nghiệm-vbscript-regexp.69985/#post430042
Regex thì hơi khó hơn các object khác, thuộc tính thì nó có vài cái, tham số trong pattern cũng không nhiều , nhưng cái quan trọng là kết hợp các tham số để định dạng chuỗi, một chuỗi có nhiều cách viết pattern khác nhau. Cái này chắc không ai giúp được bạn đâu tùy vào khả năng bạn hiểu tới đâu thôi.
Thank anh ạ ! Để em nghiên cứu thêm ạ
 
Web KT

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

Back
Top Bottom