Cho hỏi hàm VBA so sánh 2 chuỗi

Liên hệ QC

Duong_VBA

Thành viên chính thức
Tham gia
10/11/07
Bài viết
89
Được thích
26
Em có chuỗi ví dụ, gọi là GOC: " A B C D E"
Chuỗi so sánh với chuỗi Goc là: "M C E A N" gọi là NGON
Cho em hỏi:
Hàm VBA nào để lấy ra chỗi có ở GOC nhưng không có ở NGON, tức là lấy ra chuỗi: "B D"
Cảm ơn các bác!
 
Em có chuỗi ví dụ, gọi là GOC: " A B C D E"
Chuỗi so sánh với chuỗi Goc là: "M C E A N" gọi là NGON
Cho em hỏi:
Hàm VBA nào để lấy ra chỗi có ở GOC nhưng không có ở NGON, tức là lấy ra chuỗi: "B D"
Cảm ơn các bác!

bạn xem thử hàm này xem :
PHP:
Function TachChuoi(Str1 As String, Str2 As String) As String
Dim i As Long, Char As String
Application.Volatile (False)
For i = 1 To Len(Str1)
    Char = Mid(Str1, i, 1)
    If Char = " " Or InStr(1, Str2, Char, 1) = 0 Then
        Char = Mid(Str1, i, 1)
    Else: Char = ""
    End If
    TachChuoi = TachChuoi & Char
Next
TachChuoi = Trim(TachChuoi)
End Function
 

File đính kèm

Upvote 0
Dùng "đệ quy" đây:
PHP:
Function TachChuoi(Str1 As String, Str2 As String) As String
  Dim i As Long
  TachChuoi = Replace(Str1, Left(Str2, 1), "")
  For i = 1 To Len(Str2)
    If Mid(Str2, i, 1) <> " " Then
      TachChuoi = Trim(Replace(TachChuoi, Mid(Str2, i, 1), ""))
      TachChuoi = Trim(Replace(TachChuoi, UCase(Mid(Str2, i, 1)), ""))
    End If
  Next
End Function
 
Upvote 0
Với bài này thì dùng đệ quy làm gì cho mệt. 1 vòng lặp là xong, vừa nhanh vừa dễ hiểu.
Mã:
Function TachChuoi(str1 As String, str2 As String) As String
    Dim i As Integer
    Dim ret As String
    Dim char As String
    For i = 1 To Len(str1)
        char = Mid(str1, i, 1)
        If InStr(1, str2, char) = 0 Then ret = ret & char
    Next
    TachChuoi = ret
End Function
 
Upvote 0
Có thể dùng hàm sau:
Mã:
Function sNotIn(Sour As String, Dest As String) As String
Dim aSour, Result As String, i As Long
    With Application
        Sour = .WorksheetFunction.Trim(Sour)
        Dest = .WorksheetFunction.Trim(Dest)
        aSour = Split(Sour, Space(1))
        For i = LBound(aSour) To UBound(aSour)
            Result = Result & IIf(InStr(1, Dest, aSour(i)) = 0, Space(1) & aSour(i), "")
        Next
        sNotIn = .WorksheetFunction.Trim(Result)
    End With
End Function

Khi đó, với GOC = " A B C D E " ; NGON = " M C E A N "
thì hàm: sNotIn(GOC, NGON) = "B D"
 
Upvote 0
Với bài này thì dùng đệ quy làm gì cho mệt. 1 vòng lặp là xong, vừa nhanh vừa dễ hiểu.
Mã:
Function TachChuoi(str1 As String, str2 As String) As String
    Dim i As Integer
    Dim ret As String
    Dim char As String
    For i = 1 To Len(str1)
        char = Mid(str1, i, 1)
        If InStr(1, str2, char) = 0 Then ret = ret & char
    Next
    TachChuoi = ret
End Function
Đúng vậy... chỉ là nghiên cứu thôi mà...
Có điều hàm của bạn vẫn còn thiếu ---> Thiếu ký tự " "
Ẹc... Ẹc...
 
Upvote 0
Có thể dùng hàm sau:
Mã:
Function sNotIn(Sour As String, Dest As String) As String
Dim aSour, Result As String, i As Long
    With Application
        Sour = .WorksheetFunction.Trim(Sour)
        Dest = .WorksheetFunction.Trim(Dest)
        aSour = Split(Sour, Space(1))
        For i = LBound(aSour) To UBound(aSour)
            Result = Result & IIf(InStr(1, Dest, aSour(i)) = 0, Space(1) & aSour(i), "")
        Next
        sNotIn = .WorksheetFunction.Trim(Result)
    End With
End Function
Khi đó, với GOC = " A B C D E " ; NGON = " M C E A N "
thì hàm: sNotIn(GOC, NGON) = "B D"
Hình như là cần phải hỏi lại tác giả về ý nghĩa của các dấu cách trong 2 cái chuỗi GOC, NGON, xem các dấu cách đó chỉ có ý nghĩa làm cho rõ các ký tự, hay đó là các dấu cách là bắt buộc phải chính xác như vậy ở 2 chuỗi đó. Với mỗi cách hiểu sẽ có cách giải khác nhau.
To ndu: Hàm của tôi viết hiểu theo hướng tính cả các dấu cách. Còn nếu bạn hiểu theo hướng dấu cách bắt buộc phải có ở các chuỗi thì hàm của bạn vẫn có vấn đề. GOC="1 a v c d", NGON="a x d f" thì hàm của bạn cho ra "1 v c", thừa 1 dấu cách. Với lại theo tôi, nếu đã dùng đệ quy thì sẽ không có vòng lặp trong thân hàm nữa.

Xin post thêm 1 hàm nữa dùng thử đệ quy và giải theo hướng trong GOC và NGON bắt buộc có các dấu cách để phân cách các ký tự và chỉ phân cách bởi 1 dấu cách.
Mã:
Function TachChuoiDQ(str1 As String, str2 As String)
    str1 = Trim(str1) & " "
    str2 = Trim(str2) & " "
    If Len(str2) < 2 Then
        TachChuoiDQ = Trim(str1)
    Else
        TachChuoiDQ = Trim(TachChuoiDQ(Replace(str1, Left(str2, 2), ""), Right(str2, Len(str2) - 2)))
    End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cảm ơn các bác!
Cái em cần là hàm sNotIn nó tách theo từ (Cách nhau dấu cách), chứ không phải từng ký tự.
 
Upvote 0
Rất cảm ơn các bác!
Cái em cần là hàm sNotIn nó tách theo từ (Cách nhau dấu cách), chứ không phải từng ký tự.
Tách từ theo dấu cách thì đây. Nhưng chưa hiểu ý bác muốn dùng làm gì?
Với hàm này thì dùng để lấy đoạn tên cuối cùng (hay Text cuối cùng).
Ví dụ: =Tachtenpo("Nguyễn Minh Thông") = "Thông"
PHP:
Function TachTenPo(HoTen As String) As String  '' Po_PiKachu
    Dim arr() As String
    IF HoTen = "" then TachTenPo = "Error": Exit Function
    arr() = Split(HoTen, " ")
    TachTenPo = arr(UBound(arr))
End Function
Nhưng theo em để tìm "B", "D" thì dùng vòng lặp quét là đơn giản nhất rồi!
Không biết bác có thể nói rõ hơn chăng?
PHP:
Function sNotIn(Goc As String, Nguon As String) As String   '' Po_PiKachu
    Dim arr() As String
    arr() = Split(Goc, " ")
    For j = LBound(arr) To UBound(arr)
        temp = temp & IIf(InStr(1, Nguon, arr(j)) = 0, " " & arr(j), "")
    Next
    sNotIn = Trim(temp)
End Function
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom