Auto Filter Tự động bằng từ cách gõ từ khóa trong VBA!

  • Thread starter thanhphuongvip
  • Ngày gửi
T

thanhphuongvip

Guest
Chào mọi người, mình đang sử dụng VBA để tạo cách filter tự động bằng cách gõ từ khóa ở đầu mỗi cột để lọc ra những dữ liệu thỏa mãn 1 hoặc nhiều điều kiện.
Mình không biết cách làm này có tối ưu chưa, hay là còn cách nào hay hơn thì mong các bạn chỉ giáo.

Giả sử mình có bảng chi tiết bán hàng, và mình muốn lọc các cột có màu xanh tương ứng đầu mỗi cột như hình:

Bạn cần đăng nhập để thấy hình ảnh


Khi đó mình tạo một cột phụ và dùm hàm Seach để tạo vùng điều kiện cho nó, mỗi cột cần filter là một điều kiện, như:

Bạn cần đăng nhập để thấy hình ảnh


và code cho sheet hiện tại sẽ là:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.Count > 1 Then Exit Sub
If Target.Address = "$C$8" Or Target.Address = "$D$8" _
   Or Target.Address = "$K$8" Or Target.Address = "$A$8" Or Target.Address = "$M$8" Then
  
  Range("A9:M65000").AdvancedFilter _
    Action:=xlFilterInPlace, _
      CriteriaRange:=Range("$P$7:TS$8"), Unique:=False
                  
End If

Application.ScreenUpdating = True
End Sub
Hạn chế của cách làm này:
- Chỉ lọc đc theo chuỗi, ko lọc dc theo giá trị như lớn hơn, nhỏ hơn. Ví dụ mình muốn lọc ra hóa đơn lớn hơn 5 (>5) thì không được.
- Phải có các cột điều kiện phụ, rườm rà.
- Khi xóa từ khóa đi thì nó ko về chế độ Showall Data vẫn còn một số cột còn ẩn, như hình:

Bạn cần đăng nhập để thấy hình ảnh


Để khắc phục điều này thì mình phải thêm nút Xóa Lọc ở trên với code:

Mã:
Sub XoaLoc_CTBH()
If Sheet4.FilterMode = False Then Exit Sub
Range("A8").ClearContents
Range("C8").ClearContents
Range("d8").ClearContents
Range("k8").ClearContents
Range("m8").ClearContents
ActiveSheet.ShowAllData
End Sub
Tuy nhiên với dữ liệu vài chục ngàn dòng thì code này chạy rất chậm.

Để rõ hơn các bạn xem file đính kèm:

Các bạn có cách nào hay hơn thì chỉ giáo với!
Xin cảm ơn!
 

vbano1

SMod
Thành viên BQT
Cho mình hỏi một chút nhằm làm rõ vấn đề.
-Tại sao không dùng filter thông thường mà phải cho vào VBA làm gì ạ?
-Mục đích của việc này nhằm làm gì, thú thực mình chưa hiểu, vì mình vẫn dùng filter bằng tay ạ.
 
T

thanhphuongvip

Guest
Cho mình hỏi một chút nhằm làm rõ vấn đề.
-Tại sao không dùng filter thông thường mà phải cho vào VBA làm gì ạ?
-Mục đích của việc này nhằm làm gì, thú thực mình chưa hiểu, vì mình vẫn dùng filter bằng tay ạ.
- Cách seach bằng VBA sẽ rút ngắn rất nhiều thao tác so với các làm thông thường (chỉ cần gõ từ khóa, thay vì phải click chuột nhiều lần).
- Mình học VBA đi theo hướng viết phần mềm chuyên nghiệp, nên sau này phần mềm viết ra sẽ bị ẩn hết các thanh công cụ của Excel, vì vậy người dùng thể sử dụng công cụ Excel như thông thường, mà chỉ sử dụng cách chức năng cho phép thôi, đây là ví dụ:

Bạn cần đăng nhập để thấy hình ảnh
 
S

Snow24

Guest
- Cách seach bằng VBA sẽ rút ngắn rất nhiều thao tác so với các làm thông thường (chỉ cần gõ từ khóa, thay vì phải click chuột nhiều lần).
- Mình học VBA đi theo hướng viết phần mềm chuyên nghiệp, nên sau này phần mềm viết ra sẽ bị ẩn hết các thanh công cụ của Excel, vì vậy người dùng thể sử dụng công cụ Excel như thông thường, mà chỉ sử dụng cách chức năng cho phép thôi, đây là ví dụ:

Bạn cần đăng nhập để thấy hình ảnh
Bạn thử với file tầm 2000 dòng là thấy không chạy được rồi lag lắm.Bạn có thể làm trên form nó sẽ nhanh và tiện hơn nhé.
 
T

thanhphuongvip

Guest
Bạn thử với file tầm 2000 dòng là thấy không chạy được rồi lag lắm.Bạn có thể làm trên form nó sẽ nhanh và tiện hơn nhé.
Đúng là vậy, nên mình mới hỏi xem anh em có code nào hay chia sẻ với, tại trình mình tới đó thôi :D
 
T

thanhphuongvip

Guest
Bạn làm trên form đó tìm kiếm trên đó nó vừa nhanh.Lại không bị hỏng dữ liệu của mình.
Cảm ơn Snow, mình vẫn chưa biết làm trên UserForm. Snow có thể chỉ cho mình một code như bảng trên, để sau này nếu có áp dụng với bảng khác nữa đc ko?
Trong code cùng 1 lệnh tìm kiếm trong nhiều cột do mình chỉ định.
 

tuhocvba

Administrator
Thành viên BQT
Vấn đề bạn muốn hỏi: Làm sao để tăng tốc độ lọc.
Mình đề cử access. Nó lọc vô đối nhanh luôn.

Cụ thể về giải pháp: Mình nghĩ bạn hãy thử sử dụng kết hợp excel và access.
Trong đó access lưu trữ dữ liệu, đóng vai trò là database.
Excel đóng vai trò giao diện, dùng để truy vấn tới cơ sở dữ liệu. Cụ thể nên sử dụng UserForm để hiển thị. Data lấy từ access và load lên userform của excel. Sẽ tốn công tốn sức thiết kế giao diện UserForm một chút, nhưng đẹp và gọn gàng.

Access lưu trữ cũng chả khác gì excel, cho nên việc này sẽ không làm khó bạn. Đừng ngại dùng cái mới. Trên diễn đàn cũng đã có hướng dẫn rồi.
Về code: Câu lệnh truy vấn cơ sở dữ liệu cực gọn và mạnh. Không dài dòng lôi thôi như code VBA.
File excel bạn giữ lại để tận dụng Userform hiện tại.

Vậy bạn cần:
1. Tìm đọc các bài trong box Access và thực hành theo, mình nghĩ chừng đó đủ để bạn làm bất cứ cái gì bạn muốn.
2. Xây dựng ý tưởng muốn hiển thị cái gì -> Tạo UserForm trên excel.
=> Kết nối excel với access để lấy dữ liệu và hiển thị trên UserForm. Trong box acess đã nói đủ rồi.

Về code: Mình không có nhận xét gì.
+) Thú thực là lệnh Filter mình dùng đúng một lần trong VBA, và không nhìn thấy tác dụng to lớn của nó. Dễ sai sót nếu trong vùng data có dòng trống, mà điều này mình không kiểm soát được. Code rườm rà so với VBA tác động lọc trên access.
 
T

thanhphuongvip

Guest
Mình thấy file của bạn @thanhphuongvip sử dụng khá nhiều UserForm. Vì vậy, mình không nghĩ là @thanhphuongvip cần trợ giúp gì về UserForm.
Mình nhìn thấy một vấn đề là, các chức năng khá rườm rà. Có lẽ P cần xem lại thiết kế:
Cụ thể, muốn làm cái gì, muốn hiển thị cái gì, trong ô hiển thị ấy có những thao tác nào, với mỗi thao tác, sự kiện nào sẽ xảy ra, mỗi sự kiện xảy ra thì thông báo như thế nào.
Đầu tiên đi từ tổng quan, chương trình sẽ có những chức năng gì. Rồi ứng với mỗi chức năng sẽ tương ứng giao diện như thế nào.
-> Đi vào cụ thể, trên giao diện ấy có những nút bấm nào
-> Nút bấm ấy có chức năng gì
Trong quá trình code chức năng nào đó, nếu không biết thì hỏi.

Thường một chương trình nếu mất 7 ngày làm, thì 5 ngày thiết kế, và chỉ mất 1 ngày code, 1 ngày test lại thôi. Thời gian thiết kế thường mất nhiều thời gian nhất, nhưng nếu thiết kế chỉn chu, thì việc code sẽ rất nhanh. Vừa nghĩ, vừa làm, thì các chức năng sẽ lan man, và rối loạn.

Đây chưa phải là một chương trình tốt nhất, nhưng nó có hàm ý, muốn làm thì bạn phải thiết kế, rồi trình cái thiết kế đó ra thì ai cũng hiểu được. Còn đọc code, cực kỳ nhức mắt luôn ấy.
Thật ra UserForm trong file là mình cũng nhờ vả cả, sau đó mình áp dụng rập khuôn vào file khác chứ thật sự chưa hiểu hết code trong đó, đang học từ từ, thấm dần dần. hihi
 
S

Snow24

Guest
Thế thì chưa cần code nhanh, cứ code chạy được và chạy đúng ý mình đã. Mình cũng có khoảng thời gian như vậy, lắp ghép lại để chạy theo đúng ý mình. Vậy bạn cứ thong thả xem video cho người mới bắt đầu, không cần vội. Chậm mà chắc (không từ bỏ đam mê và hứng thú với VBA) là được.
Bạn cho mình xin code sửa dữ liệu từ excel vào accsee.Mình đang làm với ADO nhưng mới nên nhiều chỗ khó hiểu quá.Bạn có tài liệu không giới thiệu mình với.
Thật ra UserForm trong file là mình cũng nhờ vả cả, sau đó mình áp dụng rập khuôn vào file khác chứ thật sự chưa hiểu hết code trong đó, đang học từ từ, thấm dần dần. hihi
Còn vấn đề của bạn thì bạn có thể dùng mảng trong VBA là được à.
 
Top