VBA - Cách tạo hộp tổ hợp xếp tầng theo dạng người dùng

VBA - Cách tạo hộp tổ hợp xếp tầng theo dạng người dùng

Giới thiệu

Trong bài viết này, bạn sẽ tìm hiểu làm thế nào để điền vào hộp tổ hợp xếp tầng bằng phương pháp gián tiếp.

Điều kiện tiên quyết

  • 1 sách bài tập
  • 1 người dùng
  • 3 hộp combo.

Bạn cũng có thể tải xuống một sổ làm việc mẫu tại đây: //cjoint.com/14au/DHhootCLYVh.htm

Quản lý tên trong Excel

Để xác định tên trong sổ làm việc Excel, bạn có thể:
  • Excel 2007 hoặc phiên bản cũ hơn: Chèn> Tên> Xác định .
  • Kể từ Excel 2010: Công thức Ribbon> Xác định tên.

Mã cho combobox

Chúng tôi muốn những điều sau đây xảy ra:
  • Khi tải UserForm, ComboBox1 sẽ được điền.
  • Các hộp tổ hợp khác sẽ được điền dựa trên các giá trị của hộp đầu tiên.

Điền vào danh sách đầu tiên

Để điền vào hộp tổ hợp với nội dung của một phạm vi được đặt tên của sổ làm việc, cú pháp là:
  • ComboBox1.List = Application.Transpose (Phạm vi ("monNom"))

Để xóa ComboBox:

  • Combobox1.Clear

Điều gì cung cấp cho chúng tôi mã để điền vào danh sách thả xuống đầu tiên khi tải UserForm:

 Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Phạm vi ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub 

Điền vào danh sách thứ 2

Khi một giá trị được chọn trong danh sách thả xuống đầu tiên, nó sẽ (văn bản hiển thị trong ComboBox) tương ứng với tên sổ làm việc.

Để hiển thị nội dung của các ô của phạm vi được đặt tên, chúng tôi sẽ sử dụng sự kiện Thay đổi:

 Private Sub ComboBox1_Change () 'Combobox département Tránh lỗi được tạo khi người dùng xóa nội dung của ComboBox1 Nếu ComboBox1.Value = "" Sau đó thoát khỏi ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange) Sub 

Đối với hộp tổ hợp thứ ba:

 Private Sub ComboBox2_Change () 'Các xã Combobox Nếu ComboBox2.Value = "" Sau đó thoát Sub ComboBox3.Clear ComboBox3.List = Application.Transpose (Phạm vi (NomRange)) Kết thúc Sub 

Lỗi thường gặp

Phạm vi không tên

Tên được nhập trong ComboBox sẽ không khớp với bất kỳ tên sổ làm việc nào. Điều này xảy ra khi tên chưa được xác định. Để khắc phục vấn đề này, chúng tôi sẽ tạo một hàm nhỏ để lặp qua tất cả các tên của bảng tính:

 Hàm NomDefini (Nom As String) As Boolean Dim Noms As Name NomDefini = false cho mỗi Noms trong ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True: Thoát Hàm tiếp theo Hàm Noms Kết thúc 

Lỗi đầu vào

Như bạn sẽ thấy trong tệp mẫu, việc xác định tên không tính đến các ký tự hoặc khoảng trắng đặc biệt. Trong một số tình huống, bạn có thể cần chỉnh sửa các biến:

Đây là một ví dụ:

 Chức năng CaracSpec (Nom As String) As String CaracSpec = Thay thế (Nom, "", "_") CaracSpec = Thay thế (CaracSpec, "-", "_") Chức năng kết thúc 

Mã hoàn thành

 Tùy chọn Giải thích riêng tư Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Sub Sub Sub ComboBox1_Change () 'Comboboxartartement Nếu ComboBox1. Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox1.Value) If NomDefini (NomRange) Sau đó ComboBox2.List = Application.Transpose (Range (NomRange)) Else ComboBox2.AddItem "" End If End Sub Private Sub ComboBox2_Change () 'Các xã Combobox Nếu ComboBox2.Value = "" Sau đó thoát Sub ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox2.Value) Nếu NomDefini (NomRange) Sau đó ComboBox3. (Phạm vi (NomRange)) Khác ComboBox3.AddItem "" "Aucune rue" "" End If End Sub Hàm NomDefini (Nom As String) As Boolean Dim Noms As Name NomDefini = false For Mỗi Noms trong ThisWorkbook.Names If Noms.Name = Nom Sau đó NomDefini = True: Chức năng thoát Tiếp theo Noms Chức năng kết thúc Chức năng Carac Spec (Nom As String) As String CaracSpec = Thay thế (Nom, "", "_") CaracSpec = Thay thế (CaracSpec, "-", "_") Chức năng kết thúc 

Đường dẫn tải xuống

Tải xuống bảng mẫu trên liên kết này: //cjoint.com/?DHhootCLYVh

VBA - Cách tạo hộp tổ hợp xếp tầng theo dạng người dùng

Giới thiệu

Trong bài viết này, bạn sẽ tìm hiểu làm thế nào để điền vào hộp tổ hợp xếp tầng bằng phương pháp gián tiếp.

Điều kiện tiên quyết

  • 1 sách bài tập
  • 1 người dùng
  • 3 hộp combo.

Bạn cũng có thể tải xuống một sổ làm việc mẫu tại đây: //cjoint.com/14au/DHhootCLYVh.htm

Quản lý tên trong Excel

Để xác định tên trong sổ làm việc Excel, bạn có thể:
  • Excel 2007 hoặc phiên bản cũ hơn: Chèn> Tên> Xác định.
  • Kể từ Excel 2010: Công thức Ribbon> Xác định tên.

Mã cho combobox

Chúng tôi muốn những điều sau đây xảy ra:
  • Khi tải UserForm, ComboBox1 sẽ được điền.
  • Các hộp tổ hợp khác sẽ được điền dựa trên các giá trị của hộp đầu tiên.

Điền vào danh sách đầu tiên

Để điền vào hộp tổ hợp với nội dung của một phạm vi được đặt tên của sổ làm việc, cú pháp là:
  • ComboBox1.List = Application.Transpose (Phạm vi ("monNom"))

Để xóa ComboBox:

  • Combobox1.Clear

Điều gì cung cấp cho chúng tôi mã để điền vào danh sách thả xuống đầu tiên khi tải UserForm:

 Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Phạm vi ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub 

Điền vào danh sách thứ 2

Khi một giá trị được chọn trong danh sách thả xuống đầu tiên, nó sẽ (văn bản hiển thị trong ComboBox) tương ứng với tên sổ làm việc.

Để hiển thị nội dung của các ô của phạm vi được đặt tên, chúng tôi sẽ sử dụng sự kiện Thay đổi:

 Private Sub ComboBox1_Change () 'Combobox département Tránh lỗi được tạo khi người dùng xóa nội dung của ComboBox1 Nếu ComboBox1.Value = "" Sau đó thoát khỏi ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange) Sub 

Đối với hộp tổ hợp thứ ba:

 Private Sub ComboBox2_Change () 'Các xã Combobox Nếu ComboBox2.Value = "" Sau đó thoát Sub ComboBox3.Clear ComboBox3.List = Application.Transpose (Phạm vi (NomRange)) Kết thúc Sub 

Lỗi thường gặp

Phạm vi không tên

Tên được nhập trong ComboBox không khớp với bất kỳ tên sổ làm việc nào vì nó chưa được xác định. Để khắc phục vấn đề này, chúng tôi sẽ tạo ra một chức năng nhỏ. Nó là

vai trò là lặp qua tất cả các tên của bảng tính:

 Hàm NomDefini (Nom As String) As Boolean Dim Noms As Name NomDefini = false cho mỗi Noms trong ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True: Thoát Hàm tiếp theo Hàm Noms Kết thúc 

Lỗi đầu vào

Như bạn sẽ thấy trong tệp mẫu, việc xác định tên không tính đến các ký tự hoặc khoảng trắng đặc biệt. Trong một số tình huống, bạn có thể cần chỉnh sửa biến:

Đây là một ví dụ:

 Chức năng CaracSpec (Nom As String) As String CaracSpec = Thay thế (Nom, "", "_") CaracSpec = Thay thế (CaracSpec, "-", "_") Chức năng kết thúc 

Mã hoàn thành

 Tùy chọn Giải thích riêng tư Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Sub Sub Sub ComboBox1_Change () 'Comboboxartartement If ComboBox1 Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox1.Value) If NomDefini (NomRange) Sau đó ComboBox2.List = Application.Transpose (Range (NomRange)) Else ComboBox2.AddItem "" End If End Sub Private Sub ComboBox2_Change () 'Các xã Combobox Nếu ComboBox2.Value = "" Sau đó thoát Sub ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox2.Value) Nếu NomDefini (NomRange) Sau đó ComboBox3. (Phạm vi (NomRange)) Khác ComboBox3.AddItem "" "Aucune rue" "" End If End Sub Hàm NomDefini (Nom As String) As Boolean Dim Noms As Name NomDefini = false For Mỗi Noms trong ThisWorkbook.Names If Noms.Name = Nom Sau đó NomDefini = True: Chức năng thoát Tiếp theo Noms Chức năng kết thúc Chức năng Carac Spec (Nom As String) As String CaracSpec = Thay thế (Nom, "", "_") CaracSpec = Thay thế (CaracSpec, "-", "_") Chức năng kết thúc 

Đường dẫn tải xuống

Tải xuống bảng mẫu trên liên kết này: //cjoint.com/?DHhootCLYVh
Bài TrướC TiếP Theo Bài ViếT

Lên Trên LờI Khuyên