Lọc theo điều kiện cho các ComboBox

  • Thread starter Thread starter BNTT
  • Ngày gửi Ngày gửi
Liên hệ QC

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,208
Nghề nghiệp
Dạy đàn piano
Không biết nhiều gì về VBA, nên xin gửi vấn đề này lên đây, nhờ các anh chị và các bạn giúp dùm:

Tôi có một dữ liệu khá lớn về các mặt hàng, đại khái như vầy (nó là một Table có tên là DMHH, là Rowsource cho ComboBox Mã Hàng trong cái form ở hình 3):
000-80.gif

Hình 1


Đồng thời, tôi làm thêm một bảng các loại Nhóm Hàng và Hãng Sản Xuất, bên Sheet 2 như sau (làm RowSource cho Nhóm HàngNhà Sản Xuất ở cái form ở hình 3):
002-12.gif

Hình 2


Để tra cứu nhanh đơn giá, tôi mày mò làm được cái form sau:
001-18.gif

Hình 3


Chắc các bạn cũng biết, khi nhấn vào một cái ComboBox, nó sẽ liệt kê tất cả những gì mà chúng ta đã chỉ ở RowSource. Nhưng như vậy thì tìm lâu lắm (phải tuột lên tuột xuống cái thanh trượt để chọn), khi dữ liệu quá lớn.

Và đây là vấn đề cần hỏi: Ví dụ, các bạn thấy trong hình 1, nhóm hàng dây điện thì có CADIVIDAPHACO, và mỗi hãng sản xuất này có những mã hàng riêng cho mỗi loại dây điện.

Tôi muốn rằng:
  1. Khi chọn dây điện từ Combobox Nhóm Hàng, thì trong ComboBox Hãng Sản Xuất chỉ còn CADIVIDAPHACO mà thôi, chứ không phải là tất cả các hãng sản xuất như bình thường. Và khi đó, trong ComboBox Mã Hàng chỉ còn có 6 loại (như danh mục trong hình 1).

  2. Nếu chọn thêm CADIVI từ ComboBox Hãng Sản Xuất, thì trong Combobox Mã Hàng chỉ còn có những mã hàng nào của hãng CADIVI mà thôi (theo hình 1, nó là 3 mục: CV 14 CA, CV 16 CACV 22 CA).

Hai cái tôi muốn đây, giống y như ta dùng Advanced Filter để lọc (theo 2 điều kiện):
  • Để biết mã hàng thuộc về nhóm hàng nào, hoặc thuộc về nhà sản xuất nào, thì tra trong DMHH ở Sheet 1 (Hình 1).
  • Một Nhóm Hàng có thể có nhiều Nhà Sản Xuất (ví dụ dây điện thì có Cadivi, Daphaco, ...), và một Nhà Sản Xuất cũng có thể sản xuất ra nhiều Nhóm Hàng (ví dụ, Cadivi, ngoài Dây Điện ra còn có thêm những Thiết Bị Điện khác như cầu dao, ổn áp...). Chỉ có Mã Hàng là duy nhất mà thôi.


Cái sự "muốn" này, có khả thi không ạ? Nếu có, rất mong được giúp đỡ. Xin nói thêm, dữ liệu của tôi rất lớn, ở trong hình (và trong file đính kèm) tôi chỉ mô phỏng một ít dữ liệu thôi.

Tôi gửi kèm đây cái bảng tính mà tôi đã chụp hình ở trên. Để gọi nhanh cái form, nhấn Ctrl+Shift+Z. Các bạn đừng quan tâm (và cũng xin đừng cười...) mấy cái TextBox ở bên phải của cái form, tôi mới làm tạm thôi. Chỉ nhờ các bạn xử lý dùm 3 cái ComboBox ở bên trái.

Xin cảm ơn trước.​

--------------------
File đính kèm xin lấy ở bài #7
 
Lần chỉnh sửa cuối:
File của Ca_dafi thì chuyên nghiệp rồi, hi hi
Anh tham khảo cho vui, em lấy nguyên gốc File của anh, chỉnh sửa đôi chút.
Tham gia cho vui, nếu thấy "được" thì chỉnh sửa lại cho "chuyên nghiệp" vậy, hi hi


TDN
 

File đính kèm

Upvote 0
Bài của bác ThuNghi có mấy nhược điểm sau:

1. Mỗi khi đổi Nhóm Hàng, Excel phải mất gần 20-25 giây thì mới lấy ra được Nhà Sản Xuất
2. Chưa truy ngược được, nghĩa là chọn Nhà Sản Xuất trước, thì Nhóm Hàng cập nhật theo (em có nói rõ lại yêu cầu ở bài #7)

Mong bác hoàn thiện hơn. Nhưng dù sao cũng cảm ơn cái đã.
Đã sửa file lại. Dùng AdFi thì nhanh hơn.
Còn phần 2 thì thua. Chắc phải làm 2 form.
 

File đính kèm

Upvote 0
Ca_Dafi ơi, vừa chợt nhớ ra cái này.
Không thể để cái ListBox ở đó được... Hoặc là phải có cách nào đó ẩn nó đi...
Bởi vì có thể anh sẽ xem bảng giá này trước mặt khách hàng, không thể cho người ta biết "mình lời bao nhiêu" được (!!!)..
Anh biết cách làm một cái Option, Check vào thì nó cho xem giá gốc, còn mặc định là chỉ thấy giá bán.
Ý anh là nếu bỏ cái ListBox đi, thì có ảnh hưởng gì đến cái form của em không ?

Chuyện double-click vào ô đó, anh hiểu rồi, nhưng nếu dùng cái ComboBox thì vẫn khoái hơn tí, vì thao tác có thể là ít hơn... Nghiên cứu dùm anh nha...

Nếu không được 100% thì ít ra cũng 90% anh nhỉ! Anh xem file đính kèm nhé! (Tối nay không biết cafe hay lẩu rắn đây)

Còn vấn đề file excel báo lỗi vừa rồi trên máy anh, em bó tay rồi, tìm trong thư viện thì thấy, sao xài không được ta?
 

File đính kèm

Upvote 0
Có lẽ cái yêu cầu truy ngược từ nhà sản xuất ra nhóm hàng không khả thi rồi.. Nên thôi, tạm bỏ nó qua một bên đi.

Xin phép nói đôi lời. Trước hết là cảm ơn tất cả thịnh tình của các bạn. Và tôi có vài nhận xét nho nhỏ như sau:

Đáp án của Ca_Dafi chạy nhanh nhất, nhưng không lọc được danh sách nhà cung cấp theo nhóm hàng. Sở dĩ, tôi muốn có điều kiện này, bởi vì đôi khi tôi không thể nhớ được nhóm hàng này do ai sản xuất, nên nếu như hạn chế được tên nhà sản xuất theo nhóm hàng, thì đỡ lắm!!

Đáp án của bác ThuNghiTedaynui thì nói chung là giống nhau, nhưng cái của bác ThuNghi, khi đổi tên nhóm hàng, thì chỗ nhà sản xuất không tự cập nhật, và khi chạy thì có hơi chậm một tí so với cái của Tedaynui.

Tuy nhiên, đó chỉ mới là nhận định ban đầu. Tôi sẽ cho nó vào trong dữ liệu thật với chừng 13.000 mặt hàng (tương đương 13.000 dòng), xem cả 3 đáp ạn chạy như thế nào, và sẽ thông báo kết quả ngay.
Nếu chiều nay mà gặp nhau được, xin hậu tạ.........


P/S: Ca_dafi ơi, cái bản sau này, chạy ngon lành, không báo lỗi nữa mặc dù vẫn có cái format... Không hiểu được tại sao hồi nãy thì báo lỗi...
 
Upvote 0
Có lẽ cái yêu cầu truy ngược từ nhà sản xuất ra nhóm hàng không khả thi rồi.. Nên thôi, tạm bỏ nó qua một bên đi.
Tuy nhiên, đó chỉ mới là nhận định ban đầu. Tôi sẽ cho nó vào trong dữ liệu thật với chừng 13.000 mặt hàng (tương đương 13.000 dòng), xem cả 3 đáp ạn chạy như thế nào, và sẽ thông báo kết quả ngay.
Nếu chiều nay mà gặp nhau được, xin hậu tạ.........
Anh có thêm bao nhiêu mặt hàng thì cũng không ảnh hưởng là bao. Vì em dùng Advance Filter mà

File của Ca_dafi khi nhập vào các Textbox thì có vẻ chậm đấy và việc trích lọc danh sách mang tính độc lập của từng Textbox hoặc Combobox khi Textbox_Change hoặc Combobox_Change. Chỗ này khác với Advance Filter (Filter được nhiều Field -> danh mục hàng hoá sẽ gọn hơn), hi hi

TDN
 
Upvote 0
Có lẽ cái yêu cầu truy ngược từ nhà sản xuất ra nhóm hàng không khả thi rồi..
Khả thi chứ anh BNTT, cách làm y như cách lọc mã hàng theo Nhóm Hàng, mã Hàng theo HangSX---> Bây giờ là lọc Nhóm hàng theo HangSX hoặc lọc HangSX theo nhóm hàng. Cái này không khó! Bên sheet DMkhác, anh có thể nối lại hai danh mục (Hãng SX và Nhóm hàng) làm một không? Nghĩa là:
Tên hãng SX|Nhóm Hàng
.......|........
.......|........
.......|........
.......|........

P/S: Ca_dafi ơi, cái bản sau này, chạy ngon lành, không báo lỗi nữa mặc dù vẫn có cái format... Không hiểu được tại sao hồi nãy thì báo lỗi...
Em cũng bó tay luôn!
 
Upvote 0
Khả thi chứ anh BNTT, cách làm y như cách lọc mã hàng theo Nhóm Hàng, mã Hàng theo HangSX---> Bây giờ là lọc Nhóm hàng theo HangSX hoặc lọc HangSX theo nhóm hàng. Cái này không khó! Bên sheet DMkhác, anh có thể nối lại hai danh mục (Hãng SX và Nhóm hàng) làm một không? Nghĩa là:
Tên hãng SX|Nhóm Hàng
.......|........
.......|........
.......|........
.......|........
Được chứ sao không. Cách ra một cột là để cho dễ xem mà thôi. Cho chúng nó nằm gần nhau chẳng có sao cả.

Nhưng nhớ coi lại dùm anh hai cái ComboBox chọn Nhóm Hàng và Nhà SX, trong đó chỉ là List, chứ chẳng lọc gì cả.
Ví dụ, bên Nhóm hàng anh chọn Van nước, xong bên NSX anh chọn Sino, thì mã hàng ở ListBox lọc theo Sino, mà Sino thì chẳng liên quan gì đến Van nước cả, Sino thuộc nhóm Thiết Bị Điện mà... Em xem lại tí nhá.
 
Upvote 0
Anh có thêm bao nhiêu mặt hàng thì cũng không ảnh hưởng là bao. Vì em dùng Advance Filter mà

TDN
Tedaynui ơi, cách của Tedaynui thì nhanh đấy, nhưng hình như nó không thể nhân diện lại cái Name động.
Ví dụ, lần 1, sau khi lọc, thì Name động Mahang có 6 mặt hàng.
Nếu cứ để yên đó mà lọc tiếp nhóm hàng khác, nhà sản xuất khác, thì MaHang vẫn chỉ là 6 mặt hàng. Có nghĩa là hình như cái RowSource của Mã Hàng không được cập nhật địa chỉ động mới, và do đó nó không liệt kê được đầy đủ các mặt hàng.
Tedaynui xem lại dùm nhá.
 
Lần chỉnh sửa cuối:
Upvote 0
@Bác ThuNghi
Em mới test cái đáp án của bác, cũng bị giống trường hợp của Tedaynui, nghĩa là sau vài lần test cái Combobox chọn Nhóm Hàng, thì ở Mã Hàng liệt kê không đầy đủ các mặt hàng nữa.

Và thêm nữa: ở cái Nhà Sản Xuất thì sao lại thế này: đúng là nó lọc ra những NSX nào thuộc nhóm hàng đã chọn, nhưng mỗi NSX thì chỉ xuất hiện một lần thôi chứ, còn của bác thì bị trùng nhau nhiều quá (ví dụ khi chọn Thiết Bị Điện):
000-87.gif
Bác xem lại dùm em tí nhá.
 
Lần chỉnh sửa cuối:
Upvote 0
Tedaynui ơi, cách của Tedaynui thì nhanh đấy, nhưng hình như nó không thể nhân diện lại cái Name động.
Ví dụ, lần 1, sau khi lọc, thì Name động Mahang có 6 mặt hàng.
Nếu cứ để yên đó mà lọc tiếp nhóm hàng khác, nhà sản xuất khác, thì MaHang vẫn chỉ là 6 mặt hàng. Có nghĩa là cái RowSource của Mã Hàng không được cập nhật địa chỉ động mới.
vậy anh thêm vào Sub Filter dòng sau để cho nó ReFresh lại
Mã:
Sub Filter()
On Error Resume Next
    Range("MyRng").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("DieuKien"), _
                CopyToRange:=Range("O:Y")
[COLOR=Navy][I][B]     MaHang.RowSource = Range("MaHang")[COLOR=Red].Address[/COLOR][/B][/I][/COLOR]
End Sub
TDN
 
Lần chỉnh sửa cuối:
Upvote 0
vậy anh thêm vào Sub Filter dòng sau để cho nó ReFresh lại
Mã:
Sub Filter()
On Error Resume Next
    Range("MyRng").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("DieuKien"), _
                CopyToRange:=Range("O:Y")
[COLOR=Navy][I][B]    [COLOR="Red"]HangSX.RowSource = Range("MaHang")[/COLOR][/B][/I][/COLOR]
End Sub
TDN
Hình như phải là MaHang.RowSource = Range("MaHang") chứ?
RowSource của Mã Hàng mà?

--------------------------------
Không ăn thua, Tedaynui ơi. Nó vẫn không cập nhật.
Bạn còn cái file ở đó không. Thử xem nha.
Chọn Nhóm hàng là Dây điện, chọn tiếp CADIVI, ở Mã hàng có 3 mục, OK.
Chọn tiếp Nhóm hàng là Gạch men, trong NSX là AmericanHome và Rex (OK), chọn tiếp AmricanHome... ở Mã hàng chỉ liệt kê có 4 mã à, trong khi gạch AmericanHome thì quá trời luôn?

Nói thêm, chuyện này, không phải là lúc nào cũng không được... Nhưng có lúc thì Mã hàng liệt kê đủ, có lúc Mã hàng liệt kê dư (nghĩa là chỉ có 4 mã nhưng nó vẫn có cái Vertical Scrollbar), và có lúc thì liệt kê thiếu...
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã tìm ra lỗi :
MaHang.RowSource = Range("MaHang").Address

Anh tải lại File ở bài 22# xem. Em đã Up lại. Em test thấy OK

TDN
 
Upvote 0
File của Ca_dafi thì chuyên nghiệp rồi, hi hi
Anh tham khảo cho vui, em lấy nguyên gốc File của anh, chỉnh sửa đôi chút.
Tham gia cho vui, nếu thấy "được" thì chỉnh sửa lại cho "chuyên nghiệp" vậy, hi hi


TDN
Tôi thấy việc này sẽ rất đơn giản khi tổ chức dữ liệu cho khoa học hơn. Ví dụ:
1/dùng 1sh đẻ lưu nhà sản xuất gồm NSX(maNx, tenNsx)
2/1 sh lưu nhóm hàng: Nhomhang(maNhomhg, tenNhomhg)
3/1 sh lưu chi tiết Mathg(manx,maNhomhg,maHg, soluong, dongia)
4/1 sh lưu chi tiết nhập xuất chăng hạn....
khi đó trên form ta sẽ dùng các điều khiển combo hay listbox, listview là tùy va khi lọc dữ liệu có thê dùng SQL hay là for ... để lọc,
Tôi mạo muội nêu vấn đè các bạn xem nếu được thì triển khai theo hướng này để anh em cùng học hỏi.
Thân
 
Upvote 0
Các bác kiểm tra giúp xem, nguyên nhân sai ở đâu mà khi chọn List lại thì báo lỗi. cách khắc phục?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
File của Ca_dafi thì chuyên nghiệp rồi, hi hi
Anh tham khảo cho vui, em lấy nguyên gốc File của anh, chỉnh sửa đôi chút.
Tham gia cho vui, nếu thấy "được" thì chỉnh sửa lại cho "chuyên nghiệp" vậy, hi hi


TDN

Tôi thêm vào form của tedaynui 1 cái nút nữa, mọi người xem thử nha!

MTBT
 

File đính kèm

Upvote 0
@Bác ThuNghi
Em mới test cái đáp án của bác, cũng bị giống trường hợp của Tedaynui, nghĩa là sau vài lần test cái Combobox chọn Nhóm Hàng, thì ở Mã Hàng liệt kê không đầy đủ các mặt hàng nữa.

Và thêm nữa: ở cái Nhà Sản Xuất thì sao lại thế này: đúng là nó lọc ra những NSX nào thuộc nhóm hàng đã chọn, nhưng mỗi NSX thì chỉ xuất hiện một lần thôi chứ, còn của bác thì bị trùng nhau nhiều quá (ví dụ khi chọn Thiết Bị Điện):
000-87.gif
Bác xem lại dùm em tí nhá.

BTTT nhấn Ctrl+Shìtt+O để mở form
 

File đính kèm

Upvote 0
Trong khi đang làm việc với Form mà người dùng "nhỡ tay" click vào sheet DATA (để xem cái gì đó chẳng hạn) rồi lại chọn một hành động ở Form thì ...

-hvl-
 
Upvote 0
Vậy phải đặt thuộc tính ShowModal = False cho Form. Thuộc tính nẳm ở khung Properties UserForm đó. Bác kéo thanh trược xuống sẽ thấy ShowModal = True chỉnh là False là có thể làm được như bác. Chúc vui. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong khi đang làm việc với Form mà người dùng "nhỡ tay" click vào sheet DATA (để xem cái gì đó chẳng hạn) rồi lại chọn một hành động ở Form thì ...

-hvl-
Vì chỉnh form của BNTT đã chọn ShowModal=False nên mới cho thao tác trên sheet. Đã chỉnh lại ShowModal=True.
Thank hoangvuluan đã phát hiện.
To BNTT:
- Anh thiết kế lần đầu tiên viết VBA lọc dữ liệu bằng Advanced Filter, thấy chạy cũng nhanh. Em dùng thử cho ý kiến.
- Khi mở form, sẽ chọn nhóm hàng thứ 1, cửa hàng thứ 1, mã hàng thứ 1. Các dữ liệu mã hàng sẽ thể hiện trên sheet Nhom. Sheet này sẽ mất khi tắt form.
- Khi chọn mã hàng khác , con trỏ sẽ nhảy đến dòng mã hàng đang chọn trên sheet Nhom. Dễ tìm các thông tin mã hàng khác.
bntt.jpg

- Nếu các mục mô tả, đơn vị tính, giá bán, ... chỉ xem, không yêu cầu chỉnh sửa thì em chuyển các TextBox đó sang Lable, người dùng không chỉnh sửa được.
 
Upvote 0
Web KT

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

Back
Top Bottom