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
Làm được, nhưng bạn phải liệt kê ra cho mọi người biết những dấu nào bạn cho là dấu phân cáchhic, bác sealand giúp em cho chót. Em muốn loại bỏ ký tự trùng nhau nhưng vẫn giữ lại khoảng trắng hoặc dấu phẩy
ab cd a --> d cd
1,2,3,2,5 --> 1,3,5
Thank bác
hic, bác sealand giúp em cho chót. Em muốn loại bỏ ký tự trùng nhau nhưng vẫn giữ lại khoảng trắng hoặc dấu phẩy
ab cd a --> d cd
1,2,3,2,5 --> 1,3,5
Thank bác
Function loc2(ch As String) As String
Dim i, Kq, ch1
ch = Trim(ch)
For i = 1 To Len(ch)
ch1 = Mid(ch, i, 1)
If ch1 = "," Or ch1 = " " Then Kq = Kq & ch1
If Len(ch) - Len(Replace(ch, ch1, "")) = 1 Then Kq = Kq & ch1
Next
Do
Kq = Replace(Kq, " ", " ")
Loop Until Len(Kq) = Len(Replace(Kq, " ", " "))
Do
Kq = Replace(Kq, ",,", ",")
Loop Until Len(Kq) = Len(Replace(Kq, ",,", ","))
Kq = Trim(Kq)
If Left(Kq, 1) = "," Then Kq = Right(Kq, Len(Kq) - 1)
If Right(Kq, 1) = "," Then Kq = Left(Kq, Len(Kq) - 1)
loc2 = Kq
End Function
Em thì làm vầy:Đây là hàm mình cũng chưa làm thủ tục tinh chỉnh phần thân chuỗi:
Tranh thủ viết xong giờ lại thấy đổi yêu cầu, mình sẽ làm lại sau vì giờ tan sở rồi.Mã:Function loc2(ch As String) As String Dim i, Kq, ch1 ch = Trim(ch) For i = 1 To Len(ch) ch1 = Mid(ch, i, 1) If ch1 = "," Or ch1 = " " Then Kq = Kq & ch1 If Len(ch) - Len(Replace(ch, ch1, "")) = 1 Then Kq = Kq & ch1 Next Do Kq = Replace(Kq, " ", " ") Loop Until Len(Kq) = Len(Replace(Kq, " ", " ")) Do Kq = Replace(Kq, ",,", ",") Loop Until Len(Kq) = Len(Replace(Kq, ",,", ",")) Kq = Trim(Kq) If Left(Kq, 1) = "," Then Kq = Right(Kq, Len(Kq) - 1) If Right(Kq, 1) = "," Then Kq = Left(Kq, Len(Kq) - 1) loc2 = Kq End Function
Function SingleChar(Text As String) As String
Dim i As Long, iCount As Long, k As Long
Dim TmpStr As String, Sep As String, Temp, Item, Arr()
If InStr(Text, " ") Then Sep = " "
If InStr(Text, ",") Then Sep = ","
Temp = Split(Text, Sep)
For Each Item In Temp
TmpStr = CStr(Item)
For i = 1 To Len(CStr(Item))
iCount = Len(Text) - Len(Replace(Text, Mid(CStr(Item), i, 1), ""))
If iCount > 1 Then TmpStr = Replace(TmpStr, Mid(CStr(Item), i, 1), "")
Next i
If TmpStr <> "" Then
ReDim Preserve Arr(k)
Arr(k) = TmpStr: k = k + 1
End If
Next Item
SingleChar = Join(Arr, Sep)
End Function
Cái gì cũng.. có thể làm được (miễn nó không vô lý)Bác ndu96081631 à, nếu phân biệt ab a b là các ký tự khác nhau, tức là ab khác a, khác b (ab a b a -->ab b) được không ạ
Thấy đơn giản vậy mà cũng khó nhai ---> Vấn đề ở chổ làm sao COUNTIF các phần tử trong 1 Array (trong khi hàm COUNTIF chỉ làm với Range)Em gửi file, của em có ba trường hợp. cảm ơn bác nodu. Em đang bắt chước để viết được các add in đơn giản![]()
Function ArrayCountIf(SrcArray, CriteriaValue)
Dim iCount As Long, Item
For Each Item In SrcArray
If Item = CriteriaValue Then iCount = iCount + 1
Next
ArrayCountIf = iCount
End Function
Function SingleChar(Text As String) As String
Dim k As Long, Sep As String, Temp, Item, Arr()
If InStr(Text, " ") Then Sep = " "
If InStr(Text, ",") Then Sep = ","
Temp = Split(Text, Sep)
For Each Item In Temp
If ArrayCountIf(Temp, Item) = 1 Then
ReDim Preserve Arr(k)
Arr(k) = Item: k = k + 1
End If
Next Item
SingleChar = Join(Arr, Sep)
End Function
Bac sealand làm về lĩnh vực gì nhỉ, em làm kế toán.
Ko biết có quyển sách hay hướng dẫn gì để viết những add in đơn giản ko ? Em mù vấn đề này quá
Up lại file xem thế nào nhéEm không tải được file đính kèm của bác, "Địa chỉ Tập Tin Ðính Kèm không đúng. Nếu địa chỉ này là chính xác, vui lòng gửi thư cho administrator"
Dùng hàm trên thì báo lỗ #name?
Bác up lại giúp em nhé.