Cách loại bỏ những kí tự trùng nhau. (3 người xem)

  • Thread starter Thread starter haitvn
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

haitvn

Thành viên mới
Tham gia
4/6/09
Bài viết
1
Được thích
0
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
 
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
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
 

File đính kèm

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
Cái này phải dùng code bạn à!
PHP:
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
 

File đính kèm

Lần chỉnh sửa cuối:
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

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
 
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
Code đâu tiên có sai sót (do tôi không đọc kỹ yêu cầu) ---> Đã sửa lại!
Vụ không phân biết HOA thường dể mà ---> Ta dùng UCase biến Text thành hoa tất, sau đó mới xử lý tiếp

Nếu dữ liệu thật sự giống như những gì tác giả đưa lên (tức dữ liệu không phải là tiếng Việt có dấu) thì tôi còn có 1 chiêu khác cực ngắn
PHP:
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
Split(StrConv(Text, 64), Chr(0)) dùng để biến 1 chuổi thành 1 mãng với các phần tử chính là từng ký tự của chuổi
 
Chỉnh sửa lần cuối bởi điều hành viên:
Thử 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
 
Thử 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
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
 
Lần chỉnh sửa cuối:
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
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.
Còn dấu phẩy (,) khắc phục không khó.
 
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.
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)
 
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)
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
 

File đính kèm

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
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)
 
Lần chỉnh sửa cuối:

File đính kè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)
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à.
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
 
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à.
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
Ẹ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ó cao
Bạn hãy thí nghiệm code mình trong ví dụ này nhé:
- Cell A1 chứa Text -n-d-u-n-d-u-
- Dấu phân cách là dấu -
- Kết quả mong nhận được là n-d-u (chứ không phải làn-d-u-)
Ngoài ra: Bạn dùng StrConv cho bài này càng sai nặng!
Trong mục đố vui về VBA có lần tôi đã đề cập rồi, hàm này chỉ dùng để convert chuổi thành mãng trong trường hợp chuổi không được chứa ký tự tiếng Việt Unicode ---> Code tôi đưa ở bài trên có dùng hàm này cũng chỉ mang tính tham khảo ---> Sao bạn không dùng Replace như bài trước nhỉ?
------------------------------------
Có thời gian rảnh xin bạn cải tiến lại!
Tình huống vừa nêu trên, nếu dùng Dictionary Object lại chẳng ảnh hưởng gì
Chẳng hạn:
PHP:
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
------------------------------------
Nói riêng với bạn:
- Giải thuật lọc chuổi duy nhất trong trường hợp không có dấu phân cách như bạn đã làm, tôi công nhận đấy là ĐỘC ĐÁO (dùng Replace rất sáng tạo)
- Trường hợp dấu phân cách thì.. ẹc... ẹc... tôi cho rằng bạn hơi cố chấp (thuật toán rườm rà và không có độ chính xác cao)
 
Lần chỉnh sửa cuối:
Tôi dùng StrConv là để gom 2 trường hợp lại làm một cho code gọn thôi. Còn ai muốn dùng cho tiếng Việt thì cứ tách như code cũ thôi.
Nếu bạn nói như vậy thì tôi sửa lại như thế này vậy.
PHP:
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
Tôi không nói dùng Dictionary Object có gì sai trong trường hợp này cả. Giải thuật của tôi cũng chỉ là một trong nhiều phương án để tác giả và mọi người tham khảo thôi. Đúng hay sai không quan trọng, quan trọng là có thể áp dụng được những gì đọc được từ topic này vào mục đích riêng của từng người một cách hợp lý hay không mới là quan trọng.
 
Cho em ké với: Với các ô dữ liệu như trên, thì làm thế nào để chỉ giữ lại các ký tự khác nhau
Ví du:
ô 1: abca
ô 2:abcdcb
Làm thê nào để được
bc
ad
Thank cả nhà
 
Bạn có thể dùng hàm này:

PHP:
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

P/s: Chú ý nên mở chủ đề riêng chứ không chen ngang vào bài của người khác
 
Lần chỉnh sửa cuối:
:-=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
 
:-=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

Bạn viết thế này thì có thể bạn chưa biết lỗi bị xoá bài rồi. Mình nhắc lại để bạn thấy : Cả bài của bạn có dấu tiếng Việt nhưng tiêu đề lại không dấu tiếng Việt. Mình cũng đã đề nghị các Mod lui hạn xoá cho bạn vì bạn mới tham gia có 4 bài nhưng tiếc rằng bạn không sửa. Bạn phải thông cảm vì diễn đàn ngày càng đông thành viên mà nội quy không nghiêm sao đượ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
 
Web KT

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

Back
Top Bottom