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

  • Thread starter Thread starter anhcua
  • Ngày gửi Ngày gửi
Liên hệ QC
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
 
Web KT

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

Back
Top Bottom