Tìm nhiều cụm từ, sau đó delete các dòng có cụm từ đó

Liên hệ QC

hoanglocphat

Thành viên thường trực
Tham gia
27/1/13
Bài viết
258
Được thích
30
Nhờ các bạn giải quyết vấn đề sau:
Tôi muốn các cụm từ: (VANG/CO LY DO), (BINH), (KHONG RO) ...
Nếu có các từ này trong cột B thì delete những dòng nào có từ đó

Tôi có Rercod (dùng Add current selection to filter), nhưng không thể áp dụng cho thực tế được vì họ tên bị thay đổi thì nó tìm không được, nhờ các bạn sửa code hoặc viết mới

Sub Macro8()

ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:= _
"Nguyê~n Van Minh (VANG/CO LY DO)"
ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:=Array( _
"Lê Tri´ Du~ng (Binh)", "Ngô Van Vang (BINH)", "Nguyê~n Van Minh (VANG/CO LY DO)" _
), Operator:=xlFilterValues
ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:=Array( _
"Lê Tri´ Du~ng (Binh)", "Ngô Van Vang (BINH)", "Nguyê~n Bi´nh Hu`ng (KHONG RO)", _
"Nguyê~n Van Minh (VANG/CO LY DO)"), Operator:=xlFilterValues
Rows("3:11").Select
Selection.Delete Shift:=xlUp
ActiveSheet.ShowAllData
End Sub
Xin cảm ơn
 

File đính kèm

Nhờ các bạn giải quyết vấn đề sau:
Tôi muốn các cụm từ: (VANG/CO LY DO), (BINH), (KHONG RO) ...
Nếu có các từ này trong cột B thì delete những dòng nào có từ đó

Tôi có Rercod (dùng Add current selection to filter), nhưng không thể áp dụng cho thực tế được vì họ tên bị thay đổi thì nó tìm không được, nhờ các bạn sửa code hoặc viết mới

Sub Macro8()

ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:= _
"Nguyê~n Van Minh (VANG/CO LY DO)"
ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:=Array( _
"Lê Tri´ Du~ng (Binh)", "Ngô Van Vang (BINH)", "Nguyê~n Van Minh (VANG/CO LY DO)" _
), Operator:=xlFilterValues
ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:=Array( _
"Lê Tri´ Du~ng (Binh)", "Ngô Van Vang (BINH)", "Nguyê~n Bi´nh Hu`ng (KHONG RO)", _
"Nguyê~n Van Minh (VANG/CO LY DO)"), Operator:=xlFilterValues
Rows("3:11").Select
Selection.Delete Shift:=xlUp
ActiveSheet.ShowAllData
End Sub
Xin cảm ơn
Bạn xác định có ngặc thì xóa không có ngoặc thì thôi.Vì bài của bạn có chữ Binh ai biết xóa thế nào.
 
Upvote 0
Bạn xác định có ngặc thì xóa không có ngoặc thì thôi.Vì bài của bạn có chữ Binh ai biết xóa thế nào.
Thực tế thì có nhiều lý do, trong đó có những lý do sẽ không bị xóa ví dụ (co phep) ...
Mình chỉ cần xóa chính xác các cụm từ trên thì có cách nào không vậy bạn!
Cảm ơn các bạn!
 
Upvote 0
Nhờ các bạn giải quyết vấn đề sau:
Tôi muốn các cụm từ: (VANG/CO LY DO), (BINH), (KHONG RO) ...
Nếu có các từ này trong cột B thì delete những dòng nào có từ đó

Tôi có Rercod (dùng Add current selection to filter), nhưng không thể áp dụng cho thực tế được vì họ tên bị thay đổi thì nó tìm không được, nhờ các bạn sửa code hoặc viết mới

Sub Macro8()

ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:= _
"Nguyê~n Van Minh (VANG/CO LY DO)"
ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:=Array( _
"Lê Tri´ Du~ng (Binh)", "Ngô Van Vang (BINH)", "Nguyê~n Van Minh (VANG/CO LY DO)" _
), Operator:=xlFilterValues
ActiveSheet.Range("$A$2:$C$8").AutoFilter Field:=2, Criteria1:=Array( _
"Lê Tri´ Du~ng (Binh)", "Ngô Van Vang (BINH)", "Nguyê~n Bi´nh Hu`ng (KHONG RO)", _
"Nguyê~n Van Minh (VANG/CO LY DO)"), Operator:=xlFilterValues
Rows("3:11").Select
Selection.Delete Shift:=xlUp
ActiveSheet.ShowAllData
End Sub
Xin cảm ơn
Bạn thử code này:
PHP:
Sub delerow()
Dim rng As Range, rngdele As Range, cell As Range, str_fill
Set rng = Range("B3:B" & [B10000].End(xlUp).Row)
str_fill = "VANG/CO LY DO|BINH|KHONG RO" ''' Then dieu kien xoa vao day
With CreateObject("vbscript.regexp")
    .Pattern = "\(" & str_fill & "\)"
    For Each cell In rng
        If .test(cell.Value) Then
            If rngdele Is Nothing Then
                Set rngdele = cell
            Else
                Set rngdele = Union(rngdele, cell)
            End If
        End If
    Next
    rngdele.EntireRow.Delete
End With
End Sub
 
Upvote 0
Góp ý cho bạn một Code VBA.
Vì dữ liệu cần tìm kiếm của bạn có cấu trúc, có thể tìm kiếm bằng phương thức Like
Nếu khớp cấu trúc:
1. Chứa bất kỳ ký tự nào xuất hiện 0 đến n lần
2. Chứa dấu (
3. Chứa ký tự đầu tiên là V hoặc B hoặc K
4. Chứa bất kỳ ký tự nào xuất hiện 0 đến n lần
5. Chứa dấu )
6. Chứa bất kỳ ký tự nào xuất hiện 0 đến n lần

Đưa kết quả tìm được vào mảng rồi trả kết quả

Copy Code bên dưới vào một Module
PHP:
Sub CheckOff()
    Dim Arr(), i&, k&, rArr(), LastRow&, hasData As Boolean
    LastRow = Range("A" & Rows.Count).End(xlUp).Row
    Arr = Range("A3:C" & LastRow).Value
    For i = Lbound(Arr) To Ubound(Arr)
      If Not Ucase$(Arr(i, 2)) Like "*([VBK]*)*" Then
         k = k + 1
         Redim Preserve rArr(1 To 3, 1 To k)
         rArr(1, k) = Arr(i, 1)
         rArr(2, k) = Arr(i, 2)
         rArr(3, k) = Arr(i, 3)
      Else
          If hasData = False Then hasData = True
      End IF
    Next
    If  hasData Then
      Range("A3:C" & LastRow).ClearContents
      Range("A3").Resize(k, 3) = Application.WorksheetFunction.Transpose(rArr)
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử code này:
PHP:
Sub delerow()
Dim rng As Range, rngdele As Range, cell As Range, str_fill
Set rng = Range("B3:B" & [B10000].End(xlUp).Row)
str_fill = "VANG/CO LY DO|BINH|KHONG RO" ''' Then dieu kien xoa vao day
With CreateObject("vbscript.regexp")
    .Pattern = "\(" & str_fill & "\)"
    For Each cell In rng
        If .test(cell.Value) Then
            If rngdele Is Nothing Then
                Set rngdele = cell
            Else
                Set rngdele = Union(rngdele, cell)
            End If
        End If
    Next
    rngdele.EntireRow.Delete
End With
End Sub
Bạn cho tôi hỏi có thể đưa tiếng Việt có dấu vào str_fill được không, ví dụ: KIỂM TRA LẠI
 
Upvote 0
Bạn có thể tìm hiểu bảng mã Unicode tiếng Việt trong Regular Expression
Mã:
str_fill = "VANG/CO LY DO|BINH|KHONG RO|KI\u1EC2M TRA L\u1EA0I"
Cảm ơn bạn!
Tôi đã lên Google tìm Regular Expression nhưng không hiểu nó là gì!
Bạn cho hỏi có code nào để có thể Convert từ Tiếng việt sang Regular Expression không, hoặc có web nào không!!!?
Mặc khác có thể đặt str_fill trong 1 ô của excel không, vì muốn thêm bớt thì nó thuận tiện hơn vào code để sửa
 
Upvote 0
Cảm ơn bạn!
Tôi đã lên Google tìm Regular Expression nhưng không hiểu nó là gì!
Bạn cho hỏi có code nào để có thể Convert từ Tiếng việt sang Regular Expression không, hoặc có web nào không!!!?
Mặc khác có thể đặt str_fill trong 1 ô của excel không, vì muốn thêm bớt thì nó thuận tiện hơn vào code để sửa
Sao bạn phải hỏi nhỉ.Cái đấy mình có thể test được mà.Trong code bạn không biết viết tiếng việt thì có thể đặt ngoài cells rồi gán vào code cũng được.
 
Upvote 0
Trong code bạn không biết viết tiếng việt thì có thể đặt ngoài cells rồi gán vào code cũng được.
Làm từ sáng đến giờ thì cũng ra
tại A1, ta có các cụm từ : Hỏi hoài|code chạy cực nhanh|mò đến giờ mới ra
Trong code ta sửa
str_fill = Sheets("Sheet1").Range("A1").Value
Chỉ có 1 điều kiện để đưa vào ô A1 là chưa tìm ra được như
Từ ô A3 đến A8 đều có dữ liệu trong các ô
Từ ô B3 đến B8 đều có dữ liệu trong các ô, trừ ô B5 là không có dữ liệu (ô trống)
Vì ô B5 là trống nên tôi muốn delete luôn dòng số 5 này luôn
Tôi muốn đưa điều kiện là ô trống thì nó delete luôn để đưa vào ô A1 nói trên nhưng chưa làm được, các bạn giúp mình!
Cảm ơn các bạn.
 
Upvote 0
Tôi đã lên Google tìm Regular Expression nhưng không hiểu nó là gì
Nếu bạn thực sự đang Học VBA và thường xuyên thao tác với Chuỗi thì mới tìm hiểu sâu Regular Expression.
Regular Expression là biểu thức chính quy được chuẩn hóa cho hầu hết tất cả các ngôn ngữ lập trình để dễ dàng hơn trong việc xử lý và tìm kiếm chuỗi.
 
Upvote 0
Trường hợp của bạn không phải là bạn chỉ biết dạng các giá trị tìm kiếm mà bạn biết rõ các giá trị đó. Vậy thì cứ dùng INSTR thôi.

1. Vd. A1 = VẮNG/CÓ LÝ DO|BÌNH|KHÔNG RÕ
Có thể có dấu cách trước và sau "|", code sẽ tự loại chúng.
2. Code
Code phục vụ trường hợp không có dữ liệu, và cả trường hợp có dữ liệu nhưng không có dòng nào thỏa điều kiện, tức sẽ không có dòng nào bị xóa. Vì thế mới có:
If Not rng Is Nothing Then rng.EntireRow.Delete

Mã:
Sub deleterows()
Dim lastRow As Long, r As Long, k As Long, text As String, findtext As String, rng As Range, sh As Worksheet, str_find, data()
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    With sh
        lastRow = .Range("B" & Rows.Count).End(xlUp).Row
        If lastRow < 3 Then Exit Sub
        data = .Range("B3:B" & lastRow + 1).Value
        str_find = Split(.Range("A1").Value, "|")
    End With
    For r = 1 To UBound(data) - 1
        text = data(r, 1)
        For k = LBound(str_find) To UBound(str_find)
            findtext = Trim(str_find(k))
            If InStr(1, text, findtext) Then
                If rng Is Nothing Then
                    Set rng = sh.Range("B" & r + 2)
                Else
                    Set rng = Union(rng, sh.Range("B" & r + 2))
                End If
                Exit For
            End If
        Next k
    Next r
    If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub
 
Upvote 0
Nếu bạn muốn xóa các dòng có chứa 1 trong các đoạn được liệt kê và cả những dòng mà ở cột B rỗng thì
sửa
Mã:
lastRow = .Range("B" & Rows.Count).End(xlUp).Row
thành
Mã:
lastRow = .Range("A" & Rows.Count).End(xlUp).Row
và sửa
Mã:
If InStr(1, text, findtext) Then
thành
Mã:
If Len(text) = 0 Or InStr(1, text, findtext) Then

Đó là cách sửa ít nhất. Sữa "kỹ" thì là trước dòng For k = ... ta kiểm tra text có rỗng không, nếu rỗng thì thêm luôn ô hiện hành vào nhóm sẽ xóa mà không vào vòng lặp For k = ... nữa. Thực ra cách "không kỹ" khác "kỹ" khi ô ở cột B rỗng chỉ là thực hiện thêm 1 vòng của For k = ... và đọc findtext và tính giá trị biểu thức Len(text) = 0 Or InStr(1, text, findtext). Nếu bạn hâm mộ tốc độ tới mức "cuồng" thì tôi chỉ ra cách sửa như thế.

Regular Expression không hẳn và chắc chắn không mạnh về tốc độ. Nó mạnh ở chỗ cho phép tìm kiếm mà chỉ biết dạng của chuỗi tìm kiếm. Khi chuỗi tìm kiếm được biết rõ về giá trị thì INSTR nhanh chóng mặt luôn
 
Lần chỉnh sửa cuối:
Upvote 0
...
Regular Expression không hẳn và chắc chắn không mạnh về tốc độ. Nó mạnh ở chỗ cho phép tìm kiếm mà chỉ biết dạng của chuỗi tìm kiếm. Khi chuỗi tìm kiếm được biết rõ về giá trị thì INSTR nhanh chóng mặt luôn
Xin phép thêm: nhất là khi người dùng chưa nắm vững về mức độ "tham lam (greedy)" của nó; lúc lập mẫu lại thích mẫu bao càng nhiều càng tốt.
Nguyên tắc: mẫu bao càng nhiều trường hợp thì càng chậm.
 
Upvote 0
Xin phép thêm: nhất là khi người dùng chưa nắm vững về mức độ "tham lam (greedy)" của nó; lúc lập mẫu lại thích mẫu bao càng nhiều càng tốt.
Nguyên tắc: mẫu bao càng nhiều trường hợp thì càng chậm.
Tôi cũng thích cách nói "háu ăn" :D
 
Upvote 0
Rất đơn giản Regular Expression là một hàm Win API, có thể gọi nó là một Ứng dụng đơn lẻ. Khi đưa vào VBA sử dụng, cần được biên dịch trước nên chậm là lẽ đương nhiên.
Với tìm kiếm thuần VBA. Thì mọi dạng tìm kiếm đều ở dạng Tìm kiếm nhị phân ( Search Binary - Nhanh ). Tuy nhiên nếu dựa trên VBA viết một ứng dụng đầy đủ tương tự Regular Expression thay cho Win API thì "On Error Resume Next".

Có thể tìm kiếm một chuỗi có độ phức tạp cao với Biểu thức chính quy rất nhanh, Code ngắn. VBA thì ngược lại, buộc phải viết code, nghĩ thêm giải thuật, logic -> rất Oái Oăm.
 
Upvote 0
Trong mớ ê-mô-ti-con của GPE có cái nào hình chắp tay bái phục không nhỉ. Bà con có ai biết chỉ giùm tôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là diễn đàn Excel, góc lập trình VBA, nói chuyện Xề lé ni um (*) hay Pái thòn (**) còn doạ người ta được.

Tìm kiếm nhị phân ( Search Binary - Nhanh ) [sic] là căn bản lập trình, ai học qua đều biết. Có bước vào tranh luận lĩnh vực này thì nên dòm trước ngó sau một chút.
 
Upvote 0
Theo quyển từ điển của tôi mới vừa sưu tầm được thì Xề lé là một loại thuốc bổ được mấy nhà sản xuất tuyên dương là chống lão hoá, chống ung thư, trị si đa, đủ thứ. Còn pái thòn thì nó dịch là một loài bò sát, tiếng Việt gọi là con trăn.
Một thứ là thuốc lang băm, thứ kia là thú lớn giết người, không sợ sao được.

Chú: quyển từ điển này bảo nó dịch #IF thì nó trả lời rằng # là dấu hash, IF là một function. Tôi đem ghép lại thì ra #IF là hash function.
 
Upvote 0
Web KT

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

Back
Top Bottom