Xin chào mọi người
Mình đang có vấn đề này đã search google nhiều nhưng chưa thấy, nhờ mọi người giúp đỡ
Mình muốn tạo 1 combobox có nhiều lớp tương tự như hình đính kèm
trong Form VBA của Excel
VD :
- Khi bấm vào combobox thì sổ ra list 2 Group : Plastic, Rubbe,...
- Khi đặt con trỏ vào Plastic thì sổ tiếp ra list các Nguyên vật liệu thuộc nhóm Plastic
- Giá trị của combobox sẽ là giá trị chọn trong list nguyên vật liệu
Cảm ơn rất nhiều !
Tôi hỏi hơi vô duyên một tí. Theo tôi hiểu thì bạn thao tác trên FORM (chỗ
đỏ đỏ) mà trong link bạn
Nghĩa đưa tôi đọc thấy (không xem code): Đoạn code dưới đây là một
Menu tắt khi bạn Click phải chuột lên Tab của Sheet
Thế thì chúng có liên quan gì với nhau nhỉ?
-----------------
Có nhất thiết là ComboBox không? Tôi đề nghị thế này:
1. Ta dùng API tạo drop-down menu gồm 2 mục là Plastic và Rubbe
2. Mỗi mục menu ở trên sẽ mở ra 1 số mục menu con (list của bạn)
3. Nếu người dùng chọn 1 mục menu con nào đó thì caption của menu được hiển thị trong Textbox
4. Khi Textbox nhận focus - chọn bằng chuột hoặc di chuyền focus tới textbox bằng TAB - thì hiển thị drop-down menu nói trên ở ngay dưới Textbox.
5. Tổng quát ta sẽ tạo drop-down menu có n mục (n >= 2) mà một số trong các mục đó hoặc tất cả sẽ mở một list mới mà một số mục trong các list đó lại mở những list con v...v Tức số lớp (level) không phải chỉ là 2 mà có thể là bất kỳ.
--------------
Việc tạo menu bằng API không có gì là khó. Nhưng ta phải biết được cấu trúc của menu thì mới tạo ra nó được. Lớp 1 có những mục nào? Những mục nào trong lớp 1 sẽ mở những menu con thuộc lớp 2? Tổng quát thì nếu ta đã có lớp k (k >= 1) thì những mục nào của lớp k sẽ mở những menu con thuộc lớp (k + 1)?
Có một điều chắc chắn là mỗi mục menu là "con" của menu nào đó (các mục menu ở lớp 1 sẽ là con của menu được code tạo ra). Vậy ta "gán" cho mỗi mục một con số gọi là ParentID (ID của "bố" - số nhận dạng của "bố") là ID (đọc tiếp) của ông "bố". Thế bằng cách nào phân biệt là mục sẽ mở các mục con hoặc là mục "vô sinh"? Ta sẽ gán cho mục sẽ mở các mục con một con số gọi là ID (số nhận dạng của mục). Ngoài ra để cho code đơn giản thì ta sẽ:
1. Các mục ở lớp 1 ta sẽ gán cho ParentID = 0. Code sẽ tạo ra menu và cho nó là "bố" của những mục có ParentID = 0, tức các mục ở lớp 1
2. Các mục nào sẽ mở các mục con thì ta gán cho ID là những con số khác nhau từng đôi một, vd. 1, 2, 3, ...
3. Ta nhập Caption, ID, Parent ID lần lượt vào các cột A, B, C.
Nếu ta có vd. ở A, B, C = "Ra tệp văn bản", <để trống>, 2 thì có nghĩa là mục "Ra tệp văn bản" sẽ là con của mục có ID = 2 (ParentID = 2 tức "bố" của nó có ID = 2)
Nếu ta có vd. ở A, B, C = "Nhập dữ liệu", 5, 1 thì có nghĩa là mục "Nhập dữ liệu" sẽ là con của mục có ID = 1. Và đó là mục sẽ mở các mục con mà các mục con đó sẽ có ParentID = 5 ("bố" của chúng có ID = 5)
4. Các mục ta liệt kê như sau. Trước tiên ta liệt kê các mục ở lớp 1 và chúng có ParentID = 0. Mục nào sẽ mở các mục con thì ta gán cho một con số (1, 2, 3, ...) còn nếu không thì để trống. Tiếp theo ta liệt kê các mục ở lớp 2. Giả sử ở lớp k (k >= 1) các mục kn1, kn2, ..., knr sẽ mở các mục con thì ở lớp (k + 1) ta liết kê trước tiên tất cả các mục con của mục kn1, tiếp theo tất cả các mục con của mục kn2, ..., tất cả các mục con của mục knr. Nói tóm tắt thì ta cứ "đi từ trên xuống"
Trong ví dụ tôi có liệt kê tất cả các mục. Sau khi hiện menu thì bạn có thể đối chiếu với thứ tự của các mục được liệt kê trên Sheet1 để hiểu thêm về cách liệt kê.
---------------
Tất nhiên ta có thể thêm vào cột D tên các Macro mà khi chọn menu thì chúng sẽ được thực hiện. Lúc đó thay vì đọc Caption ở cột A của mục được chọn và nhập vào TextBox thì ta sẽ đọc tên Macro ở cột D rồi dùng Application. Run để thực thi Macro đó. Việc cải tiến này có thể thực hiện bằng cách thêm một đoạn code ngắn.