Giúp em xóa dữ liệu dùng VBA theo điều kiện (1 người xem)

Liên hệ QC

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

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

Lần chỉnh sửa cuối:
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
"Sub" không phải "Hàm"
Mã:
Sub DeleteRows()
  Dim eRow As Long, i As Long
 
  eRow = Range("A" & Rows.Count).End(xlUp).Row
  For i = eRow To 1 Step -1
    If InStr(1, Cells(i, "A"), "000") > 0 Then
      If InStr(1, Cells(i, "A"), "123") > 0 Then
        Cells(i, "A").EntireRow.Delete
      End If
    End If
  Next i
End Sub
 
Upvote 0
"Sub" không phải "Hàm"
Mã:
Sub DeleteRows()
  Dim eRow As Long, i As Long

  eRow = Range("A" & Rows.Count).End(xlUp).Row
  For i = eRow To 1 Step -1
    If InStr(1, Cells(i, "A"), "000") > 0 Then
      If InStr(1, Cells(i, "A"), "123") > 0 Then
        Cells(i, "A").EntireRow.Delete
      End If
    End If
  Next i
End Sub
PHP:
If InStr(1, Cells(i, "A"), "000") + InStr(1, Cells(i, "A"), "123") > 0 Then
Nhưng mà điều kiện này chưa đúng lắm, nó sẽ xóa luôn cái dòng 4 vì có "2000".
 
Upvote 0
PHP:
If InStr(1, Cells(i, "A"), "000") + InStr(1, Cells(i, "A"), "123") > 0 Then
Nhưng mà điều kiện này chưa đúng lắm, nó sẽ xóa luôn cái dòng 4 vì có "2000".
If InStr(1, Cells(i, "A"), "000") + InStr(1, Cells(i, "A"), "123") > 0 Then
Ở đâu ra lệnh nầy vậy ?
 
Upvote 0
PHP:
If InStr(1, Cells(i, "A"), "000") + InStr(1, Cells(i, "A"), "123") > 0 Then
Nhưng mà điều kiện này chưa đúng lắm, nó sẽ xóa luôn cái dòng 4 vì có "2000".
Dòng lệnh này không thể gọi là "chưa đúng lắm". Nó có những hai vấn đề:
1. lô gic này diễn theo VBA là "000" HOẶC "123" chứ không phải "000" VÀ "123"
2. Tuy nhìn thì thu gọn được IF's thành 1 dòng nhưng trên thực tế chạy code, VBA sẽ phải duyệt cả hai hàm, cộng kết quả lại rồi so sánh với 0. Code ở bài #2 thì chạy 1 hàm trước, nếu cần mới chạy hàm thứ hai.
 
Upvote 0
PHP:
Sub KhôngXóaDòng()
'Tìm dữ liệu thỏa điều kiện và liệt kê vào cột B'
  Dim eRow As Long, i As Long, ii as long, sText as String
  Dim data as variant
  eRow = Range("A" & Rows.Count).End(xlUp).Row + 1
data =Range("A1:A" & eRow).value2
eRow = ubound(data,1) - 1
  For i = 1 To eRow
     sText = data(i,1)
    If InStr(1, sText, "000") > 0 Then
      If InStr(1, sText, "123") > 0 Then
        ii = ii+1
        data(ii,1) = sText
      End If
    End If
  Next i
Range("B:B").clearContents
If ii > 0 then Range("B1").Resize(ii,1).value = data
Msgbox "Xong phim ba con heo con!"
End Sub
 
Upvote 0
PHP:
Range("B:B").clearContents
Clear Contents sẽ lòi ra một mớ dòng trống với màu mè mẫu mã. Mà thói quen của dân ở đây là không màu mè mẫu mã không chịu được.
Delete Row đúng hơn. (Tuy vẫn chưa giải quyết được trường hợp kẻ hàng, nhưng chắc phải ketiano)
 
Upvote 0
PHP:
Sub KhôngXóaDòng()
'Tìm dữ liệu thỏa điều kiện và liệt kê vào cột B'
  Dim eRow As Long, i As Long, ii as long, sText as String
  Dim data as variant
  eRow = Range("A" & Rows.Count).End(xlUp).Row + 1
data =Range("A1:A" & eRow).value2
eRow = ubound(data,1) - 1
  For i = 1 To eRow
     sText = data(i,1)
    If InStr(1, sText, "000") > 0 Then
      If InStr(1, sText, "123") > 0 Then
        ii = ii+1
        data(ii,1) = sText
      End If
    End If
  Next i
Range("B:B").clearContents
If ii > 0 then Range("B1").Resize(ii,1).value = data
Msgbox "Xong phim ba con heo con!"
End Sub
Theo em nghĩ vẫn chưa hoàn toàn đúng ý thớt :D
 
Upvote 0
Hehe,OT xin chào cả nhà :hug:, OT xin phép hóng hớt một đoạn code ạ:
Mã:
Option Explicit
Sub Hóng_hót()
    Dim sheet As Worksheet, r As Range, rUni As Range, res
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    For Each r In sheet.Range("A1").CurrentRegion
        res = r.Value
        If res Like "*000*" And res Like "*123*" Then
            If Not rUni Is Nothing Then
                Set rUni = Union(rUni, r)
            Else
                Set rUni = r
            End If
        End If
    Next r
    If rUni Is Nothing Then
        MsgBox "Khong tim thay dieu kien de xoa dong.", vbInformation, "Don't delete"
        Exit Sub
    End If
    rUni.Select
    res = MsgBox("Ban co muon xoa cac dong duoc lua chon: " & vbNewLine & _
    rUni.Address & " ?", vbYesNo + vbQuestion, "Delete row")
    If res = vbYes Then rUni.EntireRow.Delete Else Exit Sub
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hehe,OT xin chào cả nhà :hug:, OT xin phép hóng hớt một đoạn code ạ:
Mã:
Option Explicit
Sub Hóng_hót()
    Dim sheet As Worksheet, r As Range, rUni As Range, res
    Set sheet = ThisWorkbook.Worksheets("Sheet1")
    For Each r In sheet.Range("A1").CurrentRegion
        res = r.Value
        If res Like "*000*" And res Like "*123*" Then
            If Not rUni Is Nothing Then
                Set rUni = Union(rUni, r)
            Else
                Set rUni = r
            End If
        End If
    Next r
    If rUni Is Nothing Then
        MsgBox "Khong tim thay dieu kien de xoa dong.", vbInformation, "Don't delete"
        Exit Sub
    End If
    rUni.Select
    res = MsgBox("Ban co muon xoa cac dong duoc lua chon: " & vbNewLine & _
    rUni.Address & " ?", vbYesNo + vbQuestion, "Delete row")
    If res = vbYes Then rUni.EntireRow.Delete Else Exit Sub
End Sub
dạ đoạn code này rất hợp với em ạ, nhưng em có 1 file mới và ví dụ em thêm vào dòng : "If res Like "*2*" And res Like "*4*" And res Like "*20*" Then" (tức là muốn xóa những dòng nào có số 2,4,20) thì code này lại chỉ tìm được 2 dòng, trong khi file của e có rất nhiều như : 02-04-13-20, 02-03-04-xx-20, 01-02-04-15-50....v..v ?? xin giải đáp giúp em
 

File đính kèm

Upvote 0
Theo em nghĩ vẫn chưa hoàn toàn đúng ý thớt :D
dạ đúng rồi,,đoạn code này hắn tìm tất cả
PHP:
Sub KhôngXóaDòng()
'Tìm dữ liệu thỏa điều kiện và liệt kê vào cột B'
  Dim eRow As Long, i As Long, ii as long, sText as String
  Dim data as variant
  eRow = Range("A" & Rows.Count).End(xlUp).Row + 1
data =Range("A1:A" & eRow).value2
eRow = ubound(data,1) - 1
  For i = 1 To eRow
     sText = data(i,1)
    If InStr(1, sText, "000") > 0 Then
      If InStr(1, sText, "123") > 0 Then
        ii = ii+1
        data(ii,1) = sText
      End If
    End If
  Next i
Range("B:B").clearContents
If ii > 0 then Range("B1").Resize(ii,1).value = data
Msgbox "Xong phim ba con heo con!"
End Sub
trước tiên là em cảm ơn đã rep @@. em có up 1 file bên dưới, nếu là ở dạng số thì đoạn vba này chạy chưa chính xác..ví dụ tìm xóa những dòng có số 1 và số 20 thì hắn sẽ tìm luôn những dòng có 11-20, 21-30..kiểu kiểu thế...có thể fix lại giúp em ko.? thứ nhất là xóa luôn những dòng tìm được đúng điều kiện, hiện ra thông báo đã xóa bao nhiêu dòng (có thể ko cần cũng dc), và nếu em muốn thêm 3-4-5-6 điều kiện nữa thì e sẽ làm ntn? em cảm ơn rất nhiều
Bài đã được tự động gộp:

PHP:
Sub KhôngXóaDòng()
'Tìm dữ liệu thỏa điều kiện và liệt kê vào cột B'
  Dim eRow As Long, i As Long, ii as long, sText as String
  Dim data as variant
  eRow = Range("A" & Rows.Count).End(xlUp).Row + 1
data =Range("A1:A" & eRow).value2
eRow = ubound(data,1) - 1
  For i = 1 To eRow
     sText = data(i,1)
    If InStr(1, sText, "000") > 0 Then
      If InStr(1, sText, "123") > 0 Then
        ii = ii+1
        data(ii,1) = sText
      End If
    End If
  Next i
Range("B:B").clearContents
If ii > 0 then Range("B1").Resize(ii,1).value = data
Msgbox "Xong phim ba con heo con!"
End Sub
trước tiên là em cảm ơn đã rep @@. em có up 1 file bên dưới, nếu là ở dạng số thì đoạn vba này chạy chưa chính xác..ví dụ tìm xóa những dòng có số 1 và số 20 thì hắn sẽ tìm luôn những dòng có 11-20, 21-30..kiểu kiểu thế...có thể fix lại giúp em ko.? thứ nhất là xóa luôn những dòng tìm được đúng điều kiện, hiện ra thông báo đã xóa bao nhiêu dòng (có thể ko cần cũng dc), và nếu em muốn thêm 3-4-5-6 điều kiện nữa thì e sẽ làm ntn? em cảm ơn rất nhiều
 

File đính kèm

Upvote 0
dạ đúng rồi,,đoạn code này hắn tìm tất cả

trước tiên là em cảm ơn đã rep @@. em có up 1 file bên dưới, nếu là ở dạng số thì đoạn vba này chạy chưa chính xác..ví dụ tìm xóa những dòng có số 1 và số 20 thì hắn sẽ tìm luôn những dòng có 11-20, 21-30..kiểu kiểu thế...có thể fix lại giúp em ko.? thứ nhất là xóa luôn những dòng tìm được đúng điều kiện, hiện ra thông báo đã xóa bao nhiêu dòng (có thể ko cần cũng dc), và nếu em muốn thêm 3-4-5-6 điều kiện nữa thì e sẽ làm ntn? em cảm ơn rất nhiều
Bài đã được tự động gộp:


trước tiên là em cảm ơn đã rep @@. em có up 1 file bên dưới, nếu là ở dạng số thì đoạn vba này chạy chưa chính xác..ví dụ tìm xóa những dòng có số 1 và số 20 thì hắn sẽ tìm luôn những dòng có 11-20, 21-30..kiểu kiểu thế...có thể fix lại giúp em ko.? thứ nhất là xóa luôn những dòng tìm được đúng điều kiện, hiện ra thông báo đã xóa bao nhiêu dòng (có thể ko cần cũng dc), và nếu em muốn thêm 3-4-5-6 điều kiện nữa thì e sẽ làm ntn? em cảm ơn rất nhiều
Mình phải xác định với nhau một vấn đề rõ ràng như thế này:
1/ Đó là dữ liệu của bạn: đầu bài bạn đưa dữ liệu kiểu khác, bài #11 bạn đưa dữ liệu kiểu khác. Dữ liệu thật của bạn là thế nào?
2/ Vấn đề về cách loại bỏ: Dữ liệu của bạn là một chuỗi, vậy trong chuỗi đó bạn muốn bỏ dữ liệu kiểu "000" nhưng lại không muốn bỏ kiểu "2000" chẳng hạn? thế thì trước và sau "000" là ký tự loại nào? Nếu đi liền là số thì không xóa, còn đi liền là ký tự khác số thì xóa. Có phải ý vậy không?
 
Upvote 0
ác. Dữ liệu thật của bạn là thế nào?
2/ Vấn đề về cách loại bỏ: Dữ liệu của bạn là một chuỗi, vậy trong chuỗi đó bạn muốn bỏ dữ
Mình phải xác định với nhau một vấn đề rõ ràng như thế này:
1/ Đó là dữ liệu của bạn: đầu bài bạn đưa dữ liệu kiểu khác, bài #11 bạn đưa dữ liệu kiểu khác. Dữ liệu thật của bạn là thế nào?
2/ Vấn đề về cách loại bỏ: Dữ liệu của bạn là một chuỗi, vậy trong chuỗi đó bạn muốn bỏ dữ liệu kiểu "000" nhưng lại không muốn bỏ kiểu "2000" chẳng hạn? thế thì trước và sau "000" là ký tự loại nào? Nếu đi liền là số thì không xóa, còn đi liền là ký tự khác số thì xóa. Có phải ý vậy không?
ah dữ liệu number và text thì trích xuất khác nhau ạ? @@ a xử lý giúp e file đính kèm bên dưới với. ví dụ là tìm tất cả các dòng có số "2", "4", "20" là xóa hết. rất cảm ơn vì sự nhiệt tình ạ
 

File đính kèm

Upvote 0
1616133951534.png

trước tiên là em cảm ơn đã rep @@.
rep = representative : đại diện

Tôi chả buồn soi mói thớt. Tôi chỉ dẫn ra cái bôi tầy cho các bạn muốn học tiếng ngoại nghiêm chỉnh thôi.

Nhỏ giờ em chưa lô đề gì cả, cũng không tìm hiểu nên không biết nó thế nào luôn
Vậy bây giờ mình làm cho biết. :)
Tôi nhớ mình có từng viết bài giải thích nguồn gốc đề, cách đánh, cách bàn thai, cách làm huyện đề, kể cả trường hợp giụt nợ mà.
 
Upvote 0
dạ đoạn code này rất hợp với em ạ, nhưng em có 1 file mới và ví dụ em thêm vào dòng : "If res Like "*2*" And res Like "*4*" And res Like "*20*" Then" (tức là muốn xóa những dòng nào có số 2,4,20) thì code này lại chỉ tìm được 2 dòng, trong khi file của e có rất nhiều như : 02-04-13-20, 02-03-04-xx-20, 01-02-04-15-50....v..v ?? xin giải đáp giúp em
Hic, Bạn thử lại xem:
Mã:
Option Explicit
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, 20) ' <---  nhập các điều kiện cần xóa
    Dim a(), str As String, txt As String
    Dim 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) & "*"
            If du_lieu(i, 1) Like str Then
                If Len(txt) = 0 Then
                    txt = "A" & i
                ElseIf Len(txt) < 100 Then
                    txt = txt & "," & "A" & i
                Else
                    k = k + 1
                    ReDim Preserve a(1 To k)
                    a(k) = txt: txt = ""
                End If
            End If
        Next n
    Next i
    sheet.Range("A1").Resize(r).Offset(, 2).ClearContents
    If k = 0 Then Exit Sub
    For i = 1 To k
        txt = a(i)
        sheet.Range(txt).Offset(, 2).Value = "xoa dong nay phai khong ?"
    Next i
End Sub
 
Upvote 0
Hic, Bạn thử lại xem:
Mã:
Option Explicit
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, 20) ' <---  nhập các điều kiện cần xóa
    Dim a(), str As String, txt As String
    Dim 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) & "*"
            If du_lieu(i, 1) Like str Then
                If Len(txt) = 0 Then
                    txt = "A" & i
                ElseIf Len(txt) < 100 Then
                    txt = txt & "," & "A" & i
                Else
                    k = k + 1
                    ReDim Preserve a(1 To k)
                    a(k) = txt: txt = ""
                End If
            End If
        Next n
    Next i
    sheet.Range("A1").Resize(r).Offset(, 2).ClearContents
    If k = 0 Then Exit Sub
    For i = 1 To k
        txt = a(i)
        sheet.Range(txt).Offset(, 2).Value = "xoa dong nay phai khong ?"
    Next i
End Sub
dieu_kien = Array(2, 4, 20)

str = "*" & dieu_kien(n) & "*"
If du_lieu(i, 1) Like str Then

Array(2, 4, 20): 20 không cần
 
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

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

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
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) & "-"
Chuẩn rồi
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
Đem
If n = x Then
k = k + 1
du_lieu(k, 1) = du_lieu(i, 1)
End If
ra ngoài vòng "For n = 0 To x" sẽ chạy nhanh hơn
 
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
sau khi test thì đoạn này chạy phù hợp và chính xác nhất đối với yêu cầu của em @@
 
Upvote 0
@ Bạn ở bài #43:
Nghe Tây đã chưa? Tôi cản bạn hỏng kịp.
 
Upvote 0
Phục anh đoán được vụ nói tiếng Tây bồi này chứ em thì chịu hẳn.

Thấy trước ở đây rồi mà:

trước tiên là em cảm ơn đã rep @@. ...
ah dữ liệu number và text thì trích xuất khác nhau ạ? @@ a xử lý giúp e ...
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 @@)
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom