Mọi người giúp mình cách xoá bỏ dữ liệu trùng trong 1 cột. (9 người xem)

Liên hệ QC

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

hungảu

Thành viên mới
Tham gia
13/1/09
Bài viết
5
Được thích
0
Mọi người giúp mình với tìm đang gặp rắc rối với vấn đề này tìm hiểu mấy ngày rồi mà không ra nên nhờ các bạn ở giải pháp excel giúp đỡ.%#^#$
dữ liệu mình ví dụ như sau:

A
B
C
A
----> sau khi lọc và xóa
B
C
sau khi lọc chỉ còn những dữ liệu không trùng thôi, xóa các dữ liệu bị trùng. Dữ liệu trên 1 cột thôi các bạn nha. Mong các bạn giúp đỡ !!$@!!
 
Bạn dùng hàm countif() tại cột bên cạnh để kiểm tra em nào xuất hiện nhiều hơn 1 lần, sau đó dùng autofilter xoá
 
Bạn dùng hàm countif() tại cột bên cạnh để kiểm tra em nào xuất hiện nhiều hơn 1 lần, sau đó dùng autofilter xoá

Quang Hài làm thử bài này bằng VBA xem!
Cũng khá hay nếu như có thể giải quyết được với ít lần lập nhất (không dùng WorksheetFunction để kiểm tra nha)
Ẹc... Ẹc...
 
cảm ơn bạn. nhưng nếu thế mình có thể dùng "remove duplicates" để xóa những dữ liệu trùng. ý mình là xóa luôn những cái bị trùng còn cái không trùng thôi.

A
B
C
A
----> sau khi lọc và xóa
B
C

BạN GIúP MìNH NHA!%#^#$
 
cảm ơn bạn. nhưng nếu thế mình có thể dùng "remove duplicates" để xóa những dữ liệu trùng. ý mình là xóa luôn những cái bị trùng còn cái không trùng thôi.

A
B
C
A
----> sau khi lọc và xóa
B
C

BạN GIúP MìNH NHA!%#^#$

Dùng countif() nếu lớn hơn hoặc = 2 thì xóa đi, thì nó ra như Kết qủa bạn muốn mà!
 
cảm ơn bạn. nhưng nếu thế mình có thể dùng "remove duplicates" để xóa những dữ liệu trùng. ý mình là xóa luôn những cái bị trùng còn cái không trùng thôi.

A
B
C
A
----> sau khi lọc và xóa
B
C

BạN GIúP MìNH NHA!%#^#$
Bạn có cố tìm hiểu những gì mình diễn tả chưa?
1. Dùng hàm countif() để đếm số lần xuất hiện của dữ liệu
2. Dùng autofilter lọc theo dk khác 1
3. Xoá cả dòng hay xoá thế nào đó tuỳ bạn

... Buồn
 
ok, mình thử và được rồi bạn. cảm ơn bạn nha!
 
Quang Hài làm thử bài này bằng VBA xem!
Cũng khá hay nếu như có thể giải quyết được với ít lần lập nhất (không dùng WorksheetFunction để kiểm tra nha)
Ẹc... Ẹc...
Cũng hơi khó đối với khả năng của em nhưng cố hết sức để anh thấy đàn em của anh tiến bộ hơn trước. Góp ý cho em nha.
PHP:
Sub khong_trung()
Dim dic1 As Object, dic2 As Object, i
Set dic1 = CreateObject("scripting.dictionary")
Set dic2 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
With dic1
   For i = 1 To UBound(dk)
      If Not .exists(dk(i, 1)) Then
      .Add dk(i, 1), ""
      Else
         If Not dic2.exists(dk(i, 1)) Then dic2.Add dk(i, 1), ""
      End If
   Next
   .RemoveAll
   For i = 1 To UBound(dk)
      If Not dic2.exists(dk(i, 1)) Then .Add dk(i, 1), ""
   Next
   [b1].Resize(.Count, 1) = Application.Transpose(.keys)
End With
End Sub
 
Lần chỉnh sửa cuối:
Mọi người giúp mình với tìm đang gặp rắc rối với vấn đề này tìm hiểu mấy ngày rồi mà không ra nên nhờ các bạn ở giải pháp excel giúp đỡ.%#^#$
dữ liệu mình ví dụ như sau:

A
B
C
A
----> sau khi lọc và xóa
B
C
sau khi lọc chỉ còn những dữ liệu không trùng thôi, xóa các dữ liệu bị trùng. Dữ liệu trên 1 cột thôi các bạn nha. Mong các bạn giúp đỡ !!$@!!
đây là bài toán lọc và rút trích tại chỗ.
 
Cũng hơi khó đối với khả năng của em nhưng cố hết sức để anh thấy đàn em của anh tiến bộ hơn trước. Góp ý cho em nha.
PHP:
Sub khong_trung()
Dim dic1 As Object, dic2 As Object, i
Set dic1 = CreateObject("scripting.dictionary")
Set dic2 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
With dic1
   For i = 1 To UBound(dk)
      If Not .exists(dk(i, 1)) Then
      .Add dk(i, 1), ""
      Else
         If Not dic2.exists(dk(i, 1)) Then dic2.Add dk(i, 1), ""
      End If
   Next
   .RemoveAll
   For i = 1 To UBound(dk)
      If Not dic2.exists(dk(i, 1)) Then .Add dk(i, 1), ""
   Next
   [b1].Resize(.Count, 1) = Application.Transpose(.keys)
End With
End Sub
- Thứ nhất: Phạm luật vì dùng WorksheetFunction (như tôi nói ở trên) nha
- Thừ hai: Chưa bẫy lỗi (chẳng hạn toàn bộ dữ liệu đều trùng hoặc không có dữ liệu nào)
- Thứ ba: Dùng 1 Dictionary cũng được vậy! Chẳng hạn thế này:
Mã:
 If Not .exists(dk(i, 1)) Then
   .Add dk(i, 1), [COLOR=#ff0000][B]1[/B][/COLOR]
  Else
   [COLOR=#ff0000][B].Item(dk(i, 1)) = .Item(dk(i, 1)) + 1[/B][/COLOR]
End If
tiếp theo ta sẽ xét thằng Key nào có Item = 1 thì lấy
vân vân....
Ẹc... Ẹc... Cố lên!
(Chủ nhật chẳng có quái gì để làm nên phải bày chuyện ra cho đở buồn --=0)
 
Lần chỉnh sửa cuối:
- Thứ nhất: Phạm luật vì dùng WorksheetFunction (như tôi nói ở trên) nha
- Thừ hai: Chưa bẫy lỗi (chẳng hạn toàn bộ dữ liệu đều trùng hoặc không có dữ liệu nào)
- Thứ ba: Dùng 1 Dictionary cũng được vậy! Chẳng hạn thế này:
Mã:
 If Not .exists(dk(i, 1)) Then
   .Add dk(i, 1), [COLOR=#ff0000][B]1[/B][/COLOR]
  Else
   [COLOR=#ff0000][B].Item(dk(i, 1)) = .Item(dk(i, 1)) + 1[/B][/COLOR]
End If
tiếp theo ta sẽ xét thằng Key nào có Item = 1 thì lấy
vân vân....
Ẹc... Ẹc... Cố lên!
(Chủ nhật chẳng có quái gì để làm nên phải bày chuyện ra cho đở buồn --=0)
Em giải thế này anh xem coi tạm được chưa.

PHP:
Sub khong_trung()
Dim dic1 As Object, i, j
Set dic1 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
ReDim arr(1 To UBound(dk), 1 To 1)
With dic1
   For i = 1 To UBound(dk)
      If Not .exists(dk(i, 1)) Then
         .Add dk(i, 1), 1
      Else
         .Item(dk(i, 1)) = .Item(dk(i, 1)) + 1
      End If
   Next
   Items = .Items:   keys = .keys
   For i = 0 To UBound(Items)
      If Items(i) = 1 Then
         j = j + 1
         arr(j, 1) = keys(i)
      End If
   Next
End With
If j Then [b1].Resize(j, 1) = arr
End Sub
 
Em giải thế này anh xem coi tạm được chưa.

PHP:
Sub khong_trung()
Dim dic1 As Object, i, j
Set dic1 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
ReDim arr(1 To UBound(dk), 1 To 1)
With dic1
   For i = 1 To UBound(dk)
      If Not .exists(dk(i, 1)) Then
         .Add dk(i, 1), 1
      Else
         .Item(dk(i, 1)) = .Item(dk(i, 1)) + 1
      End If
   Next
   Items = .Items:   keys = .keys
   For i = 0 To UBound(Items)
      If Items(i) = 1 Then
         j = j + 1
         arr(j, 1) = keys(i)
      End If
   Next
End With
If j Then [b1].Resize(j, 1) = arr
End Sub
Gần được rồi đấy
Giờ Quang Hải thử với dữ liệu thế này nhé:
A1 = "A"
A2 = "B"
A3 rổng
A4 = "A"
A5 = "B"
A6 = "C"

Xong, chạy code xem thế nào!
Ngoài ra, nếu xóa hết cột A rồi chạy code thì... sao?
Ngoài ra, liệu có thể dùng phép tính nào đó để ReDim vừa đủ cho mảng Arr không? (ở trên ReDim quá thừa rồi...)
Ẹc... Ẹc...
 
Gần được rồi đấy
Giờ Quang Hải thử với dữ liệu thế này nhé:
A1 = "A"
A2 = "B"
A3 rổng
A4 = "A"
A5 = "B"
A6 = "C"

Xong, chạy code xem thế nào!
Ngoài ra, nếu xóa hết cột A rồi chạy code thì... sao?
Ngoài ra, liệu có thể dùng phép tính nào đó để ReDim vừa đủ cho mảng Arr không? (ở trên ReDim quá thừa rồi...)
Ẹc... Ẹc...

Em sắp bị nocked out rồi, em chỉ giảm tí xíu chứ không thể làm cho vừa vặn được anh ơi
PHP:
Sub khong_trung()
Dim dic1 As Object, i, j, arr()
Set dic1 = CreateObject("scripting.dictionary")
dk = UsedRange.Value
With dic1
   For i = 1 To UBound(dk)
      If dk(i, 1) <> "" Then
         If Not .exists(dk(i, 1)) Then
            .Add dk(i, 1), 1
         Else
            .Item(dk(i, 1)) = .Item(dk(i, 1)) + 1
         End If
      End If
   Next
   items = .items:   keys = .keys
   ReDim arr(1 To UBound(items), 1 To 1)
   For i = 0 To UBound(items)
      If items(i) = 1 Then
         j = j + 1
         arr(j, 1) = keys(i)
      End If
   Next
End With
If j Then [b1].Resize(j, 1) = arr
End Sub
 
Em sắp bị nocked out rồi, em chỉ giảm tí xíu chứ không thể làm cho vừa vặn được anh ơi
PHP:
Sub khong_trung()
Dim dic1 As Object, i, j, arr()
Set dic1 = CreateObject("scripting.dictionary")
dk = UsedRange.Value
With dic1
   For i = 1 To UBound(dk)
      If dk(i, 1) <> "" Then
         If Not .exists(dk(i, 1)) Then
            .Add dk(i, 1), 1
         Else
            .Item(dk(i, 1)) = .Item(dk(i, 1)) + 1
         End If
      End If
   Next
   items = .items:   keys = .keys
   ReDim arr(1 To UBound(items), 1 To 1)
   For i = 0 To UBound(items)
      If items(i) = 1 Then
         j = j + 1
         arr(j, 1) = keys(i)
      End If
   Next
End With
If j Then [b1].Resize(j, 1) = arr
End Sub
ReDim thế này là vừa đủ nè:
Mã:
Sub Test()
  Dim sArray, Arr(), Keys, Key
  Dim tmp As String, Item
  Dim i As Long, n As Long
  sArray = Range("A1:A10000").Value
  Range("B1:B10000").ClearContents
  With CreateObject("Scripting.Dictionary")
    For Each Item In sArray
      If Len(CStr(Item)) Then
        tmp = CStr(Item)
        If Not .Exists(tmp) Then
          .Add tmp, 1
        Else
          [COLOR=#ff0000][B]If .Item(tmp) = 1 Then n = n + 1[/B][/COLOR]
          .Item(tmp) = .Item(tmp) + 1
        End If
      End If
    Next
    If .Count Then
      If .Count - n Then
        Keys = .Keys: [COLOR=#ff0000][B]n = 0[/B][/COLOR]
        [COLOR=#ff0000][B]ReDim Arr(1 To .Count - n, 1 To 1)[/B][/COLOR]
        For Each Key In Keys
          If .Item(Key) = 1 Then
            n = n + 1
            Arr(n, 1) = Key
          End If
        Next
        Range("B1").Resize(n).Value = Arr
        MsgBox n & " phan tu duoc tim thay"
      Else
        MsgBox "Tat ca du lieu deu trung"
      End If
    Else
      MsgBox "Không tìm thay du lieu nao"
    End If
  End With
End Sub
Chú ý mấy chổ màu đỏ nha!
(Nhớ khai báo biến đầy đủ chứ đồng chí... Ngoài ra cũng đừng dùng UsedRange ---> Chạy lần 2 nó chơi luôn dữ liệu mình mới lọc à)
 
Lần chỉnh sửa cuối:
Xin phép bạn quanghai1969, mình chỉnh lại chút cho vừa nhé!
Mã:
Sub khong_trung()
Dim dic1 As Object, i As Long, j As Long, arr()
Set dic1 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
Range([B1], [B65536].End(3)).ClearContents
With dic1
   For i = 1 To UBound(dk)
      If dk(i, 1) <> "" Then
         If Not .exists(dk(i, 1)) Then
            .Add dk(i, 1), dk(i, 1)
         Else
            .Remove dk(i, 1)
         End If
      End If
   Next
  ReDim arr(1 To .Count, 1 To 1)
     Items = .Items
   For j = 1 To .Count
     arr(j, 1) = Items(j - 1)
   Next
[B1].Resize(.Count, 1) = arr
End With
End Sub
 
Xin phép bạn quanghai1969, mình chỉnh lại chút cho vừa nhé!
Mã:
Sub khong_trung()
Dim dic1 As Object, i As Long, j As Long, arr()
Set dic1 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
Range([B1], [B65536].End(3)).ClearContents
With dic1
   For i = 1 To UBound(dk)
      If dk(i, 1) <> "" Then
         If Not .exists(dk(i, 1)) Then
            .Add dk(i, 1), dk(i, 1)
         Else
            .Remove dk(i, 1)
         End If
      End If
   Next
  ReDim arr(1 To .Count, 1 To 1)
     Items = .Items
   For j = 1 To .Count
     arr(j, 1) = Items(j - 1)
   Next
[B1].Resize(.Count, 1) = arr
End With
End Sub
Giờ bạn thử với dữ liệu thế này nha:
- Cell A1, A4, A7 = "A"
- Cell A2, A5, A8 = "B"
- Cell A3, A6, A9 = "C"
- Cell A10 = "D"

Chạy code của bạn xem nó ra cái gì?
Kết quả đúng sẽ là duy nhất 1 chữ "D" thôi
 
Xin phép bạn quanghai1969, mình chỉnh lại chút cho vừa nhé!
Mã:
Sub khong_trung()
Dim dic1 As Object, i As Long, j As Long, arr()
Set dic1 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
Range([B1], [B65536].End(3)).ClearContents
With dic1
   For i = 1 To UBound(dk)
      If dk(i, 1) <> "" Then
         If Not .exists(dk(i, 1)) Then
            .Add dk(i, 1), dk(i, 1)
         Else
            .Remove dk(i, 1)
         End If
      End If
   Next
  ReDim arr(1 To .Count, 1 To 1)
     Items = .Items
   For j = 1 To .Count
     arr(j, 1) = Items(j - 1)
   Next
[B1].Resize(.Count, 1) = arr
End With
End Sub

Code của bạn là lấy dữ liệu duy nhất mà. Nếu lọc duy nhất thì đâu cần phải nhức đầu viết code dài như thế
 
Code của bạn là lấy dữ liệu duy nhất mà. Nếu lọc duy nhất thì đâu cần phải nhức đầu viết code dài như thế
Code đó cũng hổng phải lấy duy nhất luôn. Giải thuật code ấy là: Chưa có thì cho vào mà có rồi thì xóa bỏ. Vậy nên với những phần tử có số lần trùng là lẻ thì sẽ "bị" lấy hết... Tức code chỉ đúng khi những phần tử có số lần trùng là chẵn mà thôi
Hic...
 
Nguyên văn bởi ndu96081631
Code đó cũng hổng phải lấy duy nhất luôn. Giải thuật code ấy là: Chưa có thì cho vào mà có rồi thì xóa bỏ. Vậy nên với những phần tử có số lần trùng là lẻ thì sẽ "bị" lấy hết... Tức code chỉ đúng khi những phần tử có số lần trùng là chẵn mà thôi
Hic...
Mình khắc phục lỗi trên như sau, nhờ các bác coi dùm
Mã:
Sub khong_trung()
On Error Resume Next
Dim dic1 As Object, i As Long, j As Long, arr(), FindNumber As Long, a As Long
Dim Memo(100) As Variant, FindOutArray As Variant
Set dic1 = CreateObject("scripting.dictionary")
dk = Range([A1], [A65536].End(3)).Value
Range([B1], [B65536].End(3)).ClearContents
a = 1
With dic1
  For i = 1 To UBound(dk)
   FindOutArray = Filter(SourceArray:=Memo, Match:=dk(i, 1), Include:=True, Compare:=vbBinaryCompare)
   FindNumber = UBound(FindOutArray)
      If dk(i, 1) <> "" Then
         If .exists(dk(i, 1)) Then
              .Remove dk(i, 1)
              Memo(a) = dk(i, 1)
            a = a + 1
         Else
           If FindNumber = -1 Then
               .Add dk(i, 1), dk(i, 1)
           End If
         End If
     End If
    Next
  ReDim arr(1 To .Count, 1 To 1)
     Items = .Items
   For j = 1 To .Count
     arr(j, 1) = Items(j - 1)
   Next
[B1].Resize(.Count, 1) = arr
End With
End Sub
 
Gần được rồi đấy
Giờ Quang Hải thử với dữ liệu thế này nhé:
A1 = "A"
A2 = "B"
A3 rổng
A4 = "A"
A5 = "B"
A6 = "C"

Xong, chạy code xem thế nào!
Ngoài ra, nếu xóa hết cột A rồi chạy code thì... sao?
Ngoài ra, liệu có thể dùng phép tính nào đó để ReDim vừa đủ cho mảng Arr không? (ở trên ReDim quá thừa rồi...)
Ẹc... Ẹc...
Bị mấy cái "Ngoài ra" hơi bị oải.
Hổng xài mảng khỏi Redim được hông ta?
PHP:
Public Sub GPE()
Dim Rng(), Dic As Object, I As Long, Key As Variant
With Sheet1
        .[C1:C10000].ClearContents
    If .[A65000].End(xlUp).Address = "$A$1" Then
        .[C1].Value = .[A1].Value
    Else
        Set Dic = CreateObject("Scripting.Dictionary")
            Rng = .Range(.[A1], .[A65000].End(xlUp)).Value
        For I = 1 To UBound(Rng, 1)
            If Rng(I, 1) <> "" Then
                If Not Dic.Exists(Rng(I, 1)) Then
                    Dic.Add Rng(I, 1), 1
                Else
                    Dic.Item(Rng(I, 1)) = Dic.Item(Rng(I, 1)) + 1
                End If
            End If
        Next
            For Each Key In Dic.Keys
                If Dic.Item(Key) > 1 Then Dic.Remove Key
            Next
        If Dic.Count Then .[C1].Resize(Dic.Count).Value = _
            Application.WorksheetFunction.Transpose(Dic.Keys)
    End If
End With
    Set Dic = Nothing
End Sub
"Nếu có điều chi sơ sót xin niệm tình ..." Chỉ tiếp.
Hì hì...
 
Web KT

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

Back
Top Bottom