Xóa dòng theo điều kiện

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

bluecat

Thành viên mới
Tham gia
7/10/06
Bài viết
37
Được thích
1
Mình có 01 bảng gồm x dòng và y cột.
Yêu cầu viết macro thỏa đk : Nếu cell nào chứa giá trị # 0 và #1 thì xóa toàn bộ dòng của cell đó.
(Sao bài gởi của mình bị xóa mất rồi Admin? -\\/.-\\/.-\\/.)
 

File đính kèm

Mình có 01 bảng gồm x dòng và y cột.
Yêu cầu viết macro thỏa đk : Nếu cell nào chứa giá trị # 0 và #1 thì xóa toàn bộ dòng của cell đó.
(Sao bài gởi của mình bị xóa mất rồi Admin? -\\/.-\\/.-\\/.)

File của bạn không đọc được; hay bạn cho thêm 1 file 2K03 giúp đi & nén lại!
 
Mình có 01 bảng gồm x dòng và y cột.
Yêu cầu viết macro thỏa đk : Nếu cell nào chứa giá trị # 0 và #1 thì xóa toàn bộ dòng của cell đó.
(Sao bài gởi của mình bị xóa mất rồi Admin? -\\/.-\\/.-\\/.)
Thì làm vầy đây:
PHP:
Sub ClearText()
  With Range("A2").CurrentRegion
    .SpecialCells(2, 2).EntireRow.ClearContents
  End With
End Sub
 

File đính kèm

Mình có 01 bảng gồm x dòng và y cột.
Yêu cầu viết macro thỏa đk : Nếu cell nào chứa giá trị # 0 và #1 thì xóa toàn bộ dòng của cell đó.
(Sao bài gởi của mình bị xóa mất rồi Admin? -\\/.-\\/.-\\/.)

Mình cũng gửi trả lời mà bị xóa mất luôn rồi. Sao kỳ quá vậy ???:=\+:=\+:=\+

Mình đã tìm thấy rồi, nằm trong chỗ bài vi phạm nội quy http://www.giaiphapexcel.com/forum/showthread.php?t=21542

Thử code dưới đây nhé, chép vào VBA sheet 1:

Sub XoaDuLieu()
Dim MyRange As Range
Dim MyRows, MyColumns As Integer
Dim Check As Integer
Set MyRange = ActiveCell.CurrentRegion
MyRows = MyRange.Rows.Count
MyColumns = MyRange.Columns.Count
For i = 2 To MyRows + 1
Check = 0
For j = 1 To MyColumns
If Cells(i, j) = 0 Or Cells(i, j) = 1 Then
Check = Check + 1
End If
Next j
If Check < MyColumns Then
Range(Cells(i, 1), Cells(i, MyColumns)).ClearContents
End If
Next i
End Sub
 
Lần chỉnh sửa cuối:
Mình nghĩ là nên xài ActiveSheet.UsedRange thay vì ActiveCell.CurrentRegion

Sub XoaDuLieu()
Dim MyRange As Range
Dim MyRows, MyColumns As Integer
Dim Check As Integer
Set MyRange = ActiveCell.CurrentRegion
MyRows = MyRange.Rows.Count
MyColumns = MyRange.Columns.Count
. . . .
:-=
ActiveSheet.UsedRange
 
salomon2211 đã viết:
Thử code dưới đây nhé, chép vào VBA sheet 1:

PHP:
Sub XoaDuLieu()
    Dim MyRange As Range
    Dim MyRows, MyColumns As Integer
    Dim Check As Integer

    Set MyRange = ActiveCell.CurrentRegion
    MyRows = MyRange.Rows.Count 
    MyColumns = MyRange.Columns.Count

    For i = 2 To MyRows + 1
        Check = 0
        For j = 1 To MyColumns
            If Cells(i, j) = 0 Or Cells(i, j) = 1 Then 
                Check = Check + 1
            End If
        Next j
        If Check < MyColumns Then
            Range(Cells(i, 1), Cells(i, MyColumns)).ClearContents
        End If
    Next i
End Sub
Xin phép Salomon, cho mình gọt bớt đi vài hàng:
PHP:
Sub XoaDuLieu()
    Dim MyRange As Range
    Dim MyRows, MyColumns As Integer

    Set MyRange = ActiveSheet.UsedRange
    MyRows = MyRange.Rows.Count
    MyColumns = MyRange.Columns.Count

    For i = 2 To MyRows + 1
        For j = 1 To MyColumns
            If Cells(i, j).Value <> 0 And Cells(i, j).Value <> 1 _
                Then Range(Cells(i, 1), Cells(i, MyColumns)).ClearContents: Exit For
        Next j
    Next i

    Set MyRange = Nothing
End Sub

Mình thấy không cần phải dùng Check để dò cho hết MyColumns, vì ý tác giả nói là chỉ cần thấy có ô nào mà không phải 0, không phải 1, thì xóa dữ liệu nguyên hàng, vậy, hễ gặp ô nào đó như vậy thì xóa dữ liệu nguyên hàng chứa ô đó luôn, khỏi dò tiếp (Exit For trong, chạy tiếp For ngoài). Nếu chẳng may cái ô thỏa điều kiện như vậy nằm ở cột cuối cùng thì mới phải chạy For j đủ MyColumns...
 
Lần chỉnh sửa cuối:
Anh xem thử cái này có chạy nhanh hơn không
PHP:
Sub Xoadong()
Dim Rng As Range, i As Long
Set Rng = ActiveSheet.UsedRange
For i = 1 To Rng.Rows.Count
    With WorksheetFunction
        If .CountIf(Rng.Rows(i), 1) + .CountIf(Rng.Rows(i), 0) <> Rng.Columns.Count Then _
            Rng.Rows(i).ClearContents
    End With
Next
Set Rng = Nothing
End Sub
 
Thông thường dử liệu nhập trong bảng tính sẽ có số dòng nhiều hơn cột rất nhiều! Vậy tại sao ta không dùng AutoFilter mà làm việc này nhỉ ---> Yêu cầu duy nhất là thêm 1 dòng tiêu đề ở trên (mà tôi nghĩ dử liệu thật nào cũng phải có tiêu đề chứ nhỉ)
Vậy khi xây dựng code, ta chỉ cần 1 vòng lập quét qua các cột ---> Đương nhiêu sẽ nhanh gấp nhiều lần so với quét theo dòng!
PHP:
Sub ClearText()
  Dim i As Long
  With Range("A1").CurrentRegion
    For i = 1 To .Columns.Count
      .AutoFilter i, "<>0", 1, "<>1"
      .Offset(1).SpecialCells(12).ClearContents
      .AutoFilter
    Next i
  End With
End Sub
Các bạn thử xem ---> Dử liệu cở 10.000 dòng trở lên sẽ thấy hiệu quả
 
Thông thường dử liệu nhập trong bảng tính sẽ có số dòng nhiều hơn cột rất nhiều! Vậy tại sao ta không dùng AutoFilter mà làm việc này nhỉ ---> Yêu cầu duy nhất là thêm 1 dòng tiêu đề ở trên (mà tôi nghĩ dử liệu thật nào cũng phải có tiêu đề chứ nhỉ)
Vậy khi xây dựng code, ta chỉ cần 1 vòng lập quét qua các cột ---> Đương nhiêu sẽ nhanh gấp nhiều lần so với quét theo dòng!
PHP:
Sub ClearText()
  Dim i As Long
  With Range("A1").CurrentRegion
    For i = 1 To .Columns.Count
      .AutoFilter i, "<>0", 1, "<>1"
      .Offset(1).SpecialCells(12).ClearContents
      .AutoFilter
    Next i
  End With
End Sub
Các bạn thử xem ---> Dử liệu cở 10.000 dòng trở lên sẽ thấy hiệu quả
Nếu vậy thì dùng luôn tính năng AutoFilter có sẵn của EX chọn và xóa luôn còn nhanh hơn nữa!
 
Nếu vậy thì dùng luôn tính năng AutoFilter có sẵn của EX chọn và xóa luôn còn nhanh hơn nữa!
Đương nhiên là được, nhưng nếu dử liệu có khoảng vài chục cột, bạn phải thao tác vài chục lần ---> Dù sao vẫn mệt hơn là.. tự động ---> Còn với dử liệu <10 cột, tôi chẳng cần code nào, cứ AutoFilter như tôi đã nói ở trên
Vấn đề ở đây là:
- Nếu ngày nào tôi cũng phải làm 1 thao tác nhàm chán thế kia thì tôi sẽ nghĩ ngay 1 món đồ chơi gì đó "tự động hóa" giúp tôi...
- Đã gọi là TỰ ĐỘNG thì phải chính xác và nhanh
==> Vì thế mới có việc để bàn (về các giải pháp)
 
Web KT

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

Back
Top Bottom