Mọi người giúp mình xóa các dòng trùng nhau với (1 người xem)

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

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

anhcua

Thành viên mới
Tham gia
16/12/07
Bài viết
1
Được thích
0
**~** hiện mình đang muốn muốn xóa các dòng trùng nhau như sau:
1
2
2
3
Có cách nào để xóa dòng trùng nhau để có kết quả như này không mọi người?
Kết quả:
1
3
--=0 mong các bác chỉ giáo, em sài excel 2010
 
**~** hiện mình đang muốn muốn xóa các dòng trùng nhau như sau:
1
2
2
3
Có cách nào để xóa dòng trùng nhau để có kết quả như này không mọi người?
Kết quả:
1
3
--=0 mong các bác chỉ giáo, em sài excel 2010
Cách thì chắc chắn là có nhưng bạn nên đưa File giả lập nên để các thành viên xem mặt mũi nó ra sao(nói rõ mong muốn trong đó) chứ! Nếu việc đơn giản này mà bạn cũng không làm được nữa thì thôi vậy!
 
**~** hiện mình đang muốn muốn xóa các dòng trùng nhau như sau:
1
2
2
3
Có cách nào để xóa dòng trùng nhau để có kết quả như này không mọi người?
Kết quả:
1
3
--=0 mong các bác chỉ giáo, em sài excel 2010
Mở File nhấn nút "xoá" nhé! Sai ráng chịu vì làm mò! Hi
 
Lần chỉnh sửa cuối:
**~** hiện mình đang muốn muốn xóa các dòng trùng nhau như sau:
1
2
2
3
Có cách nào để xóa dòng trùng nhau để có kết quả như này không mọi người?
Kết quả:
1
3
--=0 mong các bác chỉ giáo, em sài excel 2010
Giả sử dữ liệu của bạn tại A2:A10, tại B2 nhập công thức này vào rồi kéo xuống
=COUNTIF($A$2:$A$10,A2)
Sau đó dùng AutoFiter để cho hiển thị những số nào khác số 1 và xóa 1 phát là xong hết
 
**~** hiện mình đang muốn muốn xóa các dòng trùng nhau như sau:
1
2
2
3
Có cách nào để xóa dòng trùng nhau để có kết quả như này không mọi người?
Kết quả:
1
3
--=0 mong các bác chỉ giáo, em sài excel 2010
Dùng File này nhé, File trước tôi nhầm hàm!
 
Lần chỉnh sửa cuối:
File này vẫn chưa đúng do ko đọc kĩ đề bài.
 
**~** hiện mình đang muốn muốn xóa các dòng trùng nhau như sau:
1
2
2
3
Có cách nào để xóa dòng trùng nhau để có kết quả như này không mọi người?
Kết quả:
1
3
--=0 mong các bác chỉ giáo, em sài excel 2010
Tôi làm theo cách củ chuối này, bạn Test thử xem đúng không nhé?
Mã:
Public Sub xoa_dong_trung()
Dim i As Long, j As Long, k As Long, arr(), rng As Range, rng1 As Range, Dic As Object, kq()


With Sheet1
Set rng = .Range("A2:A" & .Range("A65500").End(xlUp).Row)
Set rng1 = .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row)


arr = .Range("A2:A" & .Range("A65500").End(xlUp).Row)
ReDim kq(1 To UBound(arr), 1 To 1)
Set Dic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(arr)
        If Not Dic.exists(arr(i, 1)) Then
            j = j + 1
            Dic.Add arr(i, 1), 1
            kq(j, 1) = arr(i, 1)
        End If
    Next i
    .Range("IV2").Resize(j, 1) = kq


    For i = 1 To rng1.Rows.Count
        k = Application.WorksheetFunction.CountIf(rng, rng1(i, 1))
        If k > 1 Then rng1(i, 1).EntireRow.Delete
    Next i
        .Range("A2:A" & .Range("A65500").End(xlUp).Row).ClearContents
        .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).Copy .Range("A2")
        .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).ClearContents
End With
End Sub

P/S: Mong các thầy, các bạn các anh chị cùng Test và nếu có thể tối ưu giúp em hoặc có thể đưa ra phương án khác hay hơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Mình làm chơi thôi. chắc cũng không áp dụng được. Hi hi
 

File đính kèm

Lần chỉnh sửa cuối:
Hic! Thế nó có khoảng 100 dòng trùng mà muốn xóa thi cũng phải đánh hết 100 số dòng hả bạn? Chưa kể không biết có tìm chính xác xem nó ở dòng nào nữa mà đánh.
Hì, làm chơi thôi mà bạn, file của bạn cũng có đúng đâu. VD: Trong file
 

File đính kèm

Tôi làm theo cách củ chuối này, bạn Test thử xem đúng không nhé?
Mã:
Public Sub xoa_dong_trung()
Dim i As Long, j As Long, k As Long, arr(), rng As Range, rng1 As Range, Dic As Object, kq()


With Sheet1
Set rng = .Range("A2:A" & .Range("A65500").End(xlUp).Row)
Set rng1 = .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row)


arr = .Range("A2:A" & .Range("A65500").End(xlUp).Row)
ReDim kq(1 To UBound(arr), 1 To 1)
Set Dic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(arr)
        If Not Dic.exists(arr(i, 1)) Then
            j = j + 1
            Dic.Add arr(i, 1), 1
            kq(j, 1) = arr(i, 1)
        End If
    Next i
    .Range("IV2").Resize(j, 1) = kq


    For i = 1 To rng1.Rows.Count
        k = Application.WorksheetFunction.CountIf(rng, rng1(i, 1))
        If k > 1 Then rng1(i, 1).EntireRow.Delete
    Next i
        .Range("A2:A" & .Range("A65500").End(xlUp).Row).ClearContents
        .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).Copy .Range("A2")
        .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).ClearContents
End With
End Sub

P/S: Mong các thầy, các bạn các anh chị cùng Test và nếu có thể tối ưu giúp em hoặc có thể đưa ra phương án khác hay hơn!
Đây là 1 cách dùng Dic để loại dữ liệu trùng
PHP:
ub xoa_du_lieu_trung()
Dim dl(), i As Long, tam(), k As Long
dl = Range([A2], [A65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(dl)
      If Not .exists(dl(i, 1)) Then
         .Add dl(i, 1), ""
      Else
         k = k + 1
         ReDim Preserve tam(1 To k)
         tam(k) = dl(i, 1)
      End If
   Next
   For i = 1 To k
      If .exists(tam(i)) Then
         .Remove (tam(i))
      End If
   Next
   [B2].Resize(.Count) = Application.Transpose(.Keys)
End With
End Sub
 
=

P/S: Mong các thầy, các bạn các anh chị cùng Test và nếu có thể tối ưu giúp em hoặc có thể đưa ra phương án khác hay hơn!

Thừa nhiều quá! Vầy là được rồi:
Mã:
Public Sub xoa_dong_trung()
  Dim i As Long, j As Long, arr(), rng As Range, Dic As Object, kq()
  With Sheet1
    Set rng = .Range(.[A2], .[A65500].End(xlUp))
  End With
  arr = rng.Value
  ReDim kq(1 To UBound(arr), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(arr)
    If Not Dic.exists(arr(i, 1)) Then
      j = j + 1
      Dic.Add arr(i, 1), 1
      kq(j, 1) = arr(i, 1)
    End If
  Next i
  Sheet1.Range("A2").Resize(i - 1).Value = kq
End Sub
 
Đây là 1 cách dùng Dic để loại dữ liệu trùng
PHP:
ub xoa_du_lieu_trung()
Dim dl(), i As Long, tam(), k As Long
dl = Range([A2], [A65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(dl)
      If Not .exists(dl(i, 1)) Then
         .Add dl(i, 1), ""
      Else
         k = k + 1
         ReDim Preserve tam(1 To k)
         tam(k) = dl(i, 1)
      End If
   Next
   For i = 1 To k
      If .exists(tam(i)) Then
         .Remove (tam(i))
      End If
   Next
   [B2].Resize(.Count) = Application.Transpose(.Keys)
End With
End Sub
Mong anh cùng các thầy, các anh chị và các bạn xem hộ em đoạn code em viết với, không biết em có sai ở đâu không mà lúc đúng lúc sai.
Ý tưởng của em là:
+ Dùng Dic lọc ra các giá trị không trùng để kết quả ra 1 vùng khác.
+ Dùng countif đếm lần lượt các kết quả đã lọc ở trong vùng dữ liệu ban đầu gán kết quả đếm vào biến k.
+ Kiểm tra nếu k>1 tức trùng thì xóa dòng chứa dữ liệu trùng đó.
+ Copy kết quả lọc sau khi đã xóa dòng trùng, dán đè nên vùng ban đầu.
 
Lần chỉnh sửa cuối:
Thừa nhiều quá! Vầy là được rồi:
Mã:
Public Sub xoa_dong_trung()
  Dim i As Long, j As Long, arr(), rng As Range, Dic As Object, kq()
  With Sheet1
    Set rng = .Range(.[A2], .[A65500].End(xlUp))
  End With
  arr = rng.Value
  ReDim kq(1 To UBound(arr), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(arr)
    If Not Dic.exists(arr(i, 1)) Then
      j = j + 1
      Dic.Add arr(i, 1), 1
      kq(j, 1) = arr(i, 1)
    End If
  Next i
  Sheet1.Range("A2").Resize(i - 1).Value = kq
End Sub
Hình như code của anh là lọc duy nhất thì phải?
 
Thừa nhiều quá! Vầy là được rồi:
Mã:
Public Sub xoa_dong_trung()
  Dim i As Long, j As Long, arr(), rng As Range, Dic As Object, kq()
  With Sheet1
    Set rng = .Range(.[A2], .[A65500].End(xlUp))
  End With
  arr = rng.Value
  ReDim kq(1 To UBound(arr), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(arr)
    If Not Dic.exists(arr(i, 1)) Then
      j = j + 1
      Dic.Add arr(i, 1), 1
      kq(j, 1) = arr(i, 1)
    End If
  Next i
  Sheet1.Range("A2").Resize(i - 1).Value = kq
End Sub
Có lẽ thầy chưa đọc kỹ yêu cầu của tác giả rồi! Ý tác giả không phải là lọc dữ liệu duy nhất mà là muốn xóa toàn bộ các dòng có dữ liệu trùng cơ!
 
Hình như code của anh là lọc duy nhất thì phải?

Ah! Đúng là chưa xem kỹ (chỉ chạy code của chuột và... đoán). Ẹc... Ẹc...
Lỡ rồi, chơi code này cho nó hoành tráng:
Mã:
Sub Test()
  Dim arrSrc, Arr(), Item
  Dim tmp As String
  Dim n As Long, lMark As Long
  arrSrc = Sheet1.Range("A2:A10000").Value
  Sheet1.Range("A2:A10000").ClearContents
  ReDim Arr(1 To UBound(arrSrc, 1), 1 To 1)
  With CreateObject("Scripting.Dictionary")
    For Each Item In arrSrc
      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
        Sheet1.Range("A2").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
Một vòng lập duy nhất và không chơi WorksheetFunction đâu nhé
Phù.... Xong!
Nói thêm: Bài này nếu đã dùng đến COUNTIF thì quá dễ để xử lý đi, thậm chí là không cần đến Dic. Và nếu đã dùng Dic thì phải tận dụng hết "sức mạnh" của nó
Ẹc... Ẹc...
 
Ah! Đúng là chưa xem kỹ (chỉ chạy code của chuột và... đoán). Ẹc... Ẹc...
Lỡ rồi, chơi code này cho nó hoành tráng:
................
Một vòng lập duy nhất và không chơi WorksheetFunction đâu nhé
Phù.... Xong!
Nói thêm: Bài này nếu đã dùng đến COUNTIF thì quá dễ để xử lý đi, thậm chí là không cần đến Dic. Và nếu đã dùng Dic thì phải tận dụng hết "sức mạnh" của nó
Ẹc... Ẹc...
Thầy ơi code của thầy quá Ok rồi, thầy làm ơn giải thích giúp em tai sao code của em lại cho kết quả không đúng! Em viết rất rõ ý tưởng ở đây ạ! #13
 
Ah! Đúng là chưa xem kỹ (chỉ chạy code của chuột và... đoán). Ẹc... Ẹc...
Lỡ rồi, chơi code này cho nó hoành tráng:
...................
Một vòng lập duy nhất và không chơi WorksheetFunction đâu nhé
Phù.... Xong!
Nói thêm: Bài này nếu đã dùng đến COUNTIF thì quá dễ để xử lý đi, thậm chí là không cần đến Dic. Và nếu đã dùng Dic thì phải tận dụng hết "sức mạnh" của nó
Ẹc... Ẹc...

Anh chơi code này là Knock Out gần hết rồi, còn sót lại vài mạng thôi... Sao nỡ lòng đem Long Đầu Trảm ra chém thường dân vậy anh?
 
Thầy ơi code của thầy quá Ok rồi, thầy làm ơn giải thích giúp em tai sao code của em lại cho kết quả không đúng! Em viết rất rõ ý tưởng ở đây ạ! #13

Tại vì... sai code thôi (dù ý tưởng là đúng)
Sửa lại của bạn nè:
Mã:
Public Sub xoa_dong_trung()
  Dim i As Long, j As Long, k As Long, arr(), rng As Range, rng1 As Range, Dic As Object, kq()
  With Sheet1
    Set rng = .Range("A2:A" & .Range("A65500").End(xlUp).Row)
    arr = rng.Value
    ReDim kq(1 To UBound(arr), 1 To 1)
    Set Dic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(arr)
      If Not Dic.exists(arr(i, 1)) Then
        j = j + 1
        Dic.Add arr(i, 1), 1
        kq(j, 1) = arr(i, 1)
      End If
    Next i
    .Range("IV2").Resize(j, 1) = kq
    [COLOR=#ff0000]Set rng1 = .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row)[/COLOR]
    [COLOR=#0000cd]For i = rng1.Rows.Count To 1 Step -1[/COLOR]
      k = Application.WorksheetFunction.CountIf(rng, rng1(i, 1))
      If k > 1 Then rng1(i, 1).EntireRow.Delete
    Next i
    .Range("A2:A" & .Range("A65500").End(xlUp).Row).ClearContents
    .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).Copy .Range("A2")
    .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).ClearContents
  End With
End Sub
Dòng màu đỏ: Bạn để phía trên là không đúng ---> Khi ấy cột IV có tí dữ liệu nào đâu mà Set rng1 ---> Vậy nên ta phải đặt lệnh Set rng1 tại vị trí khi mà IV có dữ liệu
Dòng màu xanh: Phàm cứ xóa dòng thì bạn hãy nhớ cho rằng phải xóa từ dưới lên
----------------------
Chỉ là sửa code của bạn cho nó chạy đúng thôi chứ như tôi đã nói ở trên:
- Đã dùng COUNTIF thì khỏi Dic và ngược lại
- Nếu dùng Dic, để đơn giản hóa vấn đề, bạn có thể dùng 2 vòng lập. Khi nạp Dic chỉ cần đánh dấu vào Item nếu như phát hiện có trùng. Đến vòng lập thứ 2 là lọc ra được hết thôi
 
Lần chỉnh sửa cuối:
Tại vì... sai code thôi (dù ý tưởng là đúng)
Sửa lại của bạn nè:
Mã:
Public Sub xoa_dong_trung()
  Dim i As Long, j As Long, k As Long, arr(), rng As Range, rng1 As Range, Dic As Object, kq()
  With Sheet1
    Set rng = .Range("A2:A" & .Range("A65500").End(xlUp).Row)
    arr = rng.Value
    ReDim kq(1 To UBound(arr), 1 To 1)
    Set Dic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(arr)
      If Not Dic.exists(arr(i, 1)) Then
        j = j + 1
        Dic.Add arr(i, 1), 1
        kq(j, 1) = arr(i, 1)
      End If
    Next i
    .Range("IV2").Resize(j, 1) = kq
    [COLOR=#ff0000]Set rng1 = .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row)[/COLOR]
    [COLOR=#0000cd]For i = rng1.Rows.Count To 1 Step -1[/COLOR]
      k = Application.WorksheetFunction.CountIf(rng, rng1(i, 1))
      If k > 1 Then rng1(i, 1).EntireRow.Delete
    Next i
    .Range("A2:A" & .Range("A65500").End(xlUp).Row).ClearContents
    .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).Copy .Range("A2")
    .Range("IV2:IV" & .Range("IV65500").End(xlUp).Row).ClearContents
  End With
End Sub
Dòng màu đỏ: Bạn để phía trên là không đúng ---> Khi ấy cột IV có tí dữ liệu nào đâu mà Set rng1 ---> Vậy nên ta phải đặt lệnh Set rng1 tại vị trí khi mà IV có dữ liệu
Dòng màu xanh: Phàm cứ xóa dòng thì bạn hãy nhớ cho rằng phải xóa từ dưới lên
----------------------
Chỉ là sửa code của bạn cho nó chạy đúng thôi chứ như tôi đã nói ở trên:
- Đã dùng COUNTIF thì khỏi Dic và ngược lại
- Nếu dùng Dic, để đơn giản hóa vấn đề, bạn có thể dùng 2 vòng lập. Khi nạp Dic chỉ cần đánh dấu vào Item nếu như phát hiện có trùng. Đến vòng lập thứ 2 là lọc ra được hết thôi
Thầy ơi em test thử code thầy đã sửa hộ em nhưng kết quả vần không đúng ạ!
Thầy xem File!
 

File đính kèm

Tại vì... sai code thôi (dù ý tưởng là đúng)
Sửa lại của bạn nè:
................................
Dòng màu đỏ: Bạn để phía trên là không đúng ---> Khi ấy cột IV có tí dữ liệu nào đâu mà Set rng1 ---> Vậy nên ta phải đặt lệnh Set rng1 tại vị trí khi mà IV có dữ liệu
Dòng màu xanh: Phàm cứ xóa dòng thì bạn hãy nhớ cho rằng phải xóa từ dưới lên
----------------------
...........................
Dòng màu đỏ thì em đã hiểu nhưng chỗ màu xanh mong thầy giải thích kĩ hơn giúp em tại sao cần phải xóa từ dưới nên ạ???
 
Thầy ơi em test thử code thầy đã sửa hộ em nhưng kết quả vần không đúng ạ!
Thầy xem File!

Vì dòng code này:
Mã:
If k > 1 Then rng1(i, 1).EntireRow.Delete
Nó xóa nguyên dòng luôn nên cột A cũng bị ảnh hưởng
Bạn sửa lại thành:
Mã:
If k > 1 Then rng1(i, 1).Delete 2
-------------------------
Dòng màu đỏ thì em đã hiểu nhưng chỗ màu xanh mong thầy giải thích kĩ hơn giúp em tại sao cần phải xóa từ dưới nên ạ???
Dễ hiểu thôi mà. Ví dụ bạn For i = 1 to 10 đi. Khi i = 3, phát hiện trùng và xóa dòng 3 thì dòng số 4 sẽ tự động được đôn lên thành dòng 3. Qua lần lập tiếp theo i = 4 thì bạn đã bỏ sót dòng 4 bị đôn lên khi nãy rồi
 
Lần chỉnh sửa cuối:
Vì dòng code này:
.............................
Bạn sửa lại thành:
Mã:
If k > 1 Then rng1(i, 1).Delete 2
Em đã hiểu rồi ạ!
Mong thầy viết rõ câu lệnh bên trên lại giúp em được không ạ! Thầy viết tắt quá em không hiểu ạ!
 
Lần chỉnh sửa cuối:
Em đã hiểu rồi ạ!
Mong thầy viết rõ câu lệnh bên trên lại giúp em được không ạ! Thầy viết tắt quá em không hiểu ạ!

Record Macro quá trình Click phải vào 1 cell, chọn Delete\Shift cells up là hiểu liền (xóa cell, đôn các cell ở dưới lên trên chứ không xóa dòng)
 
To thầy ndu...
Mong thầy giải thích hộ em nốt câu hỏi này nữa thôi ạ! Làm phiền thầy nhiều quá!
#21
 
To thầy ndu...
Mong thầy giải thích hộ em nốt câu hỏi này nữa thôi ạ! Làm phiền thầy nhiều quá!
#21
Đã giải thích cho bạn ở bài #22 rồi đó.
Dễ hiểu thôi mà. Ví dụ bạn For i = 1 to 10 đi. Khi i = 3, phát hiện trùng và xóa dòng 3 thì dòng số 4 sẽ tự động được đôn lên thành dòng 3. Qua lần lập tiếp theo i = 4 thì bạn đã bỏ sót dòng 4 bị đôn lên khi nãy rồi
 
Vì dòng code này:
Mã:
If k > 1 Then rng1(i, 1).EntireRow.Delete
Nó xóa nguyên dòng luôn nên cột A cũng bị ảnh hưởng
Bạn sửa lại thành:
Mã:
If k > 1 Then rng1(i, 1).Delete 2
-------------------------

Dễ hiểu thôi mà. Ví dụ bạn For i = 1 to 10 đi. Khi i = 3, phát hiện trùng và xóa dòng 3 thì dòng số 4 sẽ tự động được đôn lên thành dòng 3. Qua lần lập tiếp theo i = 4 thì bạn đã bỏ sót dòng 4 bị đôn lên khi nãy rồi
Em cảm ơn thầy nhiều ạ! Đúng là nhiều cái tưởng chừng rất đơn giản ấy mà đúng là không phải ai cũng ngộ ra! Một lần nữa em cảm ơn thầy!
 
Em cảm ơn thầy nhiều ạ! Đúng là nhiều cái tưởng chừng rất đơn giản ấy mà đúng là không phải ai cũng ngộ ra! Một lần nữa em cảm ơn thầy!

Bạn nên đầu tư thêm vào code của mình, sửa sao cho nó hoàn chỉnh thêm nữa mới ngon (vì theo tôi thì code ấy vẫn luộm thuộm lắm)
Như gợi ý ở trên:
- Hoặc dùng Dic thì không dùng COUNTIF
- Hoặc dùng COUNTIF trực tiếp trên cell luôn, khỏi Dic
Đừng chơi "lộn xộn" 2 thứ với nhau ---> Dở ẹc hà!
Ẹc... Ẹc...
 
Bạn nên đầu tư thêm vào code của mình, sửa sao cho nó hoàn chỉnh thêm nữa mới ngon (vì theo tôi thì code ấy vẫn luộm thuộm lắm)
Thực ra em nghĩ sao làm vậy thôi thầy ạ! Làm ra kết quả là em vui lắm rồi, dù code có "dài lê thê" cũng không sao cả. Quan trọng là tự mình làm ra, Hi. Tất nhiên chuyên tối ưu code là rất quan trọng ạ nhưng do trình độ em có hạn nên cái này phải học từ từ ạ! Em cảm ơn thầy!
 
Em cũng thử làm xem sao, vẫn phải sử dụng 2 vòng lặp
Mã:
Sub a()
Dim arr()
dim n as long, i as long, dic as object
n = Range("a1").End(xlDown).Row
ReDim arr(1 To n, 1 To 1)
arr = Range("a1:a" & n)
Set dic = CreateObject("scripting.dictionary")
For i = 1 To n
If Not dic.exists(arr(i, 1)) Then dic.Add arr(i, 1), False Else dic.Item(arr(i, 1)) = True
Next
Application.ScreenUpdating = False
For i = n To 1 Step -1
If dic.Item(arr(i, 1)) Then Range("a" & i).EntireRow.Delete
Next
Application.ScreenUpdating = True
Set dic = Nothing
End Sub
 
Tôi hướng dẫn cho các bạn làm bài này bằng phương pháp đơn giản nhất: Advanced Filter:

[video=youtube;WfScw4AAWwg]https://www.youtube.com/watch?v=WfScw4AAWwg&feature=youtu.be[/video]

Các bạn có thể làm bằng tay (như video hướng dẫn) hoặc record macro quá trình làm bằng tay này để có code, bảo đảm code sẽ rất ngắn
 
Tôi hướng dẫn cho các bạn làm bài này bằng phương pháp đơn giản nhất: Advanced Filter:

[video=youtube;WfScw4AAWwg]https://www.youtube.com/watch?v=WfScw4AAWwg&feature=youtu.be[/video]

Các bạn có thể làm bằng tay (như video hướng dẫn) hoặc record macro quá trình làm bằng tay này để có code, bảo đảm code sẽ rất ngắn

Record Macro thì ra 2 dòng thế này, nhưng chỉ tội là em không thể nào hiểu bản chất của nó... ọc ọc
PHP:
[C2] = "=COUNTIF(R2C1:R1000C1,RC1)=1"
Range("A1:A1000").AdvancedFilter 2, [C1:C2], [E1], 1
 

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

Back
Top Bottom