UDF xử lý chuỗi sử dụng ký tự đặc biệt (Wildcards)

Liên hệ QC

Nhattanktnn

Thành viên gắn bó
Tham gia
11/11/16
Bài viết
3,154
Được thích
4,124
Donate (Momo)
Donate
Giới tính
Nam
Chào các anh chị,
Em đang viết một UDF có tên RemoveChars, Cú pháp dạng RemoveChars(Chuỗi,Ký tự cần xóa1, Ký tự cần xóa 2,...)
Chức năng của nó là xóa các ký tự không mong muốn trong một chuỗi.
Ví dụ A1 là chuỗi WE2-705 203 172, khi sử dụng hàm =RemoveChars(A1," ") sẽ xóa khoảng trắng còn WE2-705203172.
Đến đó em vẫn chưa hài lòng với kết quả vì muốn xóa thêm phần WE2-, một số ô khác nó lại là CO2- ...
Nên ý nghĩ là xóa theo ký tự đặc biệt, tức xóa phần trước dấu "-".
Em điều chỉnh UDF, =RemoveChars(A1,"*-"," ") => Kết quả là 705203172 (Như mong muốn)
Nhưng câu hỏi là:
Em muốn lập một hàm tổng quát chuyên xử lý dữ liệu kiểu này, ParramArray có cho phép sử dụng ký tự đặc biệt.
Ký tự đặc biệt trong excel có 3 loại, "*", "?", "~" . Với 3 loại này nó xảy ra quá nhiều trường hợp mà em không kiểm soát hết được, chưa kể đến trường hợp chuỗi mục tiêu chứa luôn cả các loại này, kiểu 705***203***172
Vậy anh chị có thuật toán nào hay hoặc link nào thì gửi cho em tham khảo với!
Em đã code được nhiêu đây với dấu hoa thị "*" đủ để sử dụng trong bài toán của em. Còn em muốn chuyển thành tổng quát thì thực sự quá phức tạp
Mã:
Option Explicit
'Xóa ky tu trong chuoi, khong phan biet hoa thuong
Public Function RemoveChars(str As String, ParamArray CharArray() As Variant) As String
    Dim iChar As Variant
    Dim Txt As String, Tmp As String
    Dim M As Long, AstPos As Long
    Txt = str
    For Each iChar In CharArray
        AstPos = InStr(iChar, "*")
        If AstPos Then
            Tmp = Replace(iChar, "*", "")
            M = InStr(1, Txt, Tmp, 1)
            If M Then
                If AstPos = 1 Then
                    iChar = Mid(Txt, 1, M + Len(Tmp) - 1)
                ElseIf AstPos = Len(iChar) Then
                    M = InStr(1, Txt, Tmp, 1)
                    iChar = Mid(Txt, M, Len(Txt))
                End If
            Else
                iChar = ""
            End If
        Else
            Tmp = iChar
            M = InStr(1, Txt, Tmp, 1)
            If M <= 0 Then
                iChar = ""
            End If
        End If
        Txt = Replace(Txt, iChar, "", , , 1)
    Next
    RemoveChars = Txt
End Function
 
Cái bạn đang định làm chính là Regex. Lấy luôn cái đó dùng thôi. :)
Em có nghĩ tới Regex, nhưng thực hiện thì chưa thực hiện được
Làm sao để cái pattern hoạt động đúng với các ký tự đặc biệt đó khó lắm anh (đối với em)
 
Upvote 0
Em có nghĩ tới Regex, nhưng thực hiện thì chưa thực hiện được
Làm sao để cái pattern hoạt động đúng với các ký tự đặc biệt đó khó lắm anh (đối với em)
Cái bạn muốn làm là sự uyển chuyển khi sử lý chuỗi. Nó chính là nhiệm vụ của Regex.
Nói cách khác, sử lý chuỗi như vậy thì bạn bắt buộc phải thuần thục Regex. Chịu khó học nó thôi.
Làm theo kiểu cổ điển như code bài #1 thì chỉ mất công mà hàm vừa rườm rà, vừa kém hiệu quả.

Bạn viết hàm nhận 2 đối số:
Đối số 1 là chuỗi cần sử lý
Đối số 2 là cái chuỗi mẫu truyền vào Regex.
Phần còn lại Regex xử lý. Chỉ vậy thôi.
Ai là người viết cái chuỗi mẫu? Người dùng hay hàm của bạn?
 
Upvote 0
Bạn viết hàm nhận 2 đối số:
Đối số 1 là chuỗi cần sử lý
Đối số 2 là cái chuỗi mẫu truyền vào Regex.
Phần còn lại Regex xử lý. Chỉ vậy thôi.
Cái mục đích của em là viết hàm cho những người không biết về VBA sử dụng (cuối cùng là tạo addin chứa hàm này), để bạn bè trong phòng dùng. Nếu phải nhập pattern vào hàm thì chắc chắn các bạn ấy không biết. Nhưng nếu nhập theo kiểu của hộp thoại replace, tức nhập "*","?","~" thì sẽ dễ hiểu và thông dụng hơn.
Bài đã được tự động gộp:

Cái bạn muốn làm là sự uyển chuyển khi sử lý chuỗi. Nó chính là nhiệm vụ của Regex.
Nói cách khác, sử lý chuỗi như vậy thì bạn bắt buộc phải thuần thục Regex. Chịu khó học nó thôi.
Làm theo kiểu cổ điển như code bài #1 thì chỉ mất công mà hàm vừa rườm rà, vừa kém hiệu quả.


Ai là người viết cái chuỗi mẫu? Người dùng hay hàm của bạn?
Vâng đúng rồi bác, code em viết để dùng tạm chứ không bao quát được. Cái chuỗi mẫu là để người dùng nhập vào, nên em mới muốn là dùng ký tự đặc biệt cho thông dụng
 
Upvote 0
Web KT

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

Back
Top Bottom