VBA xóa dòng trùng, trống

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Rất cám ơn lachinhan về trang
http://www.cpearson.com/excel.htm
Trong này có một vài VBA xóa dòng trống, trùng, lấy DM, và rất nhiều hàm. (free)
Mã:
Public Sub DeleteDuplicateRows()

'[COLOR="Blue"] DeleteDuplicateRows
'chon cot can xoa gt trung[/COLOR]
 Dim R As Long,  N As Long
 Dim V As Variant ,  Rng As Range

On Error GoTo EndMacro
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual


 Set Rng = Application.Intersect(ActiveSheet.UsedRange, _
                    ActiveSheet.Columns(ActiveCell.Column))

 Application.StatusBar = "Processing Row: " & Format(Rng.Row, "#,##0")

 N = 0
For R = Rng.Rows.Count To 2 Step -1
    If R Mod 500 = 0 Then
         Application.StatusBar = "Processing Row: " & Format(R, "#,##0")
    End If

    V = Rng.Cells(R, 1).Value
[COLOR="blue"]' Note that COUNTIF works oddly with a Variant that is equal to vbNullString.
' Rather than pass in the variant, you need to pass in vbNullString explicitly.[/COLOR]
    If V = vbNullString Then
            If Application.WorksheetFunction.CountIf(Rng.Columns(1), vbNullString) > 1 Then
                   Rng.Rows(R).EntireRow.Delete
                   N = N + 1
             End If
     Else
             If Application.WorksheetFunction.CountIf(Rng.Columns(1), V) > 1 Then
                   Rng.Rows(R).EntireRow.Delete
                   N = N + 1
              End If
      End If
Next R

EndMacro:

Application.StatusBar = False
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Duplicate Rows Deleted: " & CStr(N)

End Sub
'xac dinh vung can delete
Public Sub DeleteBlankRows()

Dim R As Long
Dim C As Range
Dim Rng As Range

On Error GoTo EndMacro
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

If Selection.Rows.Count > 1 Then
    Set Rng = Selection
Else
    Set Rng = ActiveSheet.UsedRange.Rows
End If
For R = Rng.Rows.Count To 1 Step -1
    If Application.WorksheetFunction.CountA(Rng.Rows(R).EntireRow) = 0 Then
        ActiveSheet.Rows(R).EntireRow.Delete
    End If
Next R

EndMacro:

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

PHP:
Public Sub DeleteRowOnCell()

On Error Resume Next
Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
ActiveSheet.UsedRange

End Sub
 
Xin chào các bạn,

Oanh thơ có một tập tin chứa rất nhiều dữ liệu,
Nhờ các bạn giúp một đoạn code để có thể xóa được các dòng trống một cách nhất ạ.
 

File đính kèm

  • Book1.xlsx
    2.6 MB · Đọc: 69
Upvote 0
Xin chào các bạn,

Oanh thơ có một tập tin chứa rất nhiều dữ liệu,
Nhờ các bạn giúp một đoạn code để có thể xóa được các dòng trống một cách nhất ạ.
Gợi ý một cách làm thủ công, bạn có thể tham khảo:
1. Chèn 1 cột trống (cột A chẳng hạn) và sử dụng hàm COUNTA để kiểm tra xem từng dòng có dữ liệu hay không.
2. Lọc dữ liệu theo cột A, lấy kết quả tương ứng với các dòng không có dữ liệu.
3. Xóa kết quả lọc đi.
4. Bỏ lọc và xóa cột A.
Thực ra thì việc này cũng đâu đến nỗi lâu lắm đâu, muốn đỡ làm thủ công thì Record macro để lần sau còn xài.
 
Upvote 0
Gợi ý một cách làm thủ công, bạn có thể tham khảo:
1. Chèn 1 cột trống (cột A chẳng hạn) và sử dụng hàm COUNTA để kiểm tra xem từng dòng có dữ liệu hay không.
2. Lọc dữ liệu theo cột A, lấy kết quả tương ứng với các dòng không có dữ liệu.
3. Xóa kết quả lọc đi.
4. Bỏ lọc và xóa cột A.
Thực ra thì việc này cũng đâu đến nỗi lâu lắm đâu, muốn đỡ làm thủ công thì Record macro để lần sau còn xài.

Xin chào nghiaphuc,
Cảm ơn anh đã góp ý, đúng là vấn đề này thường xuyên phải thao tác nên Oanh Thơ mới gửi nên Box này.
Oanh Thơ đã thử Record macro làm theo cách của anh , có phải là các thao tác:
1. Bấm Record macro
2. Nhập công thức: B2 =COUNTA(C2:O2)
3.Copy B2 vào B2:B192435
4. Di chuyển đến B1 chọn Data/Filter chọn số 0
5. Bôi đen toàn bộ vùng số 0 vừa lọc được chọn những dòng không ẩn
6. Xóa dòng
....
nhưng code đã chạy được khoảng 10 phút, file treo mà vẫn chưa ra kết quả ạ :((
Nhờ anh và các bạn xem giúp.
 
Upvote 0
Xin chào nghiaphuc,
Cảm ơn anh đã góp ý, đúng là vấn đề này thường xuyên phải thao tác nên Oanh Thơ mới gửi nên Box này.
Oanh Thơ đã thử Record macro làm theo cách của anh , có phải là các thao tác:
1. Bấm Record macro
2. Nhập công thức: B2 =COUNTA(C2:O2)
3.Copy B2 vào B2:B192435
4. Di chuyển đến B1 chọn Data/Filter chọn số 0
5. Bôi đen toàn bộ vùng số 0 vừa lọc được chọn những dòng không ẩn
6. Xóa dòng
....
nhưng code đã chạy được khoảng 10 phút, file treo mà vẫn chưa ra kết quả ạ :((
Nhờ anh và các bạn xem giúp.
Kết quả Xóa kiểu như vậy hả chị? Miễn dòng nào có dữ liệu sẽ bỏ qua .


1534092696283.png
 
Upvote 0
Trường hợp này chắc là cứ dùng F5/Special/Blank --> Delete/Delete Entire Row
Code thì Record Macro là có ngay.
Nhưng phải xác định được cột nào trong đó chắc chắc rằng, khi ô thuộc cột đó không có dữ liệu thì cả dòng đó không có dữ liệu.
Thứ nữa, 192 ngàn dòng đó, Special/Blank cũng hụt hơi, chưa kể xóa được nó. :)
 
Upvote 0

File đính kèm

  • Book1.xlsb
    537.2 KB · Đọc: 27
Upvote 0
Nhưng phải xác định được cột nào trong đó chắc chắc rằng, khi ô thuộc cột đó không có dữ liệu thì cả dòng đó không có dữ liệu.
Thứ nữa, 192 ngàn dòng đó, Special/Blank cũng hụt hơi, chưa kể xóa được nó. :)
Theo ý anh nói, em nghĩ ra 1 bài toán anh ạ.
Giả sử dữ liệu như bài đã nêu, bỏ qua trường hợp dùng mắt nhìn, có cách nào để xác định được vị trí có dữ liệu cuối cùng nằm ở cột nào không anh? Như bài đã đưa thì là ở cột F.
 
Upvote 0
Theo ý anh nói, em nghĩ ra 1 bài toán anh ạ.
Giả sử dữ liệu như bài đã nêu, bỏ qua trường hợp dùng mắt nhìn, có cách nào để xác định được vị trí có dữ liệu cuối cùng nằm ở cột nào không anh? Như bài đã đưa thì là ở cột F.
Bạn dùng Cells.SpecialCells(xlCellTypeLastCell).Column là biết ngay.
 
Upvote 0
Upvote 0
Ít ra tại dòng 13, cột G có dữ liệu thì làm sao cột cuối cùng là cột F được?
Không, ý em là thế này.
Dữ liệu tại bài này có ở 1 loạt các cột từ C đến M.
Số dòng có dữ liệu ở các cột này khác nhau, ví dụ: C có dữ liệu cuối cùng ở C20, D có dữ liệu cuối cùng ở D25,... M có dữ liệu cuối cùng ở M30
Em muốn tìm dòng có dữ liệu cuối cùng là ở cột nào?
 
Upvote 0
Không, ý em là thế này.
Dữ liệu tại bài này có ở 1 loạt các cột từ C đến M.
Số dòng có dữ liệu ở các cột này khác nhau, ví dụ: C có dữ liệu cuối cùng ở C20, D có dữ liệu cuối cùng ở D25,... M có dữ liệu cuối cùng ở M30
Em muốn tìm dòng có dữ liệu cuối cùng là ở cột nào?
Bạn kiểm tra xem Cells.SpecialCells(xlCellTypeLastCell) có dữ liệu hay không, nếu có thì cột chứa nó là cột cần tìm, ngược lại thì cột chứa Cells.SpecialCells(xlCellTypeLastCell).End(xlToLeft) là cột cần tìm.
 
Upvote 0
Cảm ơn bạn, đúng là như vậy ạ.
Bạn có đoạn code nào xử lý nhanh đc vấn đề này thì giúp Oanh Thơ nhé.
Cảm ơn bạn
Thử code này, tôi chạy 200.000 mất 7 phút.
Mã:
Sub Xoa_DongRong()
    Sheet1.Range("F2", Range("F200000").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
 
Upvote 0
Thử code này, tôi chạy 200.000 mất 7 phút.
Mã:
Sub Xoa_DongRong()
    Sheet1.Range("F2", Range("F200000").End(xlUp)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
Nếu cột F trống mà cột khác có dữ liệu thì code này xóa mất tiêu dữ liệu rồi còn đâu anh.
 
Upvote 0
Bạn kiểm tra xem Cells.SpecialCells(xlCellTypeLastCell) có dữ liệu hay không, nếu có thì cột chứa nó là cột cần tìm, ngược lại thì cột chứa Cells.SpecialCells(xlCellTypeLastCell).End(xlToLeft) là cột cần tìm.
Em cám ơn bác.
Em đã học hỏi được thêm 1 kiến thức mới.
 
Upvote 0
Nếu cột F trống mà cột khác có dữ liệu thì code này xóa mất tiêu dữ liệu rồi còn đâu anh.
Anh xem, thấy cột F chứa dữ liệu nhiều nhất nên thử với cột đó.
Người sử dụng có thể xác định cột nào là cột chính thì họ phải tự sửa, còn không biết chính xác cột nào thì làm cách khác. Tuy nhiên, dò nhiều cột thì tốc độ sẽ chậm, thậm chí máy yếu với 200.000 dòng như File bài 2 sử dụng Go to..........Blanks cho riêng cột F thì sẽ đơ máy (chưa kể xóa dòng).
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom