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

Liên hệ QC

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

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
1. Bạn khai báo thiếu dk, Items
2. Khi cột A không có dữ liệu hoặc chỉ có dữ liệu 1 ô A1 thì bị lỗi
 
Cái bài này nếu chỉ dùng 1 Đít- to & 1 vòng lặp có giải được không ????????? Giải bằng array & cho sử dụng WorksheetFunction
À há!!! xỉn rồi ....té ra hay, hoan hô đám cưới
Híc
 
Cái bài này nếu chỉ dùng 1 Đít- to & 1 vòng lặp có giải được không ????????? Giải bằng array & cho sử dụng WorksheetFunction
À há!!! xỉn rồi ....té ra hay, hoan hô đám cưới
Híc
Anh Cò ơi bài này nếu cho dùng worksheetFunction thì em không cần Dic và 1 vòng lập là ra ngay thôi, nhưng anh NDU ép em không cho xài WF mới tức chứ
 
Wa, em trai còn thức, bài giải đó ra sao vậy??
Em giải thế này nè, tạm thời không nói đến bẫy lỗi nha. Hoc được vài chiêu của anh nên đem ra múa tùm lum
PHP:
Sub khong_trung3()
Dim dk1 As Variant, dk2 As Range, arr1(), arr2(), i As Long, j As Long
dk1 = Range([a1], [a65536].End(3)).Value
Set dk2 = Range([a1], [a65536].End(3))
ReDim arr1(1 To UBound(dk1), 1 To 2)
For i = 1 To UBound(dk1)
   arr1(i, 1) = Application.CountIf(dk2, dk1(i, 1))
   arr1(i, 2) = dk1(i, 1)
   If arr1(i, 1) = 1 Then
      j = j + 1
      ReDim Preserve arr2(1 To j)
      arr2(j) = arr1(i, 2)
   End If
Next
If j Then [B1].Resize(j, 1) = Application.Transpose(arr2)
End Sub
 
Em giải thế này nè, tạm thời không nói đến bẫy lỗi nha. Hoc được vài chiêu của anh nên đem ra múa tùm lum
PHP:
Sub khong_trung3()
Dim dk1 As Variant, dk2 As Range, arr1(), arr2(), i As Long, j As Long
dk1 = Range([a1], [a65536].End(3)).Value
Set dk2 = Range([a1], [a65536].End(3))
ReDim arr1(1 To UBound(dk1), 1 To 2)
For i = 1 To UBound(dk1)
   arr1(i, 1) = Application.CountIf(dk2, dk1(i, 1))
   arr1(i, 2) = dk1(i, 1)
   If arr1(i, 1) = 1 Then
      j = j + 1
      ReDim Preserve arr2(1 To j)
      arr2(j) = arr1(i, 2)
   End If
Next
If j Then [B1].Resize(j, 1) = Application.Transpose(arr2)
End Sub
Thế bi giờ hông chơi worksheetFunction thì sao ?????
Híc, hihihi
Cái này là vui chơi học tập trong thời gian rảnh, chứ giải quyết bài này như em viết là quá ok rồi. Híc
 
Thế bi giờ hông chơi worksheetFunction thì sao ?????
Híc, hihihi
Cái này là vui chơi học tập trong thời gian rảnh, chứ giải quyết bài này như em viết là quá ok rồi. Híc
Nếu không chơi WF thì phải dùng dic và mảng rồi. em có giải mấy bài phía trên mà anh. Anh có cao kiến gì không? Em xài hết đồ nghề rồi
 
Thôi mai tính tiếp anh ơi. Nếu đã có chỉ điểm như vậy nhất định em sẽ làm được mà.
 
Thì anh Cò làm thử đi... Đố hoài
Ẹc... Ẹc... Cũng hay à nha!
Cái này hổng phải đố nha Thầy, chỉ là ở không quá sinh ra như thế
Híc, xó-zì Thầy ndu & bạn Quang Hải, hôm qua xỉn quá, lo tránh cái thằng Countif thôi, cuối cùng vẫn vướng thằng Transpose. "Bố khỉ"
Mã:
Public Sub HongPhai()
    Dim Vung, I, d, DoTim
    Set d = CreateObject("scripting.dictionary")
    Vung = Range([a1], [A1000].End(xlUp))
    For I = 1 To UBound(Vung)
        If Vung(I, 1) <> "" Then
            If Not d.exists(Vung(I, 1)) Then
                If InStr(DoTim, Vung(I, 1)) = 0 Then
                    d.Add Vung(I, 1), ""
                 End If
             Else
                    d.Remove Vung(I, 1)
                    DoTim = DoTim & " " & Vung(I, 1)
             End If
        End If
    Next I
        [B1:b1000].ClearContents
        If d.Count > 0 Then
            [B1].Resize(d.Count) = Application.WorksheetFunction.Transpose(d.keys)
        Else
            MsgBox ("Trung ca bay, hong co em nao duy nhat")
        End If
End Sub
Chỉ làm được 1 Đít & 1 vòng lặp, phải chi cho kết quả theo hàng ngang thì được " chăm phần chăm", hihi
 
Cái này hổng phải đố nha Thầy, chỉ là ở không quá sinh ra như thế
Híc, xó-zì Thầy ndu & bạn Quang Hải, hôm qua xỉn quá, lo tránh cái thằng Countif thôi, cuối cùng vẫn vướng thằng Transpose. "Bố khỉ"

Hổng biết anh còn nhớ giải thuật hàm Draw do bạn siwtom làm tại đây không:
http://www.giaiphapexcel.com/forum/...thức-tính-một-dạng-Tổ-hợp&p=408551#post408551
Em đang mường tượng phương pháp hoán vị kiểu như trên có thể xài được trong bài này đấy! Rất có thể chỉ dùng 1 vòng lập và không cần TRANSPOSE gì cả
Để nghiên cứu xem
 
Hổng biết anh còn nhớ giải thuật hàm Draw do bạn siwtom làm tại đây không:
http://www.giaiphapexcel.com/forum/...thức-tính-một-dạng-Tổ-hợp&p=408551#post408551
Em đang mường tượng phương pháp hoán vị kiểu như trên có thể xài được trong bài này đấy! Rất có thể chỉ dùng 1 vòng lập và không cần TRANSPOSE gì cả
Để nghiên cứu xem

Như đã nói ở trên, ta dùng phương pháp hoán vị để xử lý bài này như sau:
PHP:
Sub Test()
  Dim sArray, Arr(), Item
  Dim tmp As String
  Dim n As Long, lMark As Long
  sArray = Range("A1:A10000").Value
  Range("B1:B10000").ClearContents
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  With CreateObject("Scripting.Dictionary")
    For Each Item In sArray
      If Len(CStr(Item)) Then
        tmp = CStr(Item)
        If Not .Exists(tmp) Then
          n = n + 1
          .Add tmp, n
          Arr(n, 1) = tmp
        ElseIf .Item(tmp) > 0 Then
          lMark = .Item(tmp)
          .Item(tmp) = 0
          If lMark < n Then
            .Item(Arr(n, 1)) = lMark
            Arr(lMark, 1) = Arr(n, 1)
          End If
          n = n - 1
        End If
      End If
    Next
    If .Count Then
      If n Then
        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ỉ 1 vòng lập và cũng không dùng TRANSPOSE luôn
Nhờ các bạn kiểm tra giúp nhé
 
Lần chỉnh sửa cuối:
Như đã nói ở trên, ta dùng phương pháp hoán vị để xử lý bài này như sau:
PHP:
Sub Test()
  Dim sArray, Arr(), Item
  Dim tmp As String
  Dim n As Long, lMark As Long
  sArray = Range("A1:A10000").Value
  Range("B1:B10000").ClearContents
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  With CreateObject("Scripting.Dictionary")
    For Each Item In sArray
      If Len(CStr(Item)) Then
        tmp = CStr(Item)
        If Not .Exists(tmp) Then
          n = n + 1
          .Add tmp, n
          Arr(n, 1) = tmp
        ElseIf .Item(tmp) > 0 Then
          lMark = .Item(tmp)
          .Item(tmp) = 0
          If lMark < n Then
            .Item(Arr(n, 1)) = lMark
            Arr(lMark, 1) = Arr(n, 1)
          End If
          n = n - 1
        End If
      End If
    Next
    If .Count Then
      If n Then
        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ỉ 1 vòng lập và cũng không dùng TRANSPOSE luôn
Nhờ các bạn kiểm tra giúp nhé

Em đọc và ứng dụng được bài này của anh chắc mất 1 tháng. Sao nó trừu tượng quá.
 
Em đọc và ứng dụng được bài này của anh chắc mất 1 tháng. Sao nó trừu tượng quá.
Thấy dài thế chứ giái thuật của nó dễ ợt! Đại khái thế này:
- Giả sử lúc đầu ta add vào được 5 giá trị (chưa có cái nào trùng) là a, b, c, d, e (lúc này n =5). Cùng lúc cho luôn vào mảng 2 chiều Arr
- Đến lần lập thứ 6, giá trị nhận được là c, ta phát hiện nó trùng ở vị trí thứ 3
- Vậy ta sẽ hoán vị, lấy thằng thứ 5 đưa lên thứ 3 và ngược lại. Xong, giảm n xuống 1 đơn vị để n = 4 (để "liệng" cái thằng trùng đi)
Ẹc... Ẹc... chỉ thế thôi (đương nhiên để ý thêm vài chổ ĐÁNH DẤU trong Item của Dic)
 
Thấy dài thế chứ giái thuật của nó dễ ợt! Đại khái thế này:
- Giả sử lúc đầu ta add vào được 5 giá trị (chưa có cái nào trùng) là a, b, c, d, e (lúc này n =5). Cùng lúc cho luôn vào mảng 2 chiều Arr
- Đến lần lập thứ 6, giá trị nhận được là c, ta phát hiện nó trùng ở vị trí thứ 3
- Vậy ta sẽ hoán vị, lấy thằng thứ 5 đưa lên thứ 3 và ngược lại. Xong, giảm n xuống 1 đơn vị để n = 4 (để "liệng" cái thằng trùng đi)
Ẹc... Ẹc... chỉ thế thôi (đương nhiên để ý thêm vài chổ ĐÁNH DẤU trong Item của Dic)
Chỉ hiểu và làm được thế này thôi, xin được chỉ những chỗ chưa hợp lý.
PHP:
Public Sub GPE()
Dim Rng(), Dic As Object, I As Long, Arr(), n As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    .[E1:E10000].ClearContents
    Rng = .[A1:A10000].Value
ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
    For I = 1 To UBound(Rng, 1)
        If Rng(I, 1) <> "" Then
            If Not Dic.Exists(Rng(I, 1)) Then
                n = n + 1
                Dic.Add Rng(I, 1), n
                Arr(n, 1) = Rng(I, 1)
            Else
                K = Dic.Item(Rng(I, 1))
                Arr(K, 1) = Arr(n, 1)
                n = n - 1
            End If
        End If
    Next I
        If n Then .[E1].Resize(n).Value = Arr
End With
    Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Chỉ hiểu và làm được thế này thôi, xin được chỉ những chỗ chưa hợp lý.
PHP:
Public Sub GPE()
Dim Rng(), Dic As Object, I As Long, Arr(), n As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    .[E1:E10000].ClearContents
    Rng = .[A1:A10000].Value
ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
    For I = 1 To UBound(Rng, 1)
        If Rng(I, 1) <> "" Then
            If Not Dic.Exists(Rng(I, 1)) Then
                n = n + 1
                Dic.Add Rng(I, 1), n
                Arr(n, 1) = Rng(I, 1)
            Else
                K = Dic.Item(Rng(I, 1))
                Arr(K, 1) = Arr(n, 1)
                n = n - 1
            End If
        End If
    Next I
        If n Then .[E1].Resize(n).Value = Arr
End With
    Set Dic = Nothing
End Sub

Code của anh BaTê chạy không chuẩn so với yêu cầu rồi anh ơi.
 
Code của anh BaTê chạy không chuẩn so với yêu cầu rồi anh ơi.
Thêm một dòng nữa xem sao, đang mò mà!
PHP:
Public Sub GPE()
Dim Rng(), Dic As Object, I As Long, Arr(), n As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    .[E1:E10000].ClearContents
    Rng = .[A1:A10000].Value
ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
    For I = 1 To UBound(Rng, 1)
        If Rng(I, 1) <> "" Then
            If Not Dic.Exists(Rng(I, 1)) Then
                n = n + 1
                Dic.Add Rng(I, 1), n
                Arr(n, 1) = Rng(I, 1)
            Else
                K = Dic.Item(Rng(I, 1))
                Dic.Item(Arr(n, 1)) = K ''----------------"Hinh nhu Thieu dong nay"
                Arr(K, 1) = Arr(n, 1)
                n = n - 1
            End If
        End If
    Next I
        If n Then .[E1].Resize(n).Value = Arr
End With
    Set Dic = Nothing
End Sub
Ẹc.Ẹc...
 
Lần chỉnh sửa cuối:
Thêm một dòng nữa xem sao, đang mò mà!
PHP:
Public Sub GPE()
Dim Rng(), Dic As Object, I As Long, Arr(), n As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    .[E1:E10000].ClearContents
    Rng = .[A1:A10000].Value
ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
    For I = 1 To UBound(Rng, 1)
        If Rng(I, 1) <> "" Then
            If Not Dic.Exists(Rng(I, 1)) Then
                n = n + 1
                Dic.Add Rng(I, 1), n
                Arr(n, 1) = Rng(I, 1)
            Else
                K = Dic.Item(Rng(I, 1))
                Dic.Item(Arr(n, 1)) = K ''----------------"Hinh nhu Thieu dong nay"
                Arr(K, 1) = Arr(n, 1)
                n = n - 1
            End If
        End If
    Next I
        If n Then .[E1].Resize(n).Value = Arr
End With
    Set Dic = Nothing
End Sub
Ẹc.Ẹc...
Cũng vậy anh ơi, em cũng đang nhức đầu với cái này.
 
Web KT

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

Back
Top Bottom