Thay đổi list của combo box

Liên hệ QC

lifeiswow

Thành viên mới
Tham gia
19/7/07
Bài viết
12
Được thích
1
Chào các bạn,
Mình muốn làm 2 combo box như file đính kèm

1. Combo box 1 gồm các item A, B, C
2. Combo box 2 là các option cho từng loại item, loại option và số lượng option của combo box 2 là phụ thuộc vào việc chọn item A, B, C

Nhưng mình không biết làm và cũng không tìm thấy topic nào giống vậy.

Các bạn giúp mình làm combo box 2 (option) với nhé. Cảm ơn các bạn nhiều.
 

File đính kèm

Chào các bạn,
Mình muốn làm 2 combo box như file đính kèm

1. Combo box 1 gồm các item A, B, C
2. Combo box 2 là các option cho từng loại item, loại option và số lượng option của combo box 2 là phụ thuộc vào việc chọn item A, B, C

Nhưng mình không biết làm và cũng không tìm thấy topic nào giống vậy.

Các bạn giúp mình làm combo box 2 (option) với nhé. Cảm ơn các bạn nhiều.

sao ko tải được
"invalid menu handle"?
 
Xem thử vậy có xài được không?
Chính xác rồi bạn ơi!

Nhưng làm sao để được như vậy zậy? Chỉ cho mình với, mình không biết tạo cái LIST như bạn đã làm.
Với lại cho mình hỏi cái này nữa. Trong trường hợp các danh mục của mình không nằm theo cột đứng mà nằm theo dòng ngang thì có làm thành danh sách trong combo được không?

Cảm ơn các bạn nhiều.
 
Lần chỉnh sửa cuối:
1. Tạo LIST chính là Ctrl+F3 để đặt co nó cái Name động. Bạn căn cứ vào cái name đó mà nghiên cứu tiếp nhé

Name List hiện tại trên file tôi làm hơi dài:
Mã:
 =IF(MATCH(INDEX(Sheet1!$A$4:$A$6,MATCH(Sheet1!$H$3,Sheet1!$B$4:$B$6,0)),Sheet1!$C$3:$E$3,0)=1,OFFSET(Sheet1!$C$4,,,
COUNTA(Sheet1!$C$4:$C$8)),IF(MATCH(INDEX(Sheet1!$A$4:$A$6,MATCH(Sheet1!$H$3,Sheet1!$B$4:$B$6,0)),Sheet1!$C$3:$E$3,0)=2,
OFFSET(Sheet1!$D$4,,,COUNTA(Sheet1!$D$4:$D$8)),OFFSET(Sheet1!$E$4,,,COUNTA(Sheet1!$E$4:$E$8))))

Bạn có thể sửa thành như sau, ngắn hơn 1 tí.
Mã:
 =CHOOSE(MATCH(INDEX(Sheet1!$A$4:$A$6,MATCH(Sheet1!$H$3,Sheet1!$B$4:$B$6,0)),Sheet1!$C$3:$E$3,0),OFFSET(Sheet1!$C$4,,,COUNTA(Sheet1!$C$4:$C$8)),
OFFSET(Sheet1!$D$4,,,COUNTA(Sheet1!$D$4:$D$8)),OFFSET(Sheet1!$E$4,,,COUNTA(Sheet1!$E$4:$E$8)))
Nhìn mấy cây "Nem" hoa cả mắt. Mình chẳng bao giờ đụng tới "Nem" nên chẳng biết bao giờ mới làm được như vầy.
 
1. Tạo LIST chính là Ctrl+F3 để đặt co nó cái Name động. Bạn căn cứ vào cái name đó mà nghiên cứu tiếp nhé

Name List hiện tại trên file tôi làm hơi dài:
Mã:
 =IF(MATCH(INDEX(Sheet1!$A$4:$A$6,MATCH(Sheet1!$H$3,Sheet1!$B$4:$B$6,0)),Sheet1!$C$3:$E$3,0)=1,OFFSET(Sheet1!$C$4,,,
COUNTA(Sheet1!$C$4:$C$8)),IF(MATCH(INDEX(Sheet1!$A$4:$A$6,MATCH(Sheet1!$H$3,Sheet1!$B$4:$B$6,0)),Sheet1!$C$3:$E$3,0)=2,
OFFSET(Sheet1!$D$4,,,COUNTA(Sheet1!$D$4:$D$8)),OFFSET(Sheet1!$E$4,,,COUNTA(Sheet1!$E$4:$E$8))))

Bạn có thể sửa thành như sau, ngắn hơn 1 tí.
Mã:
 =CHOOSE(MATCH(INDEX(Sheet1!$A$4:$A$6,MATCH(Sheet1!$H$3,Sheet1!$B$4:$B$6,0)),Sheet1!$C$3:$E$3,0),OFFSET(Sheet1!$C$4,,,COUNTA(Sheet1!$C$4:$C$8)),
OFFSET(Sheet1!$D$4,,,COUNTA(Sheet1!$D$4:$D$8)),OFFSET(Sheet1!$E$4,,,COUNTA(Sheet1!$E$4:$E$8)))

2. Các danh mục nằm hàng ngang vẫn làm được, tương tự như cách trên. ví dụ thay vì chọn vùng làm list là Sheet1!$D$4:$D$8, thì bây giờ chọn theo hàng là Sheet1!$D$4:$G$4............Tùy theo cách bố trí bảng dữ liệu của bạn. vậy thôi.

Bạn tự nghiên cứu và làm nhé!

Thôi thì ta đơn giản hóa vấn đề như công thức này đi:
1> Đặt 2 name:
Mã:
Item =Sheet1!$A$4:$A$6
Mã:
Option =OFFSET(Sheet1!$C$4:$C$100,,Sheet1!$H$3-1,COUNTA(OFFSET(Sheet1!$C$4:$C$100,,Sheet1!$H$3-1)))
2> Gán name Item vào Input Range của ComboBox Item. Gán name Option vào Input Range của ComboBox Option
Xong
 
Cây "nem" này ngăn ngắn 1 chút này:

=OFFSET(Sheet1!$B$3,1,Sheet1!$H$3,COUNTA(OFFSET(Sheet1!$B$3,1,Sheet1!$H$3,10,1)),1)


P/s: Xem lại nó cũng giống của Ndu
 
Lần chỉnh sửa cuối:
Thôi thì ta đơn giản hóa vấn đề như công thức này đi:
1> Đặt 2 name:
Mã:
Item =Sheet1!$A$4:$A$6
Mã:
Option =OFFSET(Sheet1!$C$4:$C$100,,Sheet1!$H$3-1,COUNTA(OFFSET(Sheet1!$C$4:$C$100,,Sheet1!$H$3-1)))
2> Gán name Item vào Input Range của ComboBox Item. Gán name Option vào Input Range của ComboBox Option
Xong


Cây "nem" này ngăn ngắn 1 chút này:

=OFFSET(Sheet1!$B$3,1,Sheet1!$H$3,COUNTA(OFFSET(Sheet1!$B$3,1,Sheet1!$H$3,10,1)),1)


P/s: Xem lại nó cũng giống của Ndu


Cảm ơn các bạn, nó giúp mình rút ngắn code rất nhiều vì mình còn phải làm option 2 từ item và option này.

Nhưng trong file của mình có rất nhiều bảng giá trị khác nhau nên nó gặp trường hợp nếu có các giá trị khác ngoài cái bảng option nó cũng add vào option ví dụ như file đính kèm của mình. Các bạn giúp mình giới hạn vùng lấy lấy dữ của option với.
 

File đính kèm

Lần chỉnh sửa cuối:

Các bạn giúp mình giới hạn vùng lấy lấy dữ của option với.

Muốn giới hạn đến đâu thì chỉnh chỗ màu đỏ này
Mã:
=OFFSET($C$4:$C$[COLOR=#ff0000]100[/COLOR],,$H$3-1,COUNTA(OFFSET($C$4:$C$[COLOR=#ff0000]100[/COLOR],,$H$3-1)))
Chẳng hạn là sửa số 100 thành số 8 thử xem
 
Chắc xin làm phiền các bạn lần nữa +-+-+-+

Mình muốn tạo option2 từ item và option như trong file nhưng lại không biết cách lồng các câu lệnh vào.

Rất mong được các bạn giúp đỡ. Cảm ơn các bạn nhiều.
 

File đính kèm

Đặt Name Option2 như sau:

=CHOOSE(MATCH(Sheet1!$H$3,Sheet1!$C$4:$C$6,0),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$B$12:$E$12,0),OFFSET(Sheet1!$B$13,,,COUNTA(Sheet1!$B$13:$B$15)),OFFSET(Sheet1!$C$13,,,COUNTA(Sheet1!$C$13:$C$15)),OFFSET(Sheet1!$D$13,,,COUNTA(Sheet1!$D$13:$D$15)),OFFSET(Sheet1!$E$13,,,COUNTA(Sheet1!$E$13:$E$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$G$12:$H$12,0),OFFSET(Sheet1!$G$13,,,COUNTA(Sheet1!$G$13:$G$15)),OFFSET(Sheet1!$H$13,,,COUNTA(Sheet1!$H$13:$H$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$J$12:$L$12,0),OFFSET(Sheet1!$J$13,,,COUNTA(Sheet1!$J$13:$J$15)),OFFSET(Sheet1!$K$13,,,COUNTA(Sheet1!$K$13:$K$15)),OFFSET(Sheet1!$L$13,,,COUNTA(Sheet1!$L$13:$L$15))))

Mã:
=CHOOSE(MATCH(Sheet1!$H$3,Sheet1!$C$4:$C$6,0),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$B$12:$E$12,0),OFFSET(Sheet1!$B$13,,,COUNTA(Sheet1!$B$13:$B$15)),OFFSET(Sheet1!$C$13,,,COUNTA(Sheet1!$C$13:$C$15)),
OFFSET(Sheet1!$D$13,,,COUNTA(Sheet1!$D$13:$D$15)),OFFSET(Sheet1!$E$13,,,COUNTA(Sheet1!$E$13:$E$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$G$12:$H$12,0),OFFSET(Sheet1!$G$13,,,COUNTA(Sheet1!$G$13:$G$15)),
OFFSET(Sheet1!$H$13,,,COUNTA(Sheet1!$H$13:$H$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$J$12:$L$12,0),OFFSET(Sheet1!$J$13,,,COUNTA(Sheet1!$J$13:$J$15)),OFFSET(Sheet1!$K$13,,,COUNTA(Sheet1!$K$13:$K$15)),
OFFSET(Sheet1!$L$13,,,COUNTA(Sheet1!$L$13:$L$15))))

cái cây nem này nhìn đã quá hen . chắc ăn mấy ngày chưa hết
 
Nếu mệt mỏi thì kêu VBA hỗ trợ

Mã:
Sub SetList1()
Dim Rg As Range
Sheet1.[H6] = 0
Set Rg = Sheet1.[C4:E7].Columns(Sheet1.[H3]).SpecialCells(xlCellTypeConstants, 23)
ThisWorkbook.Names.Add "List1", Rg
Set Rg = Nothing
End Sub
'------------------------------
Sub SetList2()
Dim Rg1 As Range, Rg2 As Range
Set Rg1 = Union(Sheet1.[B13:E15], Sheet1.[G13:H15], Sheet1.[J13:L15])
Set Rg2 = Rg1.Areas(Sheet1.[H3]).Columns(Sheet1.[H6]).SpecialCells(xlCellTypeConstants, 23)
ThisWorkbook.Names.Add "List2", Rg2
Set Rg1 = Nothing: Set Rg2 = Nothing
End Sub
'--------------------------------
Sub DropDown3_Change()
SetList1
End Sub
'-------------------------------
Sub DropDown2_Change()
SetList2
End Sub
 

File đính kèm

Đặt Name Option2 như sau:

=CHOOSE($H$3,CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$B$12:$E$12,0),OFFSET(Sheet1!$B$13,,,COUNTA(Sheet1!$B$13:$B$15)),OFFSET(Sheet1!$C$13,,,COUNTA(Sheet1!$C$13:$C$15)),OFFSET(Sheet1!$D$13,,,COUNTA(Sheet1!$D$13:$D$15)),OFFSET(Sheet1!$E$13,,,COUNTA(Sheet1!$E$13:$E$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$G$12:$H$12,0),OFFSET(Sheet1!$G$13,,,COUNTA(Sheet1!$G$13:$G$15)),OFFSET(Sheet1!$H$13,,,COUNTA(Sheet1!$H$13:$H$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$J$12:$L$12,0),OFFSET(Sheet1!$J$13,,,COUNTA(Sheet1!$J$13:$J$15)),OFFSET(Sheet1!$K$13,,,COUNTA(Sheet1!$K$13:$K$15)),OFFSET(Sheet1!$L$13,,,COUNTA(Sheet1!$L$13:$L$15))))
Mã:
=CHOOSE($H$3,CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$B$12:$E$12,0),OFFSET(Sheet1!$B$13,,,COUNTA(Sheet1!$B$13:$B$15)),OFFSET(Sheet1!$C$13,,,COUNTA(Sheet1!$C$13:$C$15)),OFFSET(Sheet1!$D$13,,,COUNTA(Sheet1!$D$13:$D$15)),OFFSET(Sheet1!$E$13,,,COUNTA(Sheet1!$E$13:$E$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$G$12:$H$12,0),OFFSET(Sheet1!$G$13,,,COUNTA(Sheet1!$G$13:$G$15)),OFFSET(Sheet1!$H$13,,,COUNTA(Sheet1!$H$13:$H$15))),CHOOSE(MATCH(Sheet1!$H$6,Sheet1!$J$12:$L$12,0),OFFSET(Sheet1!$J$13,,,COUNTA(Sheet1!$J$13:$J$15)),OFFSET(Sheet1!$K$13,,,COUNTA(Sheet1!$K$13:$K$15)),OFFSET(Sheet1!$L$13,,,COUNTA(Sheet1!$L$13:$L$15))))

1/ Trong dữ liệu của mình có những option2 chỉ có 1 dòng thôi (như bảng B), mình nghĩ là chắc có thể rút ngắn code hơn nhưng mình làm chưa được, bạn giúp mình code cho trường hợp đó với.
2/ Và với dữ liệu như bảng C thì nên code làm sao cho đúng?

Cảm ơn bạn nhiều nhé.


P/s: đang nhức đầu vì code của mình quá dài, chạy ra không đúng mà không hiểu tại sao :(. Nhưng mình vẫn ưu tiên code excel hơn VB vì ít ra mình còn hiểu được đại khái và làm tương tự được.
 

File đính kèm

Chắc xin làm phiền các bạn lần nữa +-+-+-+

Mình muốn tạo option2 từ item và option như trong file nhưng lại không biết cách lồng các câu lệnh vào.

Rất mong được các bạn giúp đỡ. Cảm ơn các bạn nhiều.

Bạn dùng Name với công thức:
Mã:
=OFFSET($B$13,,MATCH(INDEX($C$3:$E$3,1,H3),$B$11:$L$11,0)+$H$6-2,COUNTA(OFFSET($B$13,,MATCH(INDEX($C$3:$E$3,1,H3),$B$11:$L$11,0)+$H$6-2,100)))
 
Để dễ quản lý bạn có thể khai báo 2 Name như sau

1/Cot=VLOOKUP(Sheet1!$H$3*10 + Sheet1!$H$6,{11,1;12,2;13,3;14,4;21,6;22,7;31,9;32,10;33,11},2,0)

2/List2=OFFSET(Sheet1!$A$13,,Cot,COUNTA(OFFSET(Sheet1!$A$13,,Cot,10,)),)

Khai bao nguồn Conbo 2 = List2
 
1/ Trong dữ liệu của mình có những option2 chỉ có 1 dòng thôi (như bảng B), mình nghĩ là chắc có thể rút ngắn code hơn nhưng mình làm chưa được, bạn giúp mình code cho trường hợp đó với.

==> Rút ngắn gì nữa. Trong công thức đã giói hạn vùng chọn rồi bởi hàm Offset & counta. có 1 dòng thì nó hiển thị 1 mã............chứ hiện tại nó hiển thị hơn 1 dòng hả.......(bảng B). p/s: tôi thấy nó vẫn chạy đúng có 1 dòng 1 mã....

2/ Và với dữ liệu như bảng C thì nên code làm sao cho đúng?

==> Bạn cũng rảnh thiệt. 1 dòng thì bạn phải để nó nằm ở hàng đầu tiên của bảng. Sao lại 2 dòng đầu bỏ trống. Rồi gõ W vào dòng 3 là sao? Đã giởi hạn ở Offset & counta rồi thì phải bắt buộc gõ liên tục sau tiêu đề......... Chứ không có kiểu nữa nạc nữa mỡ ấy được.

1/ Mình nói là file chính của mình bị lỗi, ko nói code của bạn trong cái ví dụ này. Do code (trong file chính) của mình quá dài hơn nữa trang A4 nên mình muốn rút ngắn nó hoặc đơn giản hơn tí, để dễ quản lý.
2/ mình phụ thuộc vào bảng dữ liệu của mình, chứ mình không hề muốn làm phức tạp vấn đề, nếu không code được theo bảng dữ liệu của mình thì mình buộc lòng phải sửa lại bảng dữ liệu, mà không biết chừng cũng khó khăn không kém.


Bạn dùng Name với công thức:
Mã:
=OFFSET($B$13,,MATCH(INDEX($C$3:$E$3,1,H3),$B$11:$L$11,0)+$H$6-2,COUNTA(OFFSET($B$13,,MATCH(INDEX($C$3:$E$3,1,H3),$B$11:$L$11,0)+$H$6-2,100)))

Để dễ quản lý bạn có thể khai báo 2 Name như sau

1/Cot=VLOOKUP(Sheet1!$H$3*10 + Sheet1!$H$6,{11,1;12,2;13,3;14,4;21,6;22,7;31,9;32,10;33,11},2,0)

2/List2=OFFSET(Sheet1!$A$13,,Cot,COUNTA(OFFSET(Sheet1!$A$13,,Cot,10,)),)

Khai bao nguồn Conbo 2 = List2

Mình cho vào file ComboList của mình thấy nó hiển thị không chính xác, mình có attached file theo như cách của từng bạn. Các bạn giúp mình kiểm tra với.

Cảm ơn tất cả các bạn rất nhiều.:hug:
 

File đính kèm

.....................................
Mình cho vào file ComboList của mình thấy nó hiển thị không chính xác, mình có attached file theo như cách của từng bạn. Các bạn giúp mình kiểm tra với.
Cảm ơn tất cả các bạn rất nhiều.:hug:

Bạn hãy sủa lại địa chỉ tuyệt đối cho H3 trong công thức của tôi.
Cứ cái nào có H3 thì chuyển thành $H$3.
 
Web KT

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

Back
Top Bottom