Lọc dữ liệu trùng trong Excel

Liên hệ QC
Thưa các Thầy và các bạn,
P/S: HÔM NAY ĐƯỢC NGHỈ LÀM NGỒI XEM HƯỚNG DẪN VBA TRÊN YOUTUBE VÀ TRÊN GPE. EM XIN BÁO CÁO CŨNG CHƯA HIỂU ĐƯỢC GÌ NHIÊU
Báo cáo với bạn là trước kia tôi không hiểu bất cứ gì về code VBA. Tôi đưa yêu cầu và mọi người giúp, nếu thấy áp dụng vào công việc thì áp dụng cái đã khoan hãy học. lúc nào rảnh mới lấy ra mổ xẻ, nếu mổ xẻ 1 lần không hiểu tạm thời để đó khi nào có hứng thú thì mổ xẻ tiếp tin chắc là trong khoản thời gian ngắn bạn sẽ hiểu. (Nói chung giải quyết công việc là cái ưu tiên nhất)
Lúc trước tôi cứ lờ tờ mở có khi tôi thấy người ta ghi Range("A1"), có khi ghi cells(1,1), hoặc [A1], hoặc range(cells(1,1),cells(1,1)), hoặc end(1), end(2), end(xlup)... nó cứ lộn xộn tôi nhìn mà không hiểu mục đích để làm gì? rồi từ từ tôi thấy và ngộ nhận ra rằng à thì ra có 1 công việc mà có người viết rõ ràng tường minh, và có người viết tắc theo thứ tự xổ xuống. Sau khi có nội công rồi thì tự bạn có thể phát triển thêm code kiết, và có thể chọn lọc để đọc và tham khảo.
 
CẢM ƠN THẦY ndu96081631, hàm tự tạo của bạn phihndhsp em chưa hiểu lắm, em chuyển vào Macro chèn đoạn giữa (em có bỏ đoạn Function ra rồi ạ) Sub và End Sub em thấy nó đứng im re, bí quá em mới lọc thêm bằng công thức lần nữa, tới đó lại bí tiếp, nên mới hỏi thêm.

Mong Thầy chỉ dạy thêm đoạn code VBA này ạ. Cảm ơn Thầy
tuy rằng gần hết quota nhưng vẫn cố gắng gởi file cho bạn
 

File đính kèm

  • GPE LOC TRUNG SO THEO HANG (2).xlsb
    16.5 KB · Đọc: 57
Cảm ơn bạn phihndhsp nhiều, mình thấy VBA rất hay, mình đang cố gắng học thêm nữa.
 

File đính kèm

  • GPE LOC TRUNG SO THEO HANG (2) (1).xlsb
    16.5 KB · Đọc: 16
Mình có điều này chưa rõ, nhờ bạn phihndhsp giúp đỡ, nếu dãy đầu tiên "DAY 1" bị trống thì làm sao bẫy lỗi bỏ dấu "/" đầu dòng của ô kết quả. Nhờ bạn hướng dẫn giúp ạ.

Cảm ơn bạn phihndhsp nhiều nhé
Bạn xoá đoạn code đó, rồi thay bằng đoạn này
Mã:
 Function DuyNhat(Rng As Range) As String
 Dim Dic As Object
 Dim Cll As Range
 Dim temp As String
 temp = ""
 Set Dic = CreateObject("Scripting.Dictionary")
 For Each Cll In Rng
    If Not Dic.exists(Cll.Value) And Not (IsNull(Cll)) And Trim(Cll.Value) <> "" Then
              Dic.Add Cll.Value, 1
              temp = temp & Cll.Value & "/"
     End If
  Next
  
     If (temp = "/") Then
         DuyNhat = ""
     Else
      DuyNhat = Left(temp, Len(temp) - 2)
     End If
 End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn xoá đoạn code đó, rồi thay bằng đoạn này
Mã:
 Function DuyNhat(Rng As Range) As String
 Dim Dic As Object
 Dim Cll As Range
 Dim temp As String
 temp = ""
 Set Dic = CreateObject("Scripting.Dictionary")
 For Each Cll In Rng
    If Not Dic.exists(Cll.Value) [COLOR=#ff0000]And Not (IsNull(Cll))[/COLOR] And Trim(Cll.Value) <> "" Then
              Dic.Add Cll.Value, 1
              temp = temp & Cll.Value & "/"
     End If
  Next
  
     If (temp = "/") Then
         DuyNhat = ""
     Else
      DuyNhat = Left(temp, Len(temp) - 2)
     End If
 End Function

Chỗ màu đỏ gần như chả có tác dụng gì! Bỏ luôn cũng được
Code này còn phải sửa nhiều mới xong, chẳng hạn với đối số Rng, nếu người dùng chọn vào 1 vùng nào đó có cell bị lỗi thì.. tèo
Ngoài ra tôi thấy lạ: Phi dùng dictionray vậy sao còn nối chuỗi thông thường làm chi (temp = temp & Cll.Value & "/"). Tại sao không dùng Join? (DuyNhat = Join(Dic.Keys, "/")
 
Thưa thầy Tuấn và bạn Phi, do em mới học hỏi thêm VBA, nên còn nhiều câu hỏi dốt đặc xin Thầy và Bạn hướng dẫn thêm ạ.
Công thức tự tạo bị lỗi ạ. Lọc lấy ra dãy cuối luôn bị mất số cuối cùng của dãy này
Công ty em chỉ yêu cầu lọc trùng đến mức như vậy, nhưng em thấy thắc mắc xin hỏi thêm theo như file đính kèm.
Chỗ màu đỏ gần như chả có tác dụng gì! Bỏ luôn cũng được
Code này còn phải sửa nhiều mới xong, chẳng hạn với đối số Rng, nếu người dùng chọn vào 1 vùng nào đó có cell bị lỗi thì.. tèo
Ngoài ra tôi thấy lạ: Phi dùng dictionray vậy sao còn nối chuỗi thông thường làm chi (temp = temp & Cll.Value & "/"). Tại sao không dùng Join? (DuyNhat = Join(Dic.Keys, "/")
=> Thầy có cách nào thêm cho em xin với ạ

Đây là phần em hiểu nhờ Thầy và Bạn chỉ thêm giúp em:
Function DuyNhat(Rng As Range) As String Dim Dic As Object
Dim Cll
As Range
Dim temp
As String

temp
= "" 'vì sao cho temp ="" ở đây ạ?

Set Dic = CreateObject("Scripting.Dictionary") '
Set cái này để lọc dữ liệu trùng phải không ạ?

For
Each Cll In Rng

If Not Dic.exists(Cll.Value) And Not (IsNull(Cll)) And Trim(Cll.Value) <> "" Then
'Em hiểu như vầy có đúng ko ạ: Kiểm tra sự tồn tại của giá trị Cll và giá trị Cll khác 0 và bỏ đi khoảng trắng của giá trị Cll khác rỗng hay không Thì, VẬY KIỂM TRA GIÁ TRỊ Cll TỒN TẠI ĐỂ LÀM GÌ TRONG KHI NÓ HIỆN HỮU TRONG BẢNG TÍNH?

Dic.Add Cll.Value, 1 '
Thêm giá trị Cll vào Key, 1 vào Item.

temp = temp & Cll.Value & "/" ' Trả ra kết quả là rỗng & giá trị Cll & dấu /. VẬY TẠI SAO Ở ĐÂY DẤU / EXCEL HIỂU LÀ CHÈN VÀO GIỮA CÁC GIÁ TRỊ Cll

DuyNhat = Join(Dic.Keys, "/")'
Trả ra kết quả theo code thầy Tuấn, em hiểu như vầy: gom các giá trị Key của Dic chèn vào dấu / phải không ạ?
End If
Next

If (temp = "/") Then 'tại sao có thêm temp ="/" ạ?
DuyNhat = ""
Else

DuyNhat = Left(temp, Len(temp) - 2) '
theo em thấy lấy bên trái dấu "/" thông thường là -1 tại sao ở đây trừ 2 ạ?

End If
End Function

CẢM ƠN THẦY TUẤN VÀ BẠN PHI NHIỀU Ạ.

 

File đính kèm

  • GPE LOC TRUNG SO THEO HANG (2) (1).xlsb
    18.1 KB · Đọc: 16
Lần chỉnh sửa cuối:
Thưa thầy Tuấn và bạn Phi, do em mới học hỏi thêm VBA, nên còn nhiều câu hỏi dốt đặc xin Thầy và Bạn hướng dẫn thêm ạ.
Công thức tự tạo bị lỗi ạ. Lọc lấy ra dãy cuối luôn bị mất số cuối cùng của dãy này
Công ty em chỉ yêu cầu lọc trùng đến mức như vậy, nhưng em thấy thắc mắc xin hỏi thêm theo như file đính kèm.

=> Thầy có cách nào thêm cho em xin với ạ

Đây là phần em hiểu nhờ Thầy và Bạn chỉ thêm giúp em:
Function DuyNhat(Rng As Range) As String Dim Dic As Object
Dim Cll
As Range
Dim temp
As String

temp
= "" 'vì sao cho temp ="" ở đây ạ?

Set Dic = CreateObject("Scripting.Dictionary") '
Set cái này để lọc dữ liệu trùng phải không ạ?

For
Each Cll In Rng

If Not Dic.exists(Cll.Value) And Not (IsNull(Cll)) And Trim(Cll.Value) <> "" Then
'Em hiểu như vầy có đúng ko ạ: Kiểm tra sự tồn tại của giá trị Cll và giá trị Cll khác 0 và bỏ đi khoảng trắng của giá trị Cll khác rỗng hay không Thì, VẬY KIỂM TRA GIÁ TRỊ Cll TỒN TẠI ĐỂ LÀM GÌ TRONG KHI NÓ HIỆN HỮU TRONG BẢNG TÍNH?

Dic.Add Cll.Value, 1 '
Thêm giá trị Cll vào Key, 1 vào Item.

temp = temp & Cll.Value & "/" ' Trả ra kết quả là rỗng & giá trị Cll & dấu /. VẬY TẠI SAO Ở ĐÂY DẤU / EXCEL HIỂU LÀ CHÈN VÀO GIỮA CÁC GIÁ TRỊ Cll

DuyNhat = Join(Dic.Keys, "/")'
Trả ra kết quả theo code thầy Tuấn, em hiểu như vầy: gom các giá trị Key của Dic chèn vào dấu / phải không ạ?
End If
Next

If (temp = "/") Then 'tại sao có thêm temp ="/" ạ?
DuyNhat = ""
Else

DuyNhat = Left(temp, Len(temp) - 2) '
theo em thấy lấy bên trái dấu "/" thông thường là -1 tại sao ở đây trừ 2 ạ?

End If
End Function

CẢM ƠN THẦY TUẤN VÀ BẠN PHI NHIỀU Ạ.

Bạn sửa hàm thành vầy:
Mã:
Function DuyNhat(ByVal VungDuLieu As Range, ByVal PhanCach As String) As String
  Dim dic As Object, arr
  Dim item
  Dim tmp As String
  arr = VungDuLieu.Value
  Set dic = CreateObject("Scripting.Dictionary")
  For Each item In arr
    If TypeName(item) <> "Error" Then ''<--- Loại bỏ giá trị lỗi
      tmp = CStr(item) ''<--- cho giá trị vào biến tạm
      If Len(tmp) Then  ''<--- Nếu chuỗi khác rổng thì đi tiếp
        If Not dic.Exists(tmp) Then dic.Add tmp, "" ''<-- Xét giá trị nếu chưa có trong dic thì mới Add vào
      End If
    End If
  Next
  If dic.Count Then DuyNhat = Join(dic.Keys, PhanCach) ''Nếu có dữ liệu trong Dic thì mới tiến hành nối chuỗi
End Function
Trên bảng tính, tại cell F2 bạn gõ công thức:
Mã:
=DuyNhat(A2:E2,"/")
--------------------
Còn về câu hỏi thứ 2 trong file thì... e rằng phải sửa code rất nhiều mới có kết quả như mong muốn
 
Bạn sửa hàm thành vầy:
Còn về câu hỏi thứ 2 trong file thì... e rằng phải sửa code rất nhiều mới có kết quả như mong muốn

Thưa thầy Tuấn,

Em gặp vấn đề như em đã nêu câu hỏi hôm trước, Chị Sếp mới bên em về bắt em phải lọc bỏ luôn những số trùng trong chuỗi ký tự để cho gọn. Tại em lanh //////, copy paste ngon lành công thức của Thầy, Sếp em tưởng em ngon lành cành đào với excel giờ em còn được ấn thêm cái deadline thứ 6 tuần này phải nộp lại cho Sếp để Sếp thuyết trình tuần sau, nếu Thầy có thời gian Thầy hướng dẫn giải giúp em. Vì Macro e còn ngu quá ạ+-+-+-+. Em cảm ơn Thầy nhiều. Em gởi file đính kèm
 

File đính kèm

  • GPE LOC TRUNG SO THEO HANG.xlsb
    17.2 KB · Đọc: 15
Thưa thầy Tuấn,

Em gặp vấn đề như em đã nêu câu hỏi hôm trước, Chị Sếp mới bên em về bắt em phải lọc bỏ luôn những số trùng trong chuỗi ký tự để cho gọn. Tại em lanh //////, copy paste ngon lành công thức của Thầy, Sếp em tưởng em ngon lành cành đào với excel giờ em còn được ấn thêm cái deadline thứ 6 tuần này phải nộp lại cho Sếp để Sếp thuyết trình tuần sau, nếu Thầy có thời gian Thầy hướng dẫn giải giúp em. Vì Macro e còn ngu quá ạ+-+-+-+. Em cảm ơn Thầy nhiều. Em gởi file đính kèm

Câu hỏi hôm trước còn nhiều chỗ phải bàn lại. Chẳng hạn kết quả tại cell F8 là B4472606/L9552/L955236 Tại sao không bỏ L9552? Chẳng phải L9552 cũng trùng với L955236 sao?
 
Câu hỏi hôm trước còn nhiều chỗ phải bàn lại. Chẳng hạn kết quả tại cell F8 là B4472606/L9552/L955236 Tại sao không bỏ L9552? Chẳng phải L9552 cũng trùng với L955236 sao?
Dạ, thưa Thầy, chuỗi này yêu cầu bỏ dữ liệu trùng trước, sau đó bỏ thêm dãy số mà trùng số với dãy chữ số khác. Em xin ví dụ: Ta có chuỗi: B4472606/L9552 / L955236/ L0955236/ 955236 (sau khi đã bỏ dữ liệu trùng), cần kết quả mới là: B4472606/L9552/L955236. Bỏ đi L0955236 và 955236 vì đều có còn số 955236. Không bỏ L9552 vì 9552 chỉ có 4 số, khác với 955326 có đến 6 số ạ. Nếu có gì Thầy chưa hiểu ý em nhờ Thầy chia sẽ và giải giúp em ạ. Em cảm ơn Thầy nhiều ạ.
 
Dạ, thưa Thầy, chuỗi này yêu cầu bỏ dữ liệu trùng trước, sau đó bỏ thêm dãy số mà trùng số với dãy chữ số khác. Em xin ví dụ: Ta có chuỗi: B4472606/L9552 / L955236/ L0955236/ 955236 (sau khi đã bỏ dữ liệu trùng), cần kết quả mới là: B4472606/L9552/L955236. Bỏ đi L0955236 và 955236 vì đều có còn số 955236. Không bỏ L9552 vì 9552 chỉ có 4 số, khác với 955326 có đến 6 số ạ. Nếu có gì Thầy chưa hiểu ý em nhờ Thầy chia sẽ và giải giúp em ạ. Em cảm ơn Thầy nhiều ạ.

Yêu cầu này e rằng tôi.. không biết làm
 
!$@!! Thầy là người thượng thừa về Excel mà bo tay thì em cũng trói tay thôi, theo đề bài như vậy nhờ Thầy cho em thêm hướng giải quyết bài này ạ. Em cảm ơn Thầy
 
Lần chỉnh sửa cuối:
!$@!! Thầy là người thượng thừa về Excel mà bo tay thì em cũng trói tay thôi
Sai rồi! Tôi không làm được thôi chứ GPE này thiếu chi cao thủ, chắc chắn sẽ có người giúp bạn
(Bác Cò, Anh Ba Tê là chuyên gia xử những "ca" khó hiểu thế này đây)
 
Dạ, vậy làm sao em gởi bài này để các Thầy khác giúp đỡ em ạ. Thầy trong bản quản trị nhờ Thầy chuyển bài này giúp em được không ạ? Hay em phải đăng ở mục khác, em cũng sợ đăng nhiều mục quá bị nhắc nhỡ. Cảm ơn Thầy
 
Thử hàm này xem sao. Phước chủ may thầy!
PHP:
Function LocDuyNhat(Rng As Range, Del As String) As String
Dim D1 As Object, D2 As Object, tam()
Dim j As Long, Reg As Object, Mem As String
Set D1 = CreateObject("Scripting.Dictionary")
Set D2 = CreateObject("Scripting.Dictionary")
Set Reg = CreateObject("vbscript.regexp")
Reg.Global = True
Reg.Pattern = "\D"
tam = Rng.Value
For j = 1 To UBound(tam, 2)
   If tam(1, j) <> "" Then
      Mem = Reg.Replace(tam(1, j), "")
      If Not D2.exists(Mem) Then
         If Not D1.exists(Mem) Then
            D1.Add tam(1, j), ""
            D2.Add Mem, ""
         End If
      End If
   End If
Next
LocDuyNhat = Join(D1.keys, Del)
End Function
 
Lần chỉnh sửa cuối:
Chị Sếp mới bên em về bắt em phải lọc bỏ luôn những số trùng trong chuỗi ký tự để cho gọn

Góp một hàm tự tạo, bạn kiểm tra xem thế nào
Mã:
Public Function SoSanh(DL As Range, Dau As String)
Dim i As Long, j As Long, Tam

Tam = DL
With CreateObject("scripting.dictionary")
For i = 1 To UBound(Tam, 2)
If Not .exists(Tam(1, i)) Then
.Add Tam(1, i), ""
End If
Next i
Tam = .keys
End With

With CreateObject("vbscript.regexp")
For i = 0 To UBound(Tam)
.Pattern = "[a-zA-Z]+"
If .test(Tam(i)) = False Then
.Pattern = "\d+"

For j = 0 To UBound(Tam)
If j <> i And .test(Tam(j)) Then
If Val(Tam(i)) = Val(.Execute(Tam(j))(0)) Then
Tam(i) = ""
End If
End If
Next j

End If
Next i
End With

SoSanh = Replace(Application.Trim(Join(Tam, " ")), " ", Dau)
End Function
 

File đính kèm

  • GPE LOC TRUNG SO THEO HANG.xls
    40.5 KB · Đọc: 32
Bạn xem thử, xem đúng ý chưa. .
 

File đính kèm

  • GPE LOC TRUNG SO THEO HANG.xlsb
    18.2 KB · Đọc: 37
Sai rồi! Tôi không làm được thôi chứ GPE này thiếu chi cao thủ, chắc chắn sẽ có người giúp bạn
(Bác Cò, Anh Ba Tê là chuyên gia xử những "ca" khó hiểu thế này đây)
Anh quên mất tên em rồi, ẹc. Em cũng thuộc dạng bác sĩ miệt vườn nè. Chuyên mỗ những ca cực kỳ cục cựa. Đa số bệnh nhân đều ngủm củ tỏi.
 
Web KT
Back
Top Bottom