Hướng dẫn cách tạo Combobox trong Excel một cách nhanh chóng nhất
Làm thế nào để tạo Combobox có danh sách phụ thuộc nhau một cách nhanh chóng nhất. Hãy đọc bài viết dưới đây do eLib biên soạn để tìm cho mình được câu trả lời chính xác nhất nhé.
Mục lục nội dung
1. Tạo combobox tương ứng theo các danh sách
Ở đây chúng ta có 3 danh sách nên sẽ cần tạo 3 combobox có tên lần lượt là Combobox1, Combobox2, Combobox3
Chúng ta sẽ sắp xếp thứ tự các combobox lần lượt như sau:
Combobox2 sẽ lấy danh sách Nhóm
Combobox3 sẽ lấy danh sách Nhân viên
2. Phân cấp bậc các danh sách theo combobox
Để hình dung về cấp bậc các danh sách, chúng ta xét ví dụ sau:
Như vậy có sự phân cấp bậc các danh sách như sau: Bộ phận > Nhóm > Nhân viên
- Bộ phận là danh sách có cấp bậc lớn nhất, gọi là bậc 1
- Nhóm là danh sách có cấp bậc nhỏ hơn bộ phận, phụ thuộc vào nội dung của Bộ phận, gọi là bậc 2
- Nhân viên là danh sách có cấp bậc nhỏ nhất, phụ thuộc vào nội dung của Nhóm, gọi là bậc 3
Vậy mục tiêu chúng ta cần đạt được là:
- Với mỗi bộ phận được chọn trong Combobox1 thì danh sách nhóm trong Combobox2 cần phải thay đổi tương ứng theo bộ phận đó.
- Với mỗi nhóm được chọn trong Combobox2 thì danh sách nhân viên trong Combobox3 cần phải thay đổi tương ứng theo nhóm đó.
3. Tạo danh sách không trùng trong Combobox
Ở các danh sách Bộ phận và Nhóm chúng ta thấy có xuất hiện các giá trị trùng nhau. Do đó để cho danh sách chọn của combobox không xuất hiện các giá trị trùng này thì chúng ta có thể áp dụng cách làm tương tự ở bài trước để thực hiện.
Tạo danh sách không trùng trong Combobox1:
Private Sub Worksheet_Activate() 'Lấy danh sách không trùng vào ComboBox
Dim rng As Range 'Tạo biến Vùng danh sách gốc
Dim r As Range 'Tạo biến để thực hiện vòng lặp trong danh sách gốc
Dim Dic As Object 'Tạo biến để gọi đối tượng dictionary
Dim ws As Worksheet 'Tạo biến Sheet chứa danh sách gốc
Set ws = ActiveSheet 'Sheet chứa danh sách gốc là sheet đang làm việc
Set rng = ws.Range("A2", ws.Range("A" & Rows.Count).End(xlUp)) 'Vùng danh sách gốc nằm ở cột A, bắt đầu từ ô A2
Set Dic = CreateObject("scripting.dictionary") 'Thiết lập đối tượng dictionary
Dic.CompareMode = vbTextCompare 'Thực hiện việc so sánh các ký tự text trong thư viện dic
For Each r In rng
Dic(r.Value) = Empty 'Các giá trị trùng sẽ được bỏ đi
Next
With ComboBox1
.ListFillRange = "" 'Xóa danh sách cũ đã có trước đó
If .ListCount = 0 Then 'Thực hiện việc nạp danh sách mới
.List = Application.Transpose(Dic.keys) 'Lấy kết quả còn lại ở Dic vào Danh sách chọn của combobox1
.ListIndex = 0
End If
End With
End Sub
Từ các combobox2 và combobox3 chúng ta thấy nó phụ thuộc vào nội dung của combobox bậc trước nó, do đó chúng ta sẽ kết hợp việc tạo điều kiện phụ thuộc với việc lọc các giá trị trùng.
4. Tạo điều kiện phụ thuộc nhau giữa các danh sách
Như đã lập luận ở trên: “Với mỗi bộ phận được chọn trong Combobox1 thì danh sách nhóm trong Combobox2 cần phải thay đổi tương ứng theo bộ phận đó” => Như vậy việc thay đổi danh sách chọn trong combobox2 phụ thuộc vào việc nội dung trong combobox1 có thay đổi hay không. Điều này trong VBA được gọi là sự kiện Combobox1_Change
Tại Sheet chứa các combobox cần thực hiện (ở đây là Sheet3) chọn đối tượng Combobox thay cho Worksheet, tiếp đó chọn sự kiện Change cho combobox đó (sự kiện Change sẽ là mặc định khi chọn đối tượng Combobox)
Câu lệnh VBA được viết như sau:
Private Sub ComboBox1_Change() 'Sự kiện thay đổi danh sách tại ComboBox2
Dim rng As Range 'Tạo biến Vùng danh sách gốc
Dim r As Range 'Tạo biến để thực hiện vòng lặp giúp kiểm tra danh sách nạp vào ComboBox2
Dim Dic As Object 'Tạo biến thư viện để gọi đối tượng dictionary
Dim ws As Worksheet ' Tạo biến Sheet chứa danh sách gốc
Set ws = ActiveSheet 'Sheet chứa danh sách gốc là sheet đang làm việc (khi combobox đặt trong Sheet danh sách)
'Nếu khác combobox đặt tại sheet khác thì cần tham chiếu tới sheet chứa danh sách gốc
Set rng = ws.Range("A2", ws.Range("A" & Rows.Count).End(xlUp)) 'Vùng danh sách gốc ở cột A, từ ô A2 tới dòng cuối có dữ liệu
Set Dic = CreateObject("scripting.dictionary") 'Thiết lập đối tượng dictionary
Dic.CompareMode = vbTextCompare 'Thực hiện việc so sánh các ký tự text trong thư viện dictionary
'Thực hiện vòng lặp để xét các nội dung được chọn ở cột danh sách bậc 1
For Each r In rng 'Bắt đầu vòng lặp
If r = ComboBox1 Then 'Nếu giá trị trong danh sách bậc 1 trùng với giá trị đã chọn ở ComboBox1
Dic(r.Offset(, 1).Value) = Empty 'Những giá trị nào trùng lặp ở cột danh sách bậc 2 sẽ bị loại bỏ (DS bậc 2 cách DS bậc 1 là 1 cột)
End If
Next 'Thực hiện vòng lặp đến hết các giá trị trong danh sách bậc 1
'Lấy các kết quả còn lại trong dictionary vào ComboBox2
With ComboBox2
.List = Application.Transpose(Dic.keys)
.ListIndex = 0
End With
End Sub
Như vậy chúng ta đã có thể tạo được danh sách tại ComboBox2 phụ thuộc vào mỗi giá trị được chọn tại Combobox1 rồi.
Tiếp theo là để ComboBox3 phụ thuộc vào ComboBox2 thì chúng ta làm như sau:
- Tạo sự kiện thay đổi ở combobox2: Private Sub ComboBox2_Change
- Copy nội dung của Private Sub ComboBox1_Change và paste vào đây
- Sửa các nội dung: Biến rng thay vì áp dụng Range cho cột A thì sửa thành cột B
- Tại vòng lặp với biến r thì xét r = ComboBox2
- Cuối cùng khi lấy dữ liệu vào Combobox thì đổi thành ComboBox3
Câu lệnh VBA như sau (những nội dung thay đổi cần chú ý được đặt trong phần dấu ***)
Private Sub ComboBox2_Change() 'Sự kiện thay đổi danh sách tại ComboBox3 theo giá trị được chọn tại ComboBox2
Dim rng As Range 'Tạo biến Vùng danh sách gốc
Dim r As Range 'Tạo biến để thực hiện vòng lặp giúp kiểm tra danh sách nạp vào ComboBox2
Dim Dic As Object 'Tạo biến thư viện để gọi đối tượng dictionary
Dim ws As Worksheet ' Tạo biến Sheet chứa danh sách gốc
Set ws = ActiveSheet 'Sheet chứa danh sách gốc là sheet đang làm việc (khi combobox đặt trong Sheet danh sách)
'Nếu khác combobox đặt tại sheet khác thì cần tham chiếu tới sheet chứa danh sách gốc
'***
Set rng = ws.Range("B2", ws.Range("B" & Rows.Count).End(xlUp)) 'Vùng danh sách gốc ở cột B, từ ô B2 tới dòng cuối có dữ liệu
'***
Set Dic = CreateObject("scripting.dictionary") 'Thiết lập đối tượng dictionary
Dic.CompareMode = vbTextCompare 'Thực hiện việc so sánh các ký tự text trong thư viện dictionary
'Thực hiện vòng lặp để xét các nội dung được chọn ở cột danh sách bậc 1
For Each r In rng 'Bắt đầu vòng lặp
'***
If r = ComboBox2 Then 'Nếu giá trị trong danh sách bậc 1 trùng với giá trị đã chọn ở ComboBox2
'***
Dic(r.Offset(, 1).Value) = Empty 'Những giá trị nào trùng lặp ở cột danh sách bậc 3 sẽ bị loại bỏ (DS bậc 3 cách DS bậc 2 là 1 cột)
End If
Next 'Thực hiện vòng lặp đến hết các giá trị trong danh sách bậc 2
'Khi đó những giá trị ở danh sách bậc 3 không cùng nhóm với giá trị được chọn ở danh sách bậc 2 cũng bị loại bỏ
'Lấy các kết quả còn lại trong dictionary vào ComboBox3
'***
With ComboBox3
'***
.List = Application.Transpose(Dic.keys)
.ListIndex = 0
End With
End Sub
Như vậy chúng ta đã hoàn thành được yêu cầu ban đầu rồi.
Một lưu ý là trong ComboBox đôi khi bị lỗi font chữ khi chúng ta chọn 1 giá trị tiếng việt có dấu. Để khắc phục điều này thì chúng ta có thể có 1 số cách sau:
- Sử dụng tiếng việt không dấu
- Tạo liên kết từ combobox ra 1 vị trí tại worksheet để có kết quả đúng (dù lỗi font hiển thị nhưng kết quả liên kết vẫn đúng)
- Sử dụng bộ gõ khác (hết sức lưu ý vì có thể lỗi font khi gửi sang máy tính khác)
Như vậy bài viết đã hướng dẫn cho bạn cách tạo Combobox trong Excel một cách nhanh chóng nhất. Chỉ cẩn vài thao tác đơn giản, bạn đã có thể tạo Combobox rồi. Chúc các bạn thực hiện thao tác thành công!
Tham khảo thêm
- doc Hướng dẫn vẽ biểu đồ đường và biểu đồ tròn trong Excel mà bạn nên biết
- doc Cách dùng hàm AVERAGE, MAX, MIN
- doc Cách sử dụng hàm Sum và hàm SUMIF trong Excel
- doc Hướng dẫn hàm tính tiền tích lũy và khấu hao tài sản trong Excel
- doc Hướng dẫn cách tạo chú thích cho ô và thay đổi màu cho ô theo giá trị trong Excel
- doc Hướng dẫn cách gộp ô và cố định hàng, cốt trong Excel
- doc Hướng dẫn cách gộp nhiều Sheet vào một Sheet và cách xuất dữ liệu ra file Excel mới
- doc Hướng dẫn vẽ biểu đồ thanh/ cột chồng trong Excel một cách nhanh chóng nhất
- doc Hướng dẫn thay đổi cột kết quả và cách lọc giá trị trong Pivottable của Excel MacBook
- doc Hướng dẫn xóa cột hoặc dòng Grand ToTal và cách để làm mới một Pivottable trong Excel
- doc Hướng dẫn thủ thuật làm mới một Pivot Table trong Excel một cách nhanh chóng nhất
- doc Hướng dẫn cách cố định các đối tượng với hàng, cột và viết hàm tìm dòng cuối cùng có dữ liệu trong VBA
- doc Hướng dẫn cách đánh số thứ tự ngày tháng bỏ qua các ngày cuối tuần và sử dụng Flash Fill để tách họ tên trong Excel
- doc Hướng dẫn cách xoá bỏ giá trị trùng lặp với Power Query và các cách để Transpose trong Excel
- doc Giới thiệu cách sử dụng Data Validation List với nguồn là Table và cách loại bỏ dấu chấm trong số điện thoại
- doc Hướng dẫn lập sổ nhật ký chung và sổ cái bằng hàm “HeoSQL”
- doc Hướng dẫn sử dụng hàm VLOOKUP trả về mảng giá trị và sử dụng hàm VLOOKUP lồng VLOOKUP trong Excel
- doc Hướng dẫn đếm số lượng giá trị duy nhất trong 1 vùng và cách tách rời từng ký tự một ra khỏi chuỗi
- doc Hướng dẫn lấy ra danh sách tên các Sheet và tạo phím tắt đếm số lượng Sheet ẩn, hiện trong Excel
- doc Hướng dẫn cách lấy dữ liệu từ 1 File Excel đang đóng và Cách lấy lại File Excel do bị tắt đột ngột
- doc Phương pháp để Protect và UnProtect nhiều Sheet cùng 1 lúc trong Excel một cách nhanh chóng
- jpg Hướng dẫn dùng INDEX và MATCH trong Excel một cách nhanh chóng nhất
- doc Hướng dẫn sửa lỗi không chọn được Visual Basic, Macro trong thẻ Developer và cách gộp các file CSV vào trong một file chung nhanh chóng
- doc Hướng dẫn chi tiết cách sử dụng Quick Access Toolbar trong Excel
- doc Hướng dẫn thay đổi vùng in tự động và viết tắt họ tên trên Excel bằng VBA
- doc Hướng dẫn lấy tên Worksheet đang làm việc một cách nhanh chóng nhất
- doc Hướng dẫn tạo Menu liên kết tới các sheet bằng hàm Hyperlink và cách sử dụng công thức đếm số lần xuất hiện trong Table
- doc Hướng dẫn tạo danh sách không có giá trị trùng trong combobox
- doc Hướng dẫn tra cứu thời gian và tìm giá trị gần đúng nhất bằng VBA
- doc Cách dùng hàm SUMIFS lập báo cáo tổng hợp một cách nhanh chóng nhất
- doc Hướng dẫn cách tính trung bình của một số theo từng lần và sử dụng hàm Subtotal để đánh số thứ tự kết quả lọc Autofilter
- doc Hướng dẫn lập bảng kế hoạch thanh toán hóa đơn trong Excel nhanh chóng nhất
- doc Hướng dẫn cách sử dụng Regular Expression và cách tra cứu thời gian bằng VBA
- doc VBA là gì? VBA trong Excel giúp ích gì cho công việc của bạn?
- doc Vẽ và phân tích biểu đồ xu hướng với Data Analysis trong Excel
- doc Hướng dẫn cách sử dụng hàm PMT tính số tiền thanh toán hàng kỳ cho khoản vay và cách phân tích trả nợ gốc và lãi cùng chuỗi hàm PMT trong Excel
- doc Hướng dẫn chọn nội dung xuất hiện nhiều nhất trong danh sách và sử dụng vòng tính lặp trong Excel