Giúp đỡ về code seach data

Liên hệ QC

babyheomoi

Thành viên thường trực
Tham gia
22/9/13
Bài viết
396
Được thích
91
Hi mọi người, em tìm được 1 code trên GPE về seach data đơn giản. Cụ thể code như sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim EndL As Long
If Target.Address <> "$F$2" Then Exit Sub
Application.EnableEvents = False
EndL = Range("F200").End(xlUp).Row
Range("$F$5:$F$" & EndL).AutoFilter Field:=1, Criteria1:="*" & Range("$F$2").Value & "*", Operator:=xlFilterValues
Application.EnableEvents = True

End Sub
Vâng, code này em xài thấy ổn, cho đến khi dạo gần đây trí nhớ kém @@
Do code chỉ lọc đúng 1 cọt F (Mã hàng) nên nhiều khi em ko nhớ mã, chỉ nhớ tên (mà tên nằm ở cột G)
Vậy mọi người cho em hỏi, em muốn:
- Gõ F2 nhưng tìm đồng thời ở cột F và cột G thì sửa thế nào?
- Thêm G2 vào code để có thể lúc muốn gõ G2 thì seach cột G, gõ F2 thì seach cột F thì sửa thế nào?
Em cám ơn ạ!
 
Lần chỉnh sửa cuối:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim DongC As Long, Col As Integer:                  Dim Rng As Range
 
 If Target.Address <> "$F$2" Then Exit Sub
 Application.EnableEvents = False
 
 DongC = Range("F200").End(xlUp).Row:                Col = [H1].Value
 Set Rng = Range("$F$5:$F$" & DongC).Offset(, Col)
 Rng.AutoFilter Field:=1, Criteria1:="*" & Range("$F$2").Value & "*", Operator:=xlFilterValues
 Application.EnableEvents = True
End Sub
??? ??? ???
 
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim DongC As Long, Col As Integer:                  Dim Rng As Range
 
 If Target.Address <> "$F$2" Then Exit Sub
 Application.EnableEvents = False
 
 DongC = Range("F200").End(xlUp).Row:                Col = [H1].Value
 Set Rng = Range("$F$5:$F$" & DongC).Offset(, Col)
 Rng.AutoFilter Field:=1, Criteria1:="*" & Range("$F$2").Value & "*", Operator:=xlFilterValues
 Application.EnableEvents = True
End Sub
??? ??? ???
Chủ thớt cần 2 code khác nhau
"em muốn:
- Gõ F2 nhưng tìm đồng thời ở cột F và cột G thì sửa thế nào?
- Thêm G2 vào code để có thể lúc muốn gõ G2 thì seach cột G, gõ F2 thì seach cột F thì sửa thế nào?"
 
Upvote 0
Chủ thớt cần 2 code khác nhau
"em muốn:
- Gõ F2 nhưng tìm đồng thời ở cột F và cột G thì sửa thế nào?
- Thêm G2 vào code để có thể lúc muốn gõ G2 thì seach cột G, gõ F2 thì seach cột F thì sửa thế nào?"
Dạ đúng rồi a, 2 trường hợp ạ.
 
Upvote 0
Bạn cần chú ý lỗi chính tả và lỗi đánh máy
Hổng phải lỗi chính tả hay đánh máy. Thớt thích viết tắt nên tự chế ra cách viết tắt tiêng Tây thôi.
Ở đây search, seek, hay see each gì đều không thành vấn đề bởi vì cái thớt muốn là filter.

Trường hợp II là mở rọng của trường hợp I mà thôi & mình tin là chủ bài đăng tự ên được!
...
Trường hợp 2 đâu phải mở rộng của 1.

Trường hợp 1, thớt muốn lọc theo lô gic OR. Cột F hoặc G có chứa trị F2. Hình như trường hợp này phải dùng cột phụ. Bạn nào biết cách không phải dùng cột phụ thì tôi sẵn sàng học hỏi.

Trường hợp 2 thì thớt chưa cho biết rõ là thằng nào ưu tiên hơn thằng nào. Có 3 kiểu:
1. lọc theo cả hai F và G. Lô gic OR như trên: Cột F chứa F2 hoặc cột G chứa G2
2. lọc theo cả hai F và G. Lô gic AND. Cột F chứa F2 và cột G chứa G2.
3. lọc chỉ theo F2 hoặc G2. Gõ F2 thì lọc theo cột F và xoá G2. Gõ G2 thì lọc theo G2 và xoá F2. Cái chỗ "xoá" tôi tự thêm vì nếu không có nó, bảng tính sẽ rất khó hiểu. Thớt chưa làm được ý định mình cho nên chưa biết những chỗ phi lý mà bảng tính cần phải giải quyết.
 
Upvote 0
Trường hợp 1, thớt muốn lọc theo lô gic OR. Cột F hoặc G có chứa trị F2. Hình như trường hợp này phải dùng cột phụ. Bạn nào biết cách không phải dùng cột phụ thì tôi sẵn sàng học hỏi.
Vâng, nếu được trường hợp 1 thì tốt quá, vì khi đó có thể mở rộng phạm vi seach ra nhiều cột luôn.
Trường hợp 2 thì thớt chưa cho biết rõ là thằng nào ưu tiên hơn thằng nào. Có 3 kiểu:
1. lọc theo cả hai F và G. Lô gic OR như trên: Cột F chứa F2 hoặc cột G chứa G2
2. lọc theo cả hai F và G. Lô gic AND. Cột F chứa F2 và cột G chứa G2.
3. lọc chỉ theo F2 hoặc G2. Gõ F2 thì lọc theo cột F và xoá G2. Gõ G2 thì lọc theo G2 và xoá F2. Cái chỗ "xoá" tôi tự thêm vì nếu không có nó, bảng tính sẽ rất khó hiểu. Thớt chưa làm được ý định mình cho nên chưa biết những chỗ phi lý mà bảng tính cần phải giải quyết.
Thật ra ý định ban đầu của em là lọc cột F, nhưng nếu không nhớ mã, nhớ mang máng tên thì lọc cột G, khi đó cột F rỗng, chứ không phải cả 2 F2 và G2 đều có dữ liệu. Như anh nói thì đó là ý số 3 ạ!
 
Upvote 0
Tôi không hiểu Application.EnableEvents làm gì trong code của bạn nên tôi bỏ đi. Code không phục vụ quá 200 dòng dữ liệu nên tôi nghĩ nên sửa để phục vụ. Vd. thành
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim EndL As Long
    If Target.Address <> "$F$2" Then Exit Sub
    EndL = Me.Cells(Rows.Count, targe.Column).End(xlUp).Row
    Me.Cells(5, Target.Column).Resize(EndL - 4).AutoFilter Field:=1, Criteria1:="*" & Me.Target.Value & "*", Operator:=xlFilterValues
End Sub
Bây giờ EndL và giá trị lọc không phụ thuộc cứng nhắc vào cột F nữa mà phụ thuộc vào cột của Target. Tức nếu Target = F2 thì EndL và giá trị lọc tính theo F2, còn nếu Target = G2 thì EndL và giá trị lọc tính theo G2.

Việc bây giờ phải làm là sửa code sao cho khi có thay đổi ở F2 HOẶC G2 thì mới thực hiện code, ngược lại thì dọn đồ chơi:
- If Target.Address <> "$F$2" And Target.Address <> "$G$2" Then Exit Sub (dọn đồ chơi cả khi dùng copy/paste để thay đổi ĐỒNG THỜI F2 và G2. Nếu gõ tay thì không bao giờ có chuyện ĐỒNG THỜI).

Tóm lại là code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim EndL As Long
    If Target.Address <> "$F$2" And Target.Address <> "$G$2" Then Exit Sub
    EndL = Me.Cells(Rows.Count, Target.Column).End(xlUp).Row
    Me.Cells(5, Target.Column).Resize(EndL - 4).AutoFilter Field:=1, Criteria1:="*" & Me.Target.Value & "*", Operator:=xlFilterValues
End Sub

Tôi viết trong notepad không test, hi vọng không có lỗi.
 
Upvote 0
Dạ, cám ơn anh batman1. Em test thì bị lỗi chỗ này ạ
Mã:
 Me.Cells(5, Target.Column).Resize(EndL - 4).AutoFilter Field:=1, Criteria1:="*" & Me.Target.Value & "*", Operator:=xlFilterValues
Chỗ màu đỏ ạ! => Me.Target.Value
Sẵn cho em hỏi luôn: cấu trúc Me.cells => ý nghĩa là gì ạ? e thấy hay xài trong user form mà vẫn chưa hiểu lắm!
 

File đính kèm

  • loi Code seach.jpg
    loi Code seach.jpg
    29.1 KB · Đọc: 12
Upvote 0
Dạ, cám ơn anh batman1. Em test thì bị lỗi chỗ này ạ
Mã:
 Me.Cells(5, Target.Column).Resize(EndL - 4).AutoFilter Field:=1, Criteria1:="*" & Me.Target.Value & "*", Operator:=xlFilterValues
Chỗ màu đỏ ạ! => Me.Target.Value
Bạn sửa thành Target.Value. Tôi viết trong notepad không test mà.
Sẵn cho em hỏi luôn: cấu trúc Me.cells => ý nghĩa là gì ạ? e thấy hay xài trong user form mà vẫn chưa hiểu lắm!
Bạn có thể truy cập tới cell vd. F2 thông qua thuộc tính RANGE: ThisWorkbook.WorkSheets("Sheet5").Range("F2"). Nhưng cũng có thể thông qua thuộc tính CELLS(chỉ số dòng, chỉ số cột hoặc tên cột): ThisWorkbook.WorkSheets("Sheet5").Cells(2, 6) cũng chính là ThisWorkbook.WorkSheets("Sheet5").Cells(2, "F") <- cell ThisWorkbook.WorkSheets("Sheet5").Range("F2")
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sửa thành Target.Value. Tôi viết trong notepad không test mà.

Bạn có thể truy cập tới cell vd. F2 thông qua thuộc tính RANGE: ThisWorkbook.WorkSheets("Sheet5").Range("F2"). Nhưng cũng có thể thông qua thuộc tính CELLS(chỉ số dòng, chỉ số cột hoặc tên cột): ThisWorkbook.WorkSheets("Sheet5").Cells(2, 6) cũng chính là ThisWorkbook.WorkSheets("Sheet5").Cells(2, "F") <- cell ThisWorkbook.WorkSheets("Sheet5").Range("F2")
Cám ơn anh, code dể hiểu ạ!
Tuy nhiên, code này chạy thử thì có 1 nhược điểm:
+ Giả sử gõ F2 để seach => sau đó xóa F2, rồi qua G2 seach => thì nó vẫn filter cột F2.
+ Còn làm như sau thì không bọ: Chột F2 => xóa F2 => Xóa filter ở F5 => qua g2 seach => filter G5
=> Anh có thể sửa code khắc phục chỗ này không ạ?
Vậy Me trong trường hợp này em hiểu ngắn gọn là ThisWorkbook.WorkSheets("Sheet5") phải ko ạ? Vậy sau này thay vì viết code ThisWorkbook.Sheet hiện tại. cells(a,b) thì mình có thê viết Me.Cells(a,b) cho gọn phải ko ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn anh, code dể hiểu ạ!
Tuy nhiên, code này chạy thử thì có 1 nhược điểm:
+ Giả sử gõ F2 để seach => sau đó xóa F2, rồi qua G2 seach => thì nó vẫn filter cột F2.
+ Còn làm như sau thì không bọ: Chột F2 => xóa F2 => Xóa filter ở F5 => qua g2 seach => filter G5
=> Anh có thể sửa code khắc phục chỗ này không ạ?
Trước khi trách người thì nên trách mình.
1. Bạn tung một đoạn code nhưng không một lời mô tả về trình tự thao tác. Vậy có thể như sau: gõ F2 -> sẽ lọc theo F2 -> thẻ Data -> nhấn Filter để BỎ LỌC -> gõ G2 -> lọc theo G2. Không mô tả thứ tự thao tác vậy thứ tự như tôi liệt kê hoàn toàn có thể sảy ra.

2. Bạn mô tả yêu cầu như sau
- Gõ F2 nhưng tìm đồng thời ở cột F và cột G thì sửa thế nào?

Mà ĐỒNG THỜI có thể hiểu là lọc vừa theo F2 vừa theo G2 - 2 điều kiện đồng thời. Cách mô tả là chưa chính xác, dễ gây hiểu lầm. Tuy nhiên tôi cố tình hiểu là chỉ lọc theo 1 tiêu chí hoặc F2 hoặc G2. Có thể tôi đã hiểu đúng nhưng không có nghĩa là bạn đã mô tả chính xác.

Code sau đây chỉ lọc theo 1 tiêu chí. Khi gõ F2 thì lọc theo F2 không thèm để ý, liệu G2 có rỗng hay không. Cũng không thèm xóa G2 nếu đúng là có dữ liệu. Khi gõ G2 thì lọc theo G2 không thèm để ý, liệu F2 có rỗng hay không. Cũng không thèm xóa F2 nếu đúng là có dữ liệu. Khi nào muốn xóa cho khỏi ngứa mắt thì chọn F2 hoặc G2 và nhấn Delete.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim EndL As Long
    If Target.Address <> "$F$2" And Target.Address <> "$G$2" Then Exit Sub
    Me.AutoFilterMode = False
    EndL = Me.Cells(Rows.Count, Target.Column).End(xlUp).Row
    Me.Cells(5, Target.Column).Resize(EndL - 4).AutoFilter Field:=1, Criteria1:="*" & Target.Value & "*", Operator:=xlFilterValues
End Sub

Vậy Me trong trường hợp này em hiểu ngắn gọn là ThisWorkbook.WorkSheets("Sheet5") phải ko ạ? Vậy sau này thay vì viết code ThisWorkbook.Sheet hiện tại. cells(a,b) thì mình có thê viết Me.Cells(a,b) cho gọn phải ko ạ?

Me chỉ dùng trong class module, có thể coi đó là biến không được khai báo tường minh, đại diện cho đối tượng của lớp mà code đang được thực thi. Trong trường hợp ở trên Me chẳng qua là worksheet cụ thể - worksheet chứa code đang thực thi. Trong các thực thể còn lại Me cũng được dùng trong ThisWorkbook (Me đại diên cho workbook mà trong đó có code hiện hành - chính là ThisWorkbook), trong class module (đại diện cho đối tượng của lớp mà trong đó có code hiện hành).

Tóm lại tùy vào ngữ cảnh mà Me đại diện cho worksheet, workbook, lớp clsMySecret nào đó. Không có chuyện dùng Me trong general module.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom