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!
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
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
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
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
Đúng vậy... chỉ là nghiên cứu thôi mà...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
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.Có thể dùng hàm sau:
Khi đó, với GOC = " A B C D E " ; NGON = " M C E A N "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
thì hàm: sNotIn(GOC, NGON) = "B D"
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
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ì?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ự.
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
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
TachChuoi = Trim(Replace(TachChuoi, Mid(Str2, i, 1), ""))
arr() = Split(Nguon, " ")
For j = LBound(arr) To UBound(arr)
temp = Replace(Goc, arr(j),"")
goc=temp
Next