Sử dụng VBA để xóa nhiều dòng dữ liệu thừa trong Excel

Liên hệ QC

Phạm Trung Tùng Lâm

Thành viên mới
Tham gia
28/6/20
Bài viết
18
Được thích
0
Dear all
Em có một file Data như dưới, em nhờ các bác viết hộ em Code VBA để xóa các dòng dữ liệu thừa dựa theo các tiêu chuẩn:
- Tiêu chuẩn 1 : Revup Enable Flag = NO và Parts Text chứa "P.W.BOARD"
- Tiêu chuẩn 2 : Revup Enable Flag = NO và Quantity = 0

Mong muốn: Khi tìm được dòng Data giống tiêu chuẩn, lệnh này sẽ xóa toàn bộ dữ liệu của các dòng liền sau nó mà có Level > Level của dòng vừa tìm được.
VD:
Dòng 4 (bôi vàng) có Revup Enable Flag = NO và Parts Text chứa "P.W.BOARD", Level của nó là 2
Thì lệnh VBA sẽ xóa toàn bộ dòng có dữ liệu liền sau nó, có Level > 2 (bôi xám), cho đến dòng có Level <= 2

1657525459613.png

Em cảm ơn mọi người
 

File đính kèm

Gán code này cho nút XÓA
PHP:
Option Explicit
Sub delete()
Dim lr&, cell As Range, cellb As Range
lr = Cells(Rows.Count, "D").End(xlUp).Row
On Error Resume Next
For Each cell In Range("D2:D" & lr)
    If cell.Value = "NO" Then
        If cell.Offset(0, 6).Value Like "P.W.BOARD *" Or cell.Offset(0, 1).Value = 0 Then
            cell.Value = "#N/A"
            For Each cellb In Range(cell.Offset(1, -3), "A" & lr)
                If cellb.Value <= cell.Offset(0, -3).Value Then
                    GoTo z:
                Else:
                    cellb.Offset(0, 3).Value = "#N/A"
                End If
            Next
        End If
    End If
z:
Next
Range("D2:D" & lr).SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.delete
End Sub
 

File đính kèm

Em cảm ơn nhiều ạ
Mà bác ơi, lệnh này sẽ ra kết quả như sau:
1657769412162.png

Nhưng em mong muốn giữ lại cả 2 dòng bôi vàng và 2 dòng bôi hồng (như hình dưới ạ). Bác giúp em với ạ
1657769504535.png

Em xin cảm ơn
 
Vậy là BeBo nhà ta phải lên sa bàn trận địa thêm 1 khâu nữa rồi: Đó là ghi thêm các dòng có mức ở cột "A" <= mức đã ghi trong tham biến ở dòng đạt 1 trong 2 điều kiện: (Đ/k):
Đ/K 1: Cột 4 là "NO" & cột 6 là chuỗi "XYZ"
Đ/K 2: Cột 4 là "NO" & cột 5 = 0
 
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
 
Dear all
Em có một file Data như dưới, em nhờ các bác viết hộ em Code VBA để xóa các dòng dữ liệu thừa dựa theo các tiêu chuẩn:
- Tiêu chuẩn 1 : Revup Enable Flag = NO và Parts Text chứa "P.W.BOARD"
- Tiêu chuẩn 2 : Revup Enable Flag = NO và Quantity = 0

Mong muốn: Khi tìm được dòng Data giống tiêu chuẩn, lệnh này sẽ xóa toàn bộ dữ liệu của các dòng liền sau nó mà có Level > Level của dòng vừa tìm được.
VD:
Dòng 4 (bôi vàng) có Revup Enable Flag = NO và Parts Text chứa "P.W.BOARD", Level của nó là 2
Thì lệnh VBA sẽ xóa toàn bộ dòng có dữ liệu liền sau nó, có Level > 2 (bôi xám), cho đến dòng có Level <= 2

View attachment 278655

Em cảm ơn mọi người
Tôi định dùng 1 vòng lặp cho dữ liệu gốc nhưng thấy hơi khó nên xoay sang hướng khác.
- Chạy vòng lặp đầu để xác định các chỉ số dòng cần xóa, đưa vào mảng 1 chiều.
- Chạy vòng lặp thứ 2 để lấy kết quả
Bạn tham khảo code sau:
PHP:
Sub DeleteRows()
    Dim sArr(), ColArr(), Res()
    Dim lR As Long, I As Long, J As Long, K As Long
    Dim nCol As Byte, Col As Byte, R As Long
    
    Application.ScreenUpdating = False
    'Dong cuoi cung co du lieu
    lR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
    'Mang 2 chieu chua toan bo du lieu goc
    sArr() = Sheet1.Range("A1:O" & lR).Value
    R = UBound(sArr, 1): nCol = UBound(sArr, 2)
    
    'Chay vong lap tu dong thu 2 den cuoi de kiem tra
    For I = 2 To R
        If sArr(I, 4) = "NO" Then
            If sArr(I, 10) = "P.W.BOARD TEST" Or sArr(I, 5) = 0 Then
                'Kiem tra cac dong ke tiep
                If I < R Then
                    'Neu dong dang kiem tra khong phai dong cuoi cung
                    For J = 1 To (R - I)
                        'Kiem tra Level lon hon dong truoc hay khong?
                        If sArr(I + J, 1) > sArr(I, 1) Then
                            K = K + 1
                            ReDim Preserve ColArr(1 To K)
                            'Dua chi so dong vao mang ket qua
                            ColArr(K) = I + J
                        Else
                            'Thoat vong lap
                            Exit For
                        End If
                    Next J
                    'Dieu chinh gia tri cua I
                    I = I + J
                End If
            End If
        End If
    Next I
    
    'Chay lai vong lap de lay ket qua
    K = 0
    ReDim Res(1 To R, 1 To nCol)
    For I = 1 To R
        'Chi so dong khong nam trong mang ColArr
        If IsError(Application.Match(I, ColArr, 0)) Then
            K = K + 1
            For Col = 1 To nCol
                Res(K, Col) = sArr(I, Col)
            Next Col
        End If
    Next I
    
    'Xoa ket qua cu
    Sheet1.Range("Q1").Resize(65000, nCol).ClearContents
    'Dien ket qua moi ra bang tinh
    Sheet1.Range("Q1").Resize(K, nCol) = Res
    
    Application.ScreenUpdating = True
    
    MsgBox "Done", vbInformation, "GPE"
    
End Sub
 
Bỏ bớt 1 dòng đi thôi:
PHP:
Option Explicit
Sub delete()
Dim lr&, cell As Range, cellb As Range
lr = Cells(Rows.Count, "D").End(xlUp).Row
On Error Resume Next
For Each cell In Range("D2:D" & lr)
    If cell.Value = "NO" Then
        If cell.Offset(0, 6).Value Like "P.W.BOARD *" Or cell.Offset(0, 1).Value = 0 Then
            'cell.Value = "#N/A"
            For Each cellb In Range(cell.Offset(1, -3), "A" & lr)
                If cellb.Value <= cell.Offset(0, -3).Value Then
                    GoTo z:
                Else:
                    cellb.Offset(0, 3).Value = "#N/A"
                End If
            Next
        End If
    End If
z:
Next
Range("D2:D" & lr).SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.delete
End Sub
[/code]
 
Web KT

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

Back
Top Bottom