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:
Đệ tử xem file mẫu này nha, dùng name động. Khi có name thì gán cho validation cũng được, cho combobox của form cũng được.
File này của sư huynh Ptm, sư nương biết rằng đệ tử đang tối mắt tối mũi nên search giùm. Có gì thì hỏi thêm huynh ấy, Sư nương không biết cách làm.
 

File đính kèm

Upvote 0
Đệ tử xem file mẫu này nha, dùng name động. Khi có name thì gán cho validation cũng được, cho combobox của form cũng được.
File này của sư huynh Ptm, sư nương biết rằng đệ tử đang tối mắt tối mũi nên search giùm. Có gì thì hỏi thêm huynh ấy, Sư nương không biết cách làm.
Mới xem file đính kèm của sư nương xong. Phải nói là ngồi cả buổi mới hiểu.
Nhưng mà, sư nương ơi, nếu làm theo cách đó, thì em phải sắp xếp lại dữ liệu à? Nghĩa là phải tự mà lọc ra, NSX nào đi theo nhóm hàng nào, rồi Mã hàng nào đi theo NSX nào?... Có mà chết!
Với lại, cái kiểu đó hình như chỉ có thể làm cho quan hệ 1 đối nhiều thôi (em quên mất cái chữ tiếng Anh rồi, hình như là Relationship...), còn cái em cần là Nhiều đối Nhiều (một Nhóm hàng có quan hệ với nhiều NSX, nhưng một NSX cũng có quan hệ với nhiều Nhóm hàng), nên chắc là không xài được rồi.
Nhờ sư nương nói giúp với lão Ptm có cách nào khác không ạ...
 
Upvote 0
Như vậy mục đích chính là lọc danh mục mã hàng theo nhiều tiêu chí! Đúng vậy không anh? Em có thể làm lại (thiết kế lại) cái form của anh cho trực quan hơn không? Hay bắt buộc phải làm theo form của anh.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Với lại, cái kiểu đó hình như chỉ có thể làm cho quan hệ 1 đối nhiều thôi (em quên mất cái chữ tiếng Anh rồi, hình như là Relationship...), còn cái em cần là Nhiều đối Nhiều (một Nhóm hàng có quan hệ với nhiều NSX, nhưng một NSX cũng có quan hệ với nhiều Nhóm hàng), nên chắc là không xài được rồi.
Sư nương không biết cách làm, nhưng xem file thì có những nhóm trùng đó chứ. Vấn đề là chuẩn bị dữ liệu:
- nhà SX + nhòm hàng
- nhóm hàng + mặt hàng
- mặt hàng + đơn giá
dám cá là tiểu đệ cadafi cũng sẽ làm vậy.
 
Upvote 0
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):
Đồ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):
Để tra cứu nhanh đơn giá, tôi mày mò làm được cái form sau:
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 này sao không dùng Find nhỉ, find theo công thức, bài của OkeBab, nếu nhớ không lầm trong này cũng có file của Thầy Long, làm =VBA, còn không thì dùng ListView của Lê Văn Duyệt. Tựu trung cũng dùng find để tạo ra cái danh mục cần.
Để mình kiếm lại rồi up lại.
Kiếm không ra, chắc làm lại nhanh hơn.
 
Upvote 0
Như vậy mục đích chính là lọc danh mục mã hàng theo nhiều tiêu chí! Đúng vậy không anh? Em có thể làm lại (thiết kế lại) cái form của anh cho trực quan hơn không? Hay bắt buộc phải làm theo form của anh.
Cảm ơn Ca_Dafi. Thiết kế tùy ý. Đã nói là anh mày mò làm VBA mà. Hễ cái nào hay là xài à.

--------------------------------------------------------------

Sẵn đây xin nói rõ hơn về hai cái combobox Nhóm Hàng và Nhà Sản Xuất. Nhờ giúp dùm, cho cả hai cái đều lệ thuộc lẫn nhau, nhưng có thể chọn cái nào trước cũng được.

Tôi xin gửi lại file đính kèm, vì trong file đã gửi, không có trường hợp nào mà một nhà sản xuất có 2 nhóm hàng. Đây là Sheet 2 của file mới:
000-81.gif

Tôi cũng đã bổ sung bên Sheet1. Nếu dùng AutoFilter cho DMHH, sẽ có những trường hợp sau (các bạn xem trực tiếp trong file đính kèm thì dễ hơn):
  • Chọn Nhóm Hàng trước, ví dụ, Dây điện chẳng hạn, thì trong NSX chỉ còn có CADIVI DAPHACO
  • Chọn NSX trước, ví dụ, chọn Blanco, thì trong Nhóm hàng chỉ còn có Bồn rửa chénThiết Bị Vệ Sinh / Nhà bếp
Và khi đó, trong Mã Hàng, chỉ còn những mã nào thỏa mãn 2 điều kiện trên.

Bây giờ, tôi muốn áp dụng cách thức y như vậy, cho hai cái ComboBox Nhóm HàngNhà Sản Xuất, và cái Combobox Mã Hàng thì chỉ liệt kê ra những mã hàng nào thỏa mãn 2 cái combobox đó.

Có thể, các bạn sẽ thắc mắc tại sao tôi không dùng AutoFilter để lọc? Xin thưa, theo tôi nghĩ, dùng Form, thiết kế thì lâu, nhưng truy xuất thì nhanh hơn AutoFilter nhiều, nhất là khi phải tra liên tục mã hàng này đến mã hàng khác.​
 

File đính kèm

Upvote 0
Anh xem file đính kèm nhé! Vẫn là Ctrl+Shift+Z. Để ý các textbox phía trên ListBox nhé! Chỉ chuột vào đó để xem Control TipText nhé!
 

File đính kèm

Upvote 0
Ca_Dafi ơi, cái này nghĩa là sao:
000-82.gif
 
Upvote 0
Cái vụ form này tôi không rành mấy, dùng thủ Find để tạo ra danh mục như yêu cầu.
Khi chọn nhóm hàng => Nhà SX và mã hàng tương ứng. Tường xem file.
PHP:
Sub TaoDMNhSx()
Application.ScreenUpdating = False
Dim eRow As Long, SoLan As Long, iL As Long, iNhSx As Long, iMaVT As Long, iC As Long
Dim MyRng As Range, RngFound As Range, iNhHg As String
iNhHg = Sheets("Chon").Cells(2, 1)
iNhSx = 0
iMaVT = 2
With Sheets("Chon")
    .Range(.Cells(2, 2), .Cells(1000, 12)).ClearContents
End With
With Sheets("Data")
    eRow = .Cells(20000, 1).End(xlUp).Row
    .AutoFilterMode = False
    Set MyRng = .Range(.Cells(1, 2), .Cells(eRow, 2))
    SoLan = WorksheetFunction.CountIf(MyRng, iNhHg)
    Set RngFound = .Cells(1, 2)
        For iL = 1 To SoLan
            With MyRng
               Set RngFound = .Find(iNhHg, After:=RngFound, SearchOrder:=xlRows, LookIn:=xlFormulas, LookAt:=xlWhole)
                    With RngFound
                        Sheets("Chon").Cells(iMaVT, 4) = .Offset(, -1).Value
                        For iC = 1 To 8
                            Sheets("Chon").Cells(iMaVT, 4 + iC) = .Offset(, 1 + iC).Value
                        Next iC
                        iMaVT = iMaVT + 1
                        If .Offset(, 1).Value <> .Offset(-1, 1).Value Then
                            iNhSx = iNhSx + 1
                            Sheets("Chon").Cells(iNhSx + 1, 2) = .Offset(, 1).Value
                            
                        End If
                    End With
            End With
        Next iL
        Sheets("Chon").Range(Cells(2, 2), Cells(iNhSx + 1, 2)).Name = "MaNhsx"
        Sheets("Chon").Range(Cells(2, 4), Cells(iMaVT - 1, 12)).Name = "DMhh"
        'Sheets("Chon").Range(Cells(2, 4), Cells(iMaVT - 1, 4)).Name = "DMHH"
    End With
Set MyRng = Nothing
Set RngFound = Nothing
Application.ScreenUpdating = True
End Sub
Điều chỉnh lại mấy cột của DMHH nhé!


Xin lỗi, code này phải tách thêm một lần nữa, ie khi chọn Nhà SX nào thì chỉ lấy nhưng MaHH theo Nhà SX. Tường dùng Ad Fi tách ra khi MaNhSX update.
 

File đính kèm

Upvote 0
Ca_Dafi ơi, cái này nghĩa là sao:
000-82.gif

Máy anh thiếu thư viện thì phải! Anh bỏ luôn cái đoạn format đó đi cũng được. Em chỉ format để số nhìn cho dễ thôi.

Sub đó có thể sửa lại như sau:
PHP:
Private Sub ListDMHH_Click()
    If Not IsNull(Me.ListDMHH) Then
        Me.txtMaHang = Me.ListDMHH
        Me.txtTenHang = Me.ListDMHH.Column(3)
        Me.txtDVT = Me.ListDMHH.Column(4)
        Me.txtMoTa = Me.ListDMHH.Column(10)
        Me.txtGiaGoc1 = Me.ListDMHH.Column(5)
        Me.txtGiaGoc2 = Me.ListDMHH.Column(6)
        Me.txtGiaBan1 = Me.ListDMHH.Column(7)
        Me.txtGiaBan2 = Me.ListDMHH.Column(8)
    Else
        Exit Sub
    End If
End Sub
 
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 đã.

----------------------------------------------

Ca_Dafi đã viết:
Máy anh thiếu thư viện thì phải! Anh bỏ luôn cái đoạn format đó đi cũng được. Em chỉ format để số nhìn cho dễ thôi.
Có thể khắc phục được chuyện thiếu thư viện không ?
 
Upvote 0
To Ca_Dafi: Anh chưa tìm được cái thư viện thiếu...
Nhưng cái này:
000-83.gif
Nó giống như là cái Sheet 1 thu gọn lại, ở dưới là cái kính lúp phóng cho to lên, chứ có gì khác đâu?
Mấy cái combobox để chọn đâu mất hết rồi?
 
Upvote 0
Có thể khắc phục được chuyện thiếu thư viện không ?
Trong cửa sổ VBA anh chọn Tools/References Xem nó có báo lỗi thiếu cái nào không? thường thì nếu anh cài excel full và office tools full thì ít thấy xảy ra trường hợp thiếu thư viện. Em cũng không rành mấy vụ này lắm đâu.
 
Upvote 0
BNTT không biết xài đồ ngoại rồi. cứ gõ vài ký tự vào 4 cái text box trên cùng, rồi enter xem, cái "sheet1" ở dưới nó sẽ ngắn lại dần dần.
 
Upvote 0
BNTT không biết xài đồ ngoại rồi. cứ gõ vài ký tự vào 4 cái text box trên cùng, rồi enter xem, cái "sheet1" ở dưới nó sẽ ngắn lại dần dần.
Dạ thưa... lão tiền bối, em vừa thử đây, nó nhảy ra cái ni:
000-84.gif
(Giống cái hồi nãy, nhưng ở chỗ khác)
Trình độ VBA bèo quá, mong lão tiền bối thông cảm, chỉ vẽ tận tình dùm...
 
Lần chỉnh sửa cuối:
Upvote 0
To Ca_DafiNó giống như là cái Sheet 1 thu gọn lại, ở dưới là cái kính lúp phóng cho to lên, chứ có gì khác đâu?
Mấy cái combobox để chọn đâu mất hết rồi?
Đây là một cách khác trực quan hơn để lọc theo nhiều yếu tố mà anh (như đã nói ở bài đầu) không cần combobox gì cả! Lọc theo tiêu chí nào thì anh gõ vài chữ cần lọc vào ô Textbox phí trên tiêu đề của LIstBox ấy!
(Ý anh là dùng chuột chơi thôi, không cần rờ đến bàn phím, vì đang đứng bán hàng, coi giá, nếu chỉ cần con chuột thì tốt lắm thay)...
Em biết thế nào anh cũng hỏi cái này nên em đã làm Riêng cái Nhóm Hàng và Hãng SX cho anh đấy, trong textbox đó anh có thể dùng chuột double click để chọn.

1225005585.png


1225012820.png
 
Lần chỉnh sửa cuối:
Upvote 0
@Ca_Dafi: Trong cái Tools/References mà em nói, nó liệt kê ra cả mớ, chỉ có chọn hay không chọn thôi, chứ đâu biết cái nào thiếu:
000-85.gif

Em có thể thay 4 cái Textbox trên cùng bằng 4 cái ComboBox không ?
(Ý anh là dùng chuột chơi thôi, không cần rờ đến bàn phím, vì đang đứng bán hàng, coi giá, nếu chỉ cần con chuột thì tốt lắm thay)...
 
Lần chỉnh sửa cuối:
Upvote 0
Từ cửa sổ soạn thảo VBA anh ấn F2 và gõ giống như trong hình xem có thấy format nằm trong phần "Members of Strings" hay không?
1225011749.png
 
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...
 
Upvote 0
Web KT

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

Back
Top Bottom