Bạn hỏi sao mình trả lời vậy, áp dụng vào thực tế sai ráng chịu nghe. Để chính xác được yêu cầu của bạn, bạn nên gửi file của bạn lên diễn đànLàm ơn giúp mình giải quyết vần đề sau nhé.
Mình có các dòng như sau :
FGFG
FC1JFC1J
WUWU
FL,FC,FGFL,FC,FG
Làm thế nào để có kết quả :
FG
FC1J
FL,FC,FG
Cái này phải dùng code bạn à!Làm ơn giúp mình giải quyết vần đề sau nhé.
Mình có các dòng như sau :
FGFG
FC1JFC1J
WUWU
FL,FC,FGFL,FC,FG
Làm thế nào để có kết quả :
FG
FC1J
FL,FC,FG
Function StrUnique(Text As String) As String
Dim i As Long, Temp
On Error Resume Next
If InStr(Text, ",") Then
Temp = Split(Text, ",")
With CreateObject("Scripting.Dictionary")
For i = 0 To UBound(Temp)
.Add Temp(i), ""
Next i
StrUnique = Join(.Keys, ",")
End With
Else
StrUnique = Left(Text, 1)
For i = 1 To Len(Text)
If InStr(StrUnique, Mid(Text, i, 1)) = 0 Then StrUnique = StrUnique & Mid(Text, i, 1)
Next i
End If
End Functionn
Cái này phải dùng code bạn à!
PHP:Function StrUnique(Text As String) As String Dim i As Long On Error Resume Next With CreateObject("Scripting.Dictionary") For i = 1 To Len(Text) If Not .Exists(Mid(Text, i, 1)) Then _ .Add Mid(Text, i, 1), "" Next i StrUnique = Join(.Keys, "") End With End Function
Code đâu tiên có sai sót (do tôi không đọc kỹ yêu cầu) ---> Đã sửa lại!Hay quá ! Có cách nào cho nó không phân biệt chữ hoa và thường không Thầy ?
VD: DDDDDdddd -> là D hoặc d
Function StrUnique(Text As String) As String
Dim i As Long, Temp
Temp = IIf(InStr(Text, ","), Split(Text, ","), Split(StrConv(Text, 64), Chr(0)))
With CreateObject("Scripting.Dictionary")
For i = 0 To UBound(Temp)
If Not .Exists(Temp(i)) Then .Add Temp(i), ""
Next i
StrUnique = Join(.Keys, IIf(InStr(Text, ","), ",", ""))
End With
End Function
Function MyFunction(str As String) As String
Do Until i = Len(str)
i = i + 1
str = Left(str, i) & Replace(Right(str, Len(str) - i), Mid(str, i, 1), "")
Loop
MyFunction = str
End Function
Vậy là bạn không xem kỹ yêu cầu rồiThử cách này xem. Sẽ rút gọn được số lần duyệt của vòng lặp. Tốc độ sẽ được cải thiện.
PHP:Function MyFunction(str As String) As String Do Until i = Len(str) i = i + 1 str = Left(str, i) & Replace(Right(str, Len(str) - i), Mid(str, i, 1), "") Loop MyFunction = str End Function
Có lẽ bạn chưa hiểu thuật toán trong code của tôi. Bạn xem như thế nào mà bảo là duyệt từ 1 đến Len(Chuỗi) nhỉ??? Code của tôi chỉ duyệt qua số lần là số ký tự duy nhất trong chuỗi. "aaaaaaa" -> duyệt 1 lần, "abaaababaab" -> duyệt 2 lần.Vậy là bạn không xem kỹ yêu cầu rồi
Chuổi FL,FC,FG,FL,FC,FG sau khi qua UDF sẽ cho kết quả là FL,FC,FG chứ không phải FL,CG
Vả lại, xét về tốc độ thì vẫn thế, đằng nào cũng phải duyệt từ 1 đến Len(Chuổi), chẳng thể bớt hơn nữa, nên không thể nói rằng tốc độ đã cải thiện được
Vâng! Giải thuật Replace này hoàn toàn chính xácCó lẽ bạn chưa hiểu thuật toán trong code của tôi. Bạn xem như thế nào mà bảo là duyệt từ 1 đến Len(Chuỗi) nhỉ??? Code của tôi chỉ duyệt qua số lần là số ký tự duy nhất trong chuỗi. "aaaaaaa" -> duyệt 1 lần, "abaaababaab" -> duyệt 2 lần.
Còn dấu phẩy (,) khắc phục không khó.
Vâng! Giải thuật Replace này hoàn toàn chính xác
Lở rồi, bạn làm luôn vụ dấu phẩy đi cho mọi người học hỏi với nhé!
(Tôi vẫn chưa nghĩ ra)
Function MyFunction(Str As String, Optional C As String = "") As String
If C = "" Then
Do Until i = Len(Str)
i = i + 1
Str = Left(Str, i) & Replace(Right(Str, Len(Str) - i), Mid(Str, i, 1), "")
Loop
MyFunction = Str
Else
Dim IStr As String
Str = C & Replace(Str, C, C & C) & C
Do Until i = Len(Str)
IStr = Mid(Str, i + 1, InStr(Mid(Str, i + 2), C) + 1)
i = i + Len(IStr)
Str = Left(Str, i) & Replace(Right(Str, Len(Str) - i), IStr, "")
Loop
MyFunction = Mid(Replace(Str, C & C, C), 2, Len(Replace(Str, C & C, C)) - 2)
End If
End Function
Chưa được bạn à!PHP:Function MyFunction(Str As String, Optional C As String = "") As String If C = "" Then Do Until i = Len(Str) i = i + 1 Str = Left(Str, i) & Replace(Right(Str, Len(Str) - i), Mid(Str, i, 1), "") Loop MyFunction = Str Else Dim IStr As String Str = C & Replace(Str, C, C & C) & C Do Until i = Len(Str) IStr = Mid(Str, i + 1, InStr(Mid(Str, i + 2), C) + 1) i = i + Len(IStr) Str = Left(Str, i) & Replace(Right(Str, Len(Str) - i), IStr, "") Loop MyFunction = Mid(Replace(Str, C & C, C), 2, Len(Replace(Str, C & C, C)) - 2) End If End Function
Bạn hỏi sao mình trả lời vậy, áp dụng vào thực tế sai ráng chịu nghe. Để chính xác được yêu cầu của bạn, bạn nên gửi file của bạn lên diễn đàn
Tôi không nghĩ vấn đề này gây khó khăn cho bạn. Đơn giản chỉ cần chuyển dấu phân cách về một kí tự đặc biệt nào đó là xong thôi mà.Chưa được bạn à!
Thử với text này:
Tu--an--tri--Tu--an
Với dấu phân cách là --
Nó cho kết quả là -Tu--antr
Mà lý ra phải là Tu--an--tri
Các giải thuật sử dụng hàm Replace đều phải hết sức cẩn thận, nếu không sẽ bị nhầm ngay!
Trích lọc duy nhất tôi nghĩ dùng Dictionary Object là chắc ăn như bắp ----> Không bao giờ có chuyện nhầm (mà việc dùng code lại cực đơn giản)
Function MyFunction(Str As String, Optional K As String = "") As String
Dim IStr As String, C As String
Str = Join(IIf(K = "", Split(StrConv(Str, 64), Chr(0)), Split(Str, K)), vbBack)
C = vbBack
Str = C & Replace(Str, C, C & C) & C
Do Until i = Len(Str)
IStr = Mid(Str, i + 1, InStr(Mid(Str, i + 2), C) + 1)
i = i + Len(IStr)
Str = Left(Str, i) & IIf(IStr = C & C, Right(Str, Len(Str) - i), Replace(Right(Str, Len(Str) - i), IStr, ""))
Loop
MsgBox Str
MyFunction = Mid(Replace(Str, C & C, K), 2, Len(Replace(Str, C & C, K)) - 2)
End Function
Ẹc... Ẹc.... Mình cũng rất khoái những cái gì gọi là LẠ và thử thách mình trong những tình huống có độ khó caoTôi không nghĩ vấn đề này gây khó khăn cho bạn. Đơn giản chỉ cần chuyển dấu phân cách về một kí tự đặc biệt nào đó là xong thôi mà.
Tất cả chúng ta tham gia diễn đàn này đều với mục đích trao đổi và học hỏi nên tôi nghĩ đơn giản chưa phải là tốt. Mà ngược lại, thuật toán càng lạ tôi lại càng thích.
PHP:Function MyFunction(Str As String, Optional K As String = "") As String Dim IStr As String, C As String Str = Join(IIf(K = "", Split(StrConv(Str, 64), Chr(0)), Split(Str, K)), vbBack) C = vbBack Str = C & Replace(Str, C, C & C) & C Do Until i = Len(Str) IStr = Mid(Str, i + 1, InStr(Mid(Str, i + 2), C) + 1) i = i + Len(IStr) Str = Left(Str, i) & IIf(IStr = C & C, Right(Str, Len(Str) - i), Replace(Right(Str, Len(Str) - i), IStr, "")) Loop MsgBox Str MyFunction = Mid(Replace(Str, C & C, K), 2, Len(Replace(Str, C & C, K)) - 2) End Function
Temp = Split(Text, Sep)
With CreateObject("Scripting.Dictionary")
For i = 0 To UBound(Temp)
If Not .Exists(Temp(i)) And Temp(i) <> "" Then .Add Temp(i), ""
Next i
StrUnique = Join(.Keys, Sep)
End With
Function MyFunction(Str As String, Optional K As String = "") As String
Dim IStr As String, C As String
Str = Replace(Replace(Application.WorksheetFunction.Trim(Replace(Replace(Str, " ", vbBack), K, " ")), " ", K), vbBack, " ")
Str = Join(IIf(K = "", Split(StrConv(Str, 64), Chr(0)), Split(Str, K)), vbBack)
C = vbBack
Str = C & Replace(Str, C, C & C) & C
Do Until i = Len(Str)
IStr = Mid(Str, i + 1, InStr(Mid(Str, i + 2), C) + 1)
i = i + Len(IStr)
Str = Left(Str, i) & IIf(IStr = C & C, Right(Str, Len(Str) - i), Replace(Right(Str, Len(Str) - i), IStr, ""))
Loop
MyFunction = Mid(Replace(Str, C & C, C), 2, Len(Replace(Str, C & C, C)) - 2)
MyFunction = Replace(MyFunction, C, K)
End Function
Option Explicit
Function loc(ch As String) As String
Dim Kt
ch = Trim(ch)
Do
Kt = Left(ch, 1)
If InStr(2, ch, Kt) = 0 Then loc = loc & Kt
ch = Replace(ch, Kt, "")
Loop Until Len(ch) = 0
End Function
Thank bác, em đã mở chủ đề riêng hai lần, nhưng mod đều xóa, có lẽ do mod nghĩ trùng với chủ đề này