DeleteEmptyRows (1 người xem)

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

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

Thien

Thành viên thường trực
Tham gia
23/6/06
Bài viết
352
Được thích
113
Hi ! cả nhà
Mình có 1 sheet chứa khoảng 40.000 dòng, nhưng không liên tục, có lúc cách 5 dòng mới có dữ liệu, có lúc cách 30 dòng mới có dữ liệu.
Mình muốn bỏ tất cả các dòng không có dữ liệu với 3 cách sau:

1/ dùng macro:
PHP:
Sub DeleteRowsThatLookEmptyinColA()
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual   'pre XL97 xlManual'
  Dim rng As Range, ix As Long
  Set rng = Intersect(Range("A:A"), ActiveSheet.UsedRange)
  For ix = rng.Count To 1 Step -1
      If Trim(Replace(rng.Item(ix).Text, _
                Chr(160), Chr(32))) = "" Then
        rng.Item(ix).EntireRow.Delete
      End If
  Next
done:
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub

2/ dùng macro:
PHP:
Sub DelEmptyRows()
  Dim i As Long, iLimit As Long 'updated for XL2003 2006-01-31'
  iLimit = ActiveSheet.UsedRange.Rows.Count

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual   'pre XL97 xlManual'
  For i = iLimit To 1 Step -1
    If Application.CountA(Cells(i, 1).EntireRow) = 0 Then
       Cells(i, 1).EntireRow.Delete
    End If
  Next i
   Application.Calculation = xlCalculationAutomatic
   Application.ScreenUpdating = True
   iLimit = ActiveSheet.UsedRange.Rows.Count   'attempt to fix lastcell'
   ActiveWorkbook.Save
End Sub
3/chọn auto filler , chọn blanks để lọc ra các dòng không có dữ liệu rồi delete nhưng không được.

Mong các đại ca chỉ giáo

Xin đa tạ
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cách thứ 3 thì nhanh hơn cả và gọn gàng nữa.
Nhưng đã không làm cách thứ 1 và 2 thì thôi chứ đã làm cái đó thì nên thêm một đoạn tính phần trăm thực hiện nữa cho nó thêm phần chuyên nghiệp

Mã:
For ............
Application.StatusBar = "Phan tram hoan thanh: " & Round((ilimit - i) * 100 / ilimnit, 0) & " %"
...........
Next i 
Application.StatusBar = False
 
Upvote 0
Còn một cách khác

Vâng, đúng như vậy. Bạn có thể dùng công cụ ASAP bạn vào mục
Columns/Rows; Conditional row and column... và bạn có thể làm nhiều điều với các hàng và các cột theo các điều kiện sẵn có! Vả lại ASAP là công cụ miễn phí, khá tốt.
http://www.asap-utilities.com/download-asap-utilities.php

Lê Văn Duyệt
 
Upvote 0
Còn 1 sub này cũng xóa được các dòng trống, nội dung gần tương tự mấy sub trên:
Mã:
Sub DelEmptyRow()
    Rng = Selection.Rows.Count
    ActiveCell.Offset(0, 0).Select
    Application.ScreenUpdating = False
        For i = 1 To Rng
                If ActiveCell.Value = "" Then
                        Selection.EntireRow.Delete
                Else
                        ActiveCell.Offset(1, 0).Select
                End If
        Next i
                Application.ScreenUpdating = True
End Sub
 
Upvote 0
Xóa nhóm dòng

Theo như đề bài thì xóa từng dòng không phải là tối ưu?!
Vì cách 5 - 30 dòng mới có dòng dữ liệu
mình có cái tương tự để xóa nhanh hơn: Xóa nhóm dòng
/(/hưng macro này còn phải chỉnh mới đúng theo í của người khởi xướng!

PHP:
Sub XoaTrung()
 Dim iCuoi As Long, iBDau As Long, iXoa As Long
 Application.ScreenUpdating = False
 
 Sheets("S4").Select:    Schu = ""
 iCuoi = Range("E65536").End(xlUp).Row
 For iZ = iCuoi To 2 Step -1
 
    StrC = "E" & CStr(iZ):          Range(StrC).Select
    With Selection
        If .Value <> Schu Then
            Schu = .Value
            If iXoa > 0 Then
                Range("D" & CStr(.Row + 2) & ":E" & CStr(iBDau)).Delete Shift:=xlUp  ' <= sửa lại!'
                iXoa = 0
            Else
                iBDau = .Row
            End If
            
        Else
            iXoa = iXoa + 1
            
        End If
    End With
 Next iZ
 
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử cái ni nha!

Để xóa các dòng mà tại ô A(i) không chứa dữ liệu!
PHP:
Sub XoaTrong()
Dim iCuoi As Long, iBDau As Long, iXoa As Long
Application.ScreenUpdating = False

Sheets("Sheet2").Select: Schu = "A"
iCuoi = Range("E65536").End(xlUp).Row

For iZ = iCuoi To 2 Step -1

StrC = "A" & CStr(iZ): Range(StrC).Select
With Selection
    If Len(.Value) < 1 Then
        If iBDau = 0 Then             iBDau = .Row

    Else
        If iBDau > 0 Then
            Range(iBDau & ":" & (.Row + 1)).Delete shift:=xlUp
            iBDau = 0
    End If:          End If
End With
Next iZ

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Thien,
-----------
Theo mình, nếu công việc xoá các dòng trống như thế này không phải là thường xuyên thì bạn không nhất thiết phải cần đến lập trình.
Dù lập trình hay không thì bạn cũng nên tối ưu lại bảng cơ sở dữ liệu của bạn thật tốt: tạo "field name" cho bảng dữ liệu (khi Ctrl+Shift+* phải chọn được đúng vùng dữ liệu làm việc, các cột nào không cần thiết thì xoá đi hoặc đặt ở vị trí cuối bảng, hạn chế màu (mè),... cụ thể mình đã tối ưu lại bảng cơ sở dữ liệu của bạn:
1. Insert thêm một dòng trước ròng thứ 7, mục đích để ngăn cách với phần Header của bảng
2. Xoá cột F và cột H (hai cột trống, không có tác dụng)
3. Bỏ tô màu toàn bộ bảng, bổ xung cột ghi chú thay vì tô màu
Để xoá được các dòng trống, dù làm thủ công hay kỹ thuật lập trình, bạn phải có dấu hiệu nhận ra chúng. Có nhiều cách giải quyết khác nhau, song theo mình đơn giản và nhanh nhất là sử dụng thêm cột phụ. Cột này sẽ kiểm tra dòng hiện hành nếu trống sẽ có kết quả là 0, đựa vào hàm
=CELL("contents";<reference>)
Bạn lưu ý <reference> là những ô liên tục và có ý nghĩa bắt buộc phải có giá trị. Trong ví dụ của bạn mình chọn các ô trên dòng hiện hành từ cột D đến cột H (do dữ liệu của bạn chưa được tối ưu).
Ví dụ, sau khi bạn đã chèn thêm 1 dòng trước dòng số 7 và xoá đi 2 cột, tại ô O10 = CELL("contents";D10:H10) rồi copy công thức này cho các ô còn lại trong bảng trên cột O.
Bây giờ bạn chỉ việc AutoFilter cột O với giá trị filter = 0. Đó là các dòng trống.
Bạn có thể dễ dàng tạo ra một macro để xoá tự động các dòng này?
Chúc bạn thành công!
 
Lần chỉnh sửa cuối:
Upvote 0
OverAC đã viết:
For ............
Application.StatusBar = "Phan tram hoan thanh: " & Round((ilimit - i) * 100 / ilimnit, 0) & " %"
...........
Next i
Application.StatusBar = False

Cái của Bình giới thiệu rất hay, nhưng chỉ ý nghĩa với bảng tính lớn, còn nhỏ thì chưa kịp nhìn thấy thì đã xong rồi. --=0
Tiện thể Bình chỉ dẫn cho mọi người về ứng dụng xử lý màn hình đi.
Cám ơn.
 
Upvote 0
Xóa những CELLS trống

Tôi xóa những Cells trống trong bảng như thế này, các bạn có thể xem tham khảo.
 
Lần chỉnh sửa cuối:
Upvote 0
148btx đã viết:
Tôi xóa những Cells trống trong bảng như thế này, các bạn có thể xem tham khảo.
Mã:
Sub DeleteEmtyCells()
k = 3 'Cho so luong gia tri sang phai
l = 20 'Cho so luong gia tri xuong duoi
Application.ScreenUpdating = False
For i = 0 To k Step 1
    Range("C6").Select
    ActiveCell.Offset(0, i).Range("A1").Select
    For j = 1 To l
        If ActiveCell = "" Then
            Selection.Delete Shift:=xlUp
        Else
            ActiveCell.Offset(1, 0).Range("A1").Select
        End If
    Next j
Next i
End Sub
Dear 148btx,
------------
Không ổn lắm, mình tăng l=5000, một lúc thấy CPU Usage: 100%, xanh lè!
 
Lần chỉnh sửa cuối:
Upvote 0
còn cách này nữa tôi thấy rất hay:
Mã:
Option Explicit
Sub DeleteEmptyRows()
Dim i As Integer
Dim LastRow As Integer
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
For i = LastRow To 1 Step -1
    If Application.CountA(Rows(i)) = 0 Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Phải chăng code này chỉ xóa những hàng ko có DL

nvson đã viết:
còn cách này nữa tôi thấy rất hay:
Mã:
Option Explicit
Sub DeleteEmptyRows()
Dim i As Integer
Dim LastRow As Integer
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
For i = LastRow To 1 Step -1
    If Application.CountA(Rows(i)) = 0 Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub
Bạn ơi, phải chăng code trên chỉ xóa đi những hàng không có dữ liệu nào nằm trong ô thuộc hàng đó, đúng hông dậy? (nghĩa là hàng đó hoàn toàn không có dữ liệu đó mà)

Xin bạn giải thích thêm về code trên nhá! Thanks for Ure idea!

Nhân tiện xin các U cho mình hỏi là: Làm sao có thể xóa dòng theo điều kiện đưa ra?

VD: Giả sử tại ô A1 có Rượu, A11 có Đồ Nhắm, A1122 có Tiếp Viên..., thì nếu tại bất cứ cell nào trong cột A đó có 1 trong những điều kiện kể trên thì xóa toàn bộ hàng đó đi.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn ơi, phải chăng code trên chỉ xóa đi những hàng không có dữ liệu nào nằm trong ô thuộc hàng đó, đúng hông dậy? (nghĩa là hàng đó hoàn toàn không có dữ liệu đó mà)

Xin bạn giải thích thêm về code trên nhá! Thanks for Ure idea!

Nhân tiện xin các U cho mình hỏi là: Làm sao có thể xóa dòng theo điều kiện đưa ra?

VD: Giả sử tại ô A1 có Rượu, A11 có Đồ Nhắm, A1122 có Tiếp Viên..., thì nếu tại bất cứ cell nào trong cột A đó có 1 trong những điều kiện kể trên thì xóa toàn bộ hàng đó đi.

Câu hỏi trên đây đã rất lâu nhưng chưa thấy được sự hồi âm. Please!
 
Upvote 0
Câu hỏi trên đây đã rất lâu nhưng chưa thấy được sự hồi âm. Please!
Ví dụ: Có 1 range nằm ở sheet khác có tên là danhmuc gồm, Rượu, Thuốc, Bia...
Ta dùng câu
If Application.Countif(danhmuc, "A" & i)> 0 Then Rows(i).Delete
PHP:
Option Explicit
Sub DeleteEmptyRows()
Dim i As Integer
Dim LastRow As Integer
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
For i = LastRow To 1 Step -1
    If Application.Countif(danhmuc, "A" & i)> 0 Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Ví dụ: Có 1 range nằm ở sheet khác có tên là danhmuc gồm, Rượu, Thuốc, Bia...
Ta dùng câu
If Application.Countif(danhmuc, "A" & i)> 0 Then Rows(i).Delete
PHP:
Option Explicit
Sub DeleteEmptyRows()
Dim i As Integer
Dim LastRow As Integer
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
For i = LastRow To 1 Step -1
    If Application.Countif(danhmuc, "A" & i)> 0 Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub
Xóa theo 1 điều kiện nào đó ta dùng AutoFilter, xóa cái rẹt là xong! Làm bằng tay cũng được
 
Upvote 0
Ví dụ: Có 1 range nằm ở sheet khác có tên là danhmuc gồm, Rượu, Thuốc, Bia...
Ta dùng câu
If Application.Countif(danhmuc, "A" & i)> 0 Then Rows(i).Delete
PHP:
Option Explicit
Sub DeleteEmptyRows()
Dim i As Integer
Dim LastRow As Integer
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
For i = LastRow To 1 Step -1
If Application.Countif(danhmuc, "A" & i)> 0 Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub


Bạn ơi mình cũng đang ứng dụng đoạn code này của bạn nhưng danhmuc trong counif này là tên sheet hay là gì mà sao mình run macro cứ bị báo lỗi hoài
 
Upvote 0
Web KT

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

Back
Top Bottom