Giúp em xóa dữ liệu dùng VBA theo điều kiện

Liên hệ QC

Long Lee Trung

Thành viên mới
Tham gia
22/9/17
Bài viết
16
Được thích
1
Giới tính
Nam
000ab-123ccd-gg567-ee123-xxx3​
tic00-1m23v-vyy13-0kilo-2helos​
000cd-img90-0090z-cd123​
2000a-783m1-viwdf0-exwwl​
0123t-0tt000-0983j-222lm​

anh chị cho em hỏi là có hàm vba nào có thể xóa được hàng theo điềukiện là : chỉ xóa những dòng mà trong đó có kí tự "000" và "123" (không cần biết vị trí), theo kết quả thì sẽ xóa được dòng 1-3-5 ?

có hàm vba này nhưng chỉ xóa được 1 chuỗi kí tự :
Sub DeleteRows()

Dim c As Range

Dim SrchRng

Set SrchRng = ActiveSheet.Range("A1", ActiveSheet.Range("A65536").End(xlUp))

Do

Set c = SrchRng.Find("000", LookIn:=xlValues)

If Not c Is Nothing Then c.EntireRow.Delete

Loop While Not c Is Nothing

End Sub
 

File đính kèm

  • cách xóa hàng có điều kiện.xlsx
    9.6 KB · Đọc: 16
Lần chỉnh sửa cuối:
OT chạy code "Loi_Khong_Xoa_Duoc" thì bị lỗi: Cannot use that command on overlapping selections.
tại dòng: sheet.Range(txt).Delete shift:=xlUp
Nhờ các Bạn xem giúp ạ:
Mã:
Public Sub Loi_Khong_Xoa_Duoc()

    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then GoTo End_
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4) ' <---  nhap dieu kien can xoa
  
    Dim a(), str$, txt$, i&, k&, n&
    For i = 1 To r
        For n = 0 To UBound(dieu_kien)
            str = "*" & dieu_kien(n) & "*"
            If du_lieu(i, 1) Like str Then
                If Len(txt) = 0 Then
                    txt = "A" & i
                ElseIf Len(txt) < 55 Then
                    txt = txt & "," & "A" & i
                Else
                    k = k + 1
                    ReDim Preserve a(1 To k)
                    a(k) = txt: txt = Empty
                End If
            End If
        Next n
    Next i

    If k = 0 Then GoTo End_
    For i = k To 1 Step -1
        txt = a(i)
        sheet.Range(txt).Delete shift:=xlUp 'Error:Cannot use that command on overlapping selections.
    Next i
    MsgBox "Da xong!", vbInformation
End_:

End Sub

bác chốt lại code giúp em vs..chứ nó chạy ra "xoa dong nay phai khong ?" :v
Các dòng đó OT đặt câu hỏi là là để muốn xác nhận với Bạn, nhưng Bạn không cho biết là có đúng hay là không?
Bạn chạy thử đoạn bên dưới xem được không ạ?
Mã:
Option Explicit

Public Sub sao_xoa_nhieu_vay()
    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4) '<---  nhap dieu kien can xoa
    Dim a(), str$, txt$, i&, k&, n&
    For i = 1 To r
        For n = 0 To UBound(dieu_kien)
            str = "*" & dieu_kien(n) & "*"
            txt = du_lieu(i, 1)
            If Len(txt) > 0 Then
                If txt Like str Then
                    Exit For
                Else
                    k = k + 1
                    du_lieu(k, 1) = du_lieu(i, 1)
                    Exit For
                End If
            End If
        Next n
    Next i
    sheet.Range("A1").Resize(r).ClearContents
    If k = 0 Then Exit Sub
    sheet.Range("A1").Resize(k).Value = du_lieu
    MsgBox "Da xong!", vbInformation
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
OT chạy code "Loi_Khong_Xoa_Duoc" thì bị lỗi: Cannot use that command on overlapping selections.
tại dòng: sheet.Range(txt).Delete shift:=xlUp
Nhờ các Bạn xem giúp ạ:
Mã:
Public Sub Loi_Khong_Xoa_Duoc()

    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then GoTo End_
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4) ' <---  nhap dieu kien can xoa
 
    Dim a(), str$, txt$, i&, k&, n&
    For i = 1 To r
        For n = 0 To UBound(dieu_kien)
            str = "*" & dieu_kien(n) & "*"
            If du_lieu(i, 1) Like str Then
                If Len(txt) = 0 Then
                    txt = "A" & i
                ElseIf Len(txt) < 55 Then
                    txt = txt & "," & "A" & i
                Else
                    k = k + 1
                    ReDim Preserve a(1 To k)
                    a(k) = txt: txt = Empty
                End If
            End If
        Next n
    Next i

    If k = 0 Then GoTo End_
    For i = k To 1 Step -1
        txt = a(i)
        sheet.Range(txt).Delete shift:=xlUp 'Error:Cannot use that command on overlapping selections.
    Next i
    MsgBox "Da xong!", vbInformation
End_:

End Sub


Các dòng đó OT đặt câu hỏi là là để muốn xác nhận với Bạn, nhưng Bạn không cho biết là có đúng hay là không?
Bạn chạy thử đoạn bên dưới xem được không ạ?
Mã:
Option Explicit

Public Sub sao_xoa_nhieu_vay()
    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4) '<---  nhap dieu kien can xoa
    Dim a(), str$, txt$, i&, k&, n&
    For i = 1 To r
        For n = 0 To UBound(dieu_kien)
            str = "*" & dieu_kien(n) & "*"
            txt = du_lieu(i, 1)
            If Len(txt) > 0 Then
                If txt Like str Then
                    Exit For
                Else
                    k = k + 1
                    du_lieu(k, 1) = du_lieu(i, 1)
                    Exit For
                End If
            End If
        Next n
    Next i
    sheet.Range("A1").Resize(r).ClearContents
    If k = 0 Then Exit Sub
    sheet.Range("A1").Resize(k).Value = du_lieu
    MsgBox "Da xong!", vbInformation
End Sub
dạ oke rồi anh,,vấn đề của e đã được giải quyết..a có thể cho em stk ko..e gửi ít a uống nước ạ. (cho em xin zalo hoặc face được ko @@)
 
Upvote 0
dạ oke rồi anh,,vấn đề của e đã được giải quyết..a có thể cho em stk ko..e gửi ít a uống nước ạ. (cho em xin zalo hoặc face được ko @@)
Ui,không dám không dám !
OT kiến thức rất kém cỏi,giúp được Bạn là nhờ mọi người trên này chỉ dẫn, giúp được Bạn như vậy mình gặp may rồi,cảm ơn thiện ý của Bạn.
 
Upvote 0
Tốn bao công lão 'gì đó' mà giờ lại khai báo biến thế này.

Quả này dùng súng phun nước lá khoai rồi.
Hihi mới đầu OT cũng khai báo rõ nhưng vì dòng đó dài quá OT làm vậy cho nó ngắn lại.
Cảm ơn Bạn đã nhắc, OT sẽ rút kinh nghiệm ạ.
 
Upvote 0
dạ oke rồi anh,,vấn đề của e đã được giải quyết..a có thể cho em stk ko..e gửi ít a uống nước ạ. (cho em xin zalo hoặc face được ko @@)
Bạn cho mình hỏi, trường hợp xóa dòng có 2 và 4. Vậy nếu 1-4-6-22 thì dòng này có xóa không?
 
Upvote 0
Bạn cho mình hỏi, trường hợp xóa dòng có 2 và 4. Vậy nếu 1-4-6-22 thì dòng này có xóa không?
Có thể là sẽ có xóa ạ, nếu đúng như vậy thì OT sửa lại code như sau, nhờ Bạn góp ý thêm ạ:
Mã:
Option Explicit

Public Sub sao_xoa_nhieu_vay2()

    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4) '<---  nhap dieu kien can xoa
    Dim a(), str As String, txt As String
    Dim i As Long, k As Long, n As Long, x As Long
    x = UBound(dieu_kien)
    For i = 1 To r
        For n = 0 To x
            str = "*" & dieu_kien(n) & "*"
            txt = du_lieu(i, 1)
            If Len(txt) > 0 Then
                If txt Like str Then
                    Exit For
                Else
                    If n < x Then
                        GoTo next_n
                    Else
                        k = k + 1
                        du_lieu(k, 1) = du_lieu(i, 1)
                    End If
                End If
            End If
next_n:
        Next n
    Next i
    
    sheet.Range("A1").Resize(r).ClearContents
    If k = 0 Then Exit Sub
    sheet.Range("A1").Resize(k).Value = du_lieu
    MsgBox "Da xong!", vbInformation
    
End Sub
 
Upvote 0
dạ oke rồi anh,,vấn đề của e đã được giải quyết..a có thể cho em stk ko..e gửi ít a uống nước ạ. (cho em xin zalo hoặc face được ko @@)

Bạn xem Bài 27 nhé , có thể là code trên chưa đúng ý, Bạn thử thêm code này nhé ,

Mã:
Option Explicit

Public Sub TimThayLaXoa()

    Dim res As VbMsgBoxResult
    Const sTimXoa As String = "Tim thay la Xoa"
    res = MsgBox("Ban muon tim va xoa ?", vbYesNo + vbQuestion, sTimXoa)
    If res = vbNo Then Exit Sub
    
    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4, 5, 6, 9, 17) '<---  nhap dieu kien can xoa
    Dim a(), str As String, txt As String
    Dim i As Long, k As Long, n As Long, x As Long, z As Long
    x = UBound(dieu_kien)
    For i = 1 To r
        For n = 0 To x
            str = "*" & dieu_kien(n) & "*"
            txt = du_lieu(i, 1)
            If Len(txt) > 0 Then
                If txt Like str Then
                    z = z + 1
                    Exit For
                Else
                    If n < x Then
                        GoTo next_n
                    Else
                        k = k + 1
                        du_lieu(k, 1) = du_lieu(i, 1)
                    End If
                End If
            End If
next_n:
        Next n
    Next i
    
    If z = 0 Then
        MsgBox "Khong co du lieu de xoa", vbCritical, sTimXoa
        Exit Sub
    End If
    sheet.Range("A1").Resize(r).ClearContents
    If k = 0 Then
        MsgBox "Xoa sach se", vbCritical, sTimXoa
        Exit Sub
    End If
    
    sheet.Range("A1").Resize(k).Value = du_lieu
    MsgBox "Da xong!", vbInformation, sTimXoa
    
End Sub

OT cũng xin phép dừng lại ở đây thôi và nếu Bạn nào biết nguyên nhân lỗi nêu ở Bài 22 xin chỉ giúp với ạ
 
Upvote 0
Có thể là sẽ có xóa ạ, nếu đúng như vậy thì OT sửa lại code như sau, nhờ Bạn góp ý thêm ạ:
Mã:
Option Explicit

Public Sub sao_xoa_nhieu_vay2()

    Dim sheet As Worksheet, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    du_lieu = sheet.Range("A1").Resize(r).Value2
    dieu_kien = Array(2, 4) '<---  nhap dieu kien can xoa
    Dim a(), str As String, txt As String
    Dim i As Long, k As Long, n As Long, x As Long
    x = UBound(dieu_kien)
    For i = 1 To r
        For n = 0 To x
            str = "*" & dieu_kien(n) & "*"
            txt = du_lieu(i, 1)
            If Len(txt) > 0 Then
                If txt Like str Then
                    Exit For
                Else
                    If n < x Then
                        GoTo next_n
                    Else
                        k = k + 1
                        du_lieu(k, 1) = du_lieu(i, 1)
                    End If
                End If
            End If
next_n:
        Next n
    Next i
   
    sheet.Range("A1").Resize(r).ClearContents
    If k = 0 Then Exit Sub
    sheet.Range("A1").Resize(k).Value = du_lieu
    MsgBox "Da xong!", vbInformation
   
End Sub
Theo mình thì vòng for như này sẽ gọn hơn:
Mã:
For i = 1 To r
        txt = du_lieu(i, 1) 'dua len vong for1, giam so lan gán
        If txt <> "" Then
            For n = 0 To x
                str = dieu_kien(n)
                    If InStr(txt, str) Then Exit For
                    If n = x Then
                    k = k + 1
                    du_lieu(k, 1) = du_lieu(i, 1)
                    End If
            Next n
        End If
    Next i
 
Upvote 0
debug.print txt '<--- xem lý do tại sao?
sheet.Range(txt).Delete shift:=xlUp 'Error:Cannot use that command on overlapping selections.
A! OT thấy rồi do bị trùng lặp.. Vậy mà trong cửa sổ immediate OT thử 'sheet.Range(txt).Select' vẫn ok nên Ot không phát hiện ra lỗi hihi. Cảm ơn Bạn nhiều .

Theo mình thì vòng for như này sẽ gọn hơn:
Mã:
For i = 1 To r
        txt = du_lieu(i, 1) 'dua len vong for1, giam so lan gán
        If txt <> "" Then
            For n = 0 To x
                str = dieu_kien(n)
                    If InStr(txt, str) Then Exit For
                    If n = x Then
                    k = k + 1
                    du_lieu(k, 1) = du_lieu(i, 1)
                    End If
            Next n
        End If
    Next i
Cảm ơn Bạn nhiều.
 
Upvote 0
Theo gợi ý cách làm của Bác @VetMinibài 7 ,
OT thử viết thêm một cách làm khác, cách này xóa dòng thật, Bạn @Long Lee Trung tham khảo thêm nhé:

Mã:
Option Explicit

Public Sub Xoa_That()
    Dim res As VbMsgBoxResult
    Const sTimXoa As String = "Tim thay la Xoa"
    res = MsgBox("Ban muon tim va xoa ?", vbYesNo + vbQuestion, sTimXoa)
    If res = vbNo Then Exit Sub
    Dim sheet As Worksheet, rng As Range, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    dieu_kien = Array(2, 4, 5, 6, 9, 17)  '<---  nhap dieu kien can xoa
    Set rng = sheet.Range("A1")
    du_lieu = rng.Resize(r, 2).Value2
    Dim str As String, s As String, i As Long, k As Long, n As Long
    For i = 1 To r
        For n = 0 To UBound(dieu_kien)
            str = "*" & dieu_kien(n) & "*"
            s = du_lieu(i, 1)
            If s Like str Or Len(s) = 0 Then
                du_lieu(i, 2) = "x"
                k = k + 1
                Exit For
            End If
        Next n
    Next i
    rng.Resize(r, 2).Value = du_lieu
    rng.Resize(r, 2).Sort key1:=rng.Offset(, 1), order1:=xlDescending
    If k Then rng.Resize(k).EntireRow.Delete
    If k = 0 Then MsgBox "Khong tim thay de xoa", vbCritical, sTimXoa: Exit Sub
    If k = r Then MsgBox "Da xong! Tim thay tat ca va xoa sach se luon", vbCritical, sTimXoa: Exit Sub
    If k < r Then MsgBox "Da xong!" & vbNewLine & "Tim va xoa duoc: " & Format(k, "#,##0") & " dong.", vbInformation, sTimXoa
End Sub
 

File đính kèm

  • Tim va Xoa.xlsm
    2.4 MB · Đọc: 5
Upvote 0
Theo gợi ý cách làm của Bác @VetMinibài 7 ,
OT thử viết thêm một cách làm khác, cách này xóa dòng thật, Bạn @Long Lee Trung tham khảo thêm nhé:

Mã:
Option Explicit

Public Sub Xoa_That()
    Dim res As VbMsgBoxResult
    Const sTimXoa As String = "Tim thay la Xoa"
    res = MsgBox("Ban muon tim va xoa ?", vbYesNo + vbQuestion, sTimXoa)
    If res = vbNo Then Exit Sub
    Dim sheet As Worksheet, rng As Range, dieu_kien(), du_lieu(), r As Long
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, "A").End(xlUp).Row
    If r = 1 Then Exit Sub
    dieu_kien = Array(2, 4, 5, 6, 9, 17)  '<---  nhap dieu kien can xoa
    Set rng = sheet.Range("A1")
    du_lieu = rng.Resize(r, 2).Value2
    Dim str As String, s As String, i As Long, k As Long, n As Long
    For i = 1 To r
        For n = 0 To UBound(dieu_kien)
            str = "*" & dieu_kien(n) & "*"
            s = du_lieu(i, 1)
            If s Like str Or Len(s) = 0 Then
                du_lieu(i, 2) = "x"
                k = k + 1
                Exit For
            End If
        Next n
    Next i
    rng.Resize(r, 2).Value = du_lieu
    rng.Resize(r, 2).Sort key1:=rng.Offset(, 1), order1:=xlDescending
    If k Then rng.Resize(k).EntireRow.Delete
    If k = 0 Then MsgBox "Khong tim thay de xoa", vbCritical, sTimXoa: Exit Sub
    If k = r Then MsgBox "Da xong! Tim thay tat ca va xoa sach se luon", vbCritical, sTimXoa: Exit Sub
    If k < r Then MsgBox "Da xong!" & vbNewLine & "Tim va xoa duoc: " & Format(k, "#,##0") & " dong.", vbInformation, sTimXoa
End Sub
Không có code nào đúng ý thớt như xóa theo điều kiện "2" và không xóa "20": str = "*" & dieu_kien(n) & "*"
Gán kết quả, sort .... hao tổn sức lực hơi nhiều, tìm cách gán kết quả cuối cùng vào mảng ngay trong vòng For i = 1 To r
 
Upvote 0
Không có code nào đúng ý thớt như xóa theo điều kiện "2" và không xóa "20": str = "*" & dieu_kien(n) & "*"
Dạ đây Bác xem và góp ý thêm cho con ạ:
Mã:
            If dieu_kien(n) = 2 Then
                str = "*" & dieu_kien(n) & "-*"
            Else
                str = "*" & dieu_kien(n) & "*"
            End If

Hoặc là thế này gọn hơn ạ:
Mã:
dieu_kien = Array("2-", 4, 5, 6, 9, 17)
 
Upvote 0
Dạ đây Bác xem và góp ý thêm cho con ạ:
Mã:
            If dieu_kien(n) = 2 Then
                str = "*-" & dieu_kien(n) & "-*"
            Else
                str = "*" & dieu_kien(n) & "*"
            End If
Không dùng If vì "2" và "20" chỉ là ví dụ, có thể là số bất kỳ
Còn liên quan đến: s = du_lieu(i, 1)
Chỉnh lại và đưa ra ngoài vòng "For n = 0 To UBound(dieu_kien)" vì không lệ thuộc vào "n"
 
Upvote 0
Không dùng If vì "2" và "20" chỉ là ví dụ, có thể là số bất kỳ
Còn liên quan đến: s = du_lieu(i, 1)
Chỉnh lại và đưa ra ngoài vòng "For n = 0 To UBound(dieu_kien)" vì không lệ thuộc vào "n"
Dạ đúng rồi con cảm ơn Bác đã chỉ dẫn 2 cái lỗi này đúng là cần phải sửa..nhưng mà con thấy loại bỏ cái if cũng khó ví dụ:
Mã:
dieu_kien = Array("-2-", "2-", 4, 5, 6, 9, 17)
thì giữ được ngoài giữ được 20 còn giữ được cả 21,22,....29
Thôi con đi ngủ đây ạ,Con chào Bác,con chúc Bác ngày mới vui khỏe.
 
Upvote 0
Dạ đúng rồi con cảm ơn Bác đã chỉ dẫn 2 cái lỗi này đúng là cần phải sửa..nhưng mà con thấy loại bỏ cái if cũng khó ví dụ:
Mã:
dieu_kien = Array("-2-", "2-", 4, 5, 6, 9, 17)
thì giữ được ngoài giữ được 20 còn giữ được cả 21,22,....29
Thôi con đi ngủ đây ạ,Con chào Bác,con chúc Bác ngày mới vui khỏe.
Dùng 2 dòng lệnh
dieu_kien = Array(2, 4, 5, 6, 9, 17)
str = "*-" & dieu_kien(n) & "-*"
Viết lại dòng lệnh: s = du_lieu(i, 1)
 
Upvote 0
Upvote 0
Dùng 2 dòng lệnh
dieu_kien = Array(2, 4, 5, 6, 9, 17)
str = "*-" & dieu_kien(n) & "-*"
Viết lại dòng lệnh: s = du_lieu(i, 1)
Lô đề thì em không rõ, còn nói về dữ liệu giả sử 1-1-1-1-2 thì điều kiện vậy đâu có xóa được dòng này đâu bác? theo em sửa s thành s="-" & du_lieu(i, 1) & "-"
 
Upvote 0
Web KT

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

Back
Top Bottom