Tạo danh mục trong form

Liên hệ QC

doanhhoang79

Thành viên hoạt động
Tham gia
31/3/08
Bài viết
142
Được thích
18
Chào các anh chi!

Tôi tạo 02 ComboBox tỉnh và huyện. Tôi muốn khi mình chọn ComboBox một tỉnh nào đó thì ComboBox huyện sẽ chỉ liệt kê các huyện có trong tỉnh đó.

VD: Tôi chọn Hà Nội, thì sẽ liệt kê các quận huyện của HN, Chọn Tp. HCM thì chỉ liệt kê các quận huyện của Tp. HCM.

Trong file đính kèm tôi đã tạo mẫu nhưng nó liệt kê toàn bộ nên nhiều khi tìm mất nhiều thời gian và đôi khi nhập sai huyện.

Mong các anh chị giúp đỡ để ComboBox hiển thị dữ liệu như mong muốn.

Xin cảm ơn,
 

File đính kèm

Chào các anh chi!

Tôi tạo 02 ComboBox tỉnh và huyện. Tôi muốn khi mình chọn ComboBox một tỉnh nào đó thì ComboBox huyện sẽ chỉ liệt kê các huyện có trong tỉnh đó.

VD: Tôi chọn Hà Nội, thì sẽ liệt kê các quận huyện của HN, Chọn Tp. HCM thì chỉ liệt kê các quận huyện của Tp. HCM.

Trong file đính kèm tôi đã tạo mẫu nhưng nó liệt kê toàn bộ nên nhiều khi tìm mất nhiều thời gian và đôi khi nhập sai huyện.

Mong các anh chị giúp đỡ để ComboBox hiển thị dữ liệu như mong muốn.

Xin cảm ơn,
Vấn đề của bạn có thể giải quyết được với điều kiện là bạn chịu sắp xếp lại dữ liệu của bạn.
VD: Tp.HCM thì gồm Q. nào, Đồng Nai thì gồm Huyện nào?.... Dữ liệu của bạn không theo nguyên tắc thì làm sao filter ra được.
Thân
 
Upvote 0
File gửi kèm em đã tạm xếp một số tỉnh thành, mong các anh chị xem xét
 

File đính kèm

Upvote 0
Bạn tham khảo file này, cột A nhập họ tên, bắt đầu từ cột B nhấn Ctrl+m để chọn (Cột nào cũng vậy)
 

File đính kèm

Upvote 0
Chào các anh chi!

Tôi tạo 02 ComboBox tỉnh và huyện. Tôi muốn khi mình chọn ComboBox một tỉnh nào đó thì ComboBox huyện sẽ chỉ liệt kê các huyện có trong tỉnh đó.

VD: Tôi chọn Hà Nội, thì sẽ liệt kê các quận huyện của HN, Chọn Tp. HCM thì chỉ liệt kê các quận huyện của Tp. HCM.

Trong file đính kèm tôi đã tạo mẫu nhưng nó liệt kê toàn bộ nên nhiều khi tìm mất nhiều thời gian và đôi khi nhập sai huyện.

Mong các anh chị giúp đỡ để ComboBox hiển thị dữ liệu như mong muốn.

Xin cảm ơn,
Làm được... và dể nhất là AutoFilter ---> Tuy nhiên, ít nhất bạn phải cho vào file 1 sự liên hệ giửa TỈNH và HUYỆN chứ ---> 2 cột bạn đưa trong file chẳng qua chỉ là liệt kê, không có liên hệ với nhau
----------------
Tôi gợi ý bạn 1 cách:
- Cột D là danh mục tỉnh
- Cột B là danh mục huyện
- Cột A là tên tỉnh có liên hệ với huyện ở cột B
và code:
PHP:
Private Sub ComboBox1_Change()
  Dim Clls As Range
  On Error Resume Next
  ComboBox2.Clear
  With Sheet3.Range("A1").CurrentRegion
    .AutoFilter 1, ComboBox1
    For Each Clls In Intersect(.Cells, .Offset(1, 1)).SpecialCells(12)
      ComboBox2.AddItem Clls
    Next Clls
    .AutoFilter
  End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Làm được... và dể nhất là AutoFilter ---> Tuy nhiên, ít nhất bạn phải cho vào file 1 sự liên hệ giửa TỈNH và HUYỆN chứ ---> 2 cột bạn đưa trong file chẳng qua chỉ là liệt kê, không có liên hệ với nhau
Cái này vào macro và lọc dữ liệu sau đó mới Autofilter chứ ta?
 
Upvote 0
Làm được... và dể nhất là AutoFilter ---> Tuy nhiên, ít nhất bạn phải cho vào file 1 sự liên hệ giửa TỈNH và HUYỆN chứ ---> 2 cột bạn đưa trong file chẳng qua chỉ là liệt kê, không có liên hệ với nhau

Em đã xếp lại dữ liệu đây, mong anh giúp đỡ
 

File đính kèm

Upvote 0
Đây là 1 cách

Bạn xem trong file đính kèm & bổ sung thêm mã các tỉnh vô các huyện :-=
 

File đính kèm

Upvote 0
Cảm ơn các bác, đúng là các cao thủ. Phương pháp nào cũng hay. Tuyệt!
 
Upvote 0
Bạn xem trong file đính kèm & bổ sung thêm mã các tỉnh vô các huyện :-=
Việc tạo mã cho dử liệu là điều nên làm trong hầu hết các bài toán quản lý cơ sở dử liệu... Tuy nhiên với bài này em nghĩ là không cần thiết.. Vì TỈNH TRONG NƯỚC chẳng có tên nào trùng với tên nào cả (điều này chắc ăn như bắp)
 
Upvote 0
Việc tạo mã cho dử liệu là điều nên làm trong hầu hết các bài toán quản lý cơ sở dử liệu... Tuy nhiên với bài này em nghĩ là không cần thiết.. Vì TỈNH TRONG NƯỚC chẳng có tên nào trùng với tên nào cả (điều này chắc ăn như bắp)

Bác Ndu có thể giải thích đoạn code của mình được không? Em nhìn thấy có vẻ đơn giản nhưng mà lại khó hiểu quá. Khi thay các cột khác nhau để áp dụng vào thực tế thì lại không được
 
Upvote 0
Bác Ndu có thể giải thích đoạn code của mình được không? Em nhìn thấy có vẻ đơn giản nhưng mà lại khó hiểu quá. Khi thay các cột khác nhau để áp dụng vào thực tế thì lại không được
Đơn giản thôi mà bạn!
1> Đầu tiên ta có danh sách nói lên mối quan hệ giửa tỉnh và huyện tai 2 cột A và B -- > Xác định vùng này bằng đoạn:
PHP:
With Sheet3.Range("A1").CurrentRegion
Vì dùng CurrentRegion nên điều kiện tiên quyết là danh sách này không được nằm dính liền với bất cứ dử liệu nào ---> Bạn cũng thấy tôi đặt List tỉnh nằm cột cột D, nghĩa là cách danh sách chính ít nhất 1 cột

2> Khi ta chọn ComboBox1, lập tức danh sách này sẽ được AutoFilter theo điều kiện vừa chọn
PHP:
.AutoFilter 1, ComboBox1

3> AutoFilter xong thì dùng vòng lập quét qua từng cell và Add vào ComboBox 2 thôi
PHP:
For Each Clls In Intersect(.Cells, .Offset(1, 1)).SpecialCells(12)
  ComboBox2.AddItem Clls
Next Clls

4> Add Item xong thì hủy chế độ AutoFilter
Vậy thôi
---------------
Thật ra tôi định làm bài này theo kiểu tạo 1 List động để Add vào ComboBox2 (dùng hàm MATCH và COUNTIF) ... Và cách này cho tốc độ cực nhanh... nhưng sợ rằng hơi khó hiểu, nên tôi vẩn quyết định dùng AutoFilter, nó thông dụng với mọi người hơn
 
Upvote 0
Sao em làm giống bác mà lại không được. Nếu thay đổi cột D thì em phải chỉnh lại code ở đoạn nào vậy?

Em gửi bác file đính kèm để bác kiểm tra giúp.
 

File đính kèm

Upvote 0
Sao em làm giống bác mà lại không được. Nếu thay đổi cột D thì em phải chỉnh lại code ở đoạn nào vậy?

Em gửi bác file đính kèm để bác kiểm tra giúp.

Em vừa phát hiện chưa đạt lại tên Form bác ạ. Tuy nhiên nó vẫn không được. Mong bác kiểm tra giúp.
 
Upvote 0
Em vừa phát hiện chưa đạt lại tên Form bác ạ. Tuy nhiên nó vẫn không được. Mong bác kiểm tra giúp.
Sai quá trời chổ luôn, nói sao nó chẳng chạy:
1> Bạn đã sửa tên mấy ComboBox ấy rồi thì khi viết code phải ghi tên cho đúng chứ ---> Ví dụ bạn sửa ComboBox1 thành Tinh và ComboBox2 thành Huyen... vậy trong code, những chổ nào có chử ComboBox1 phải sửa lại thành Tinh và ComboBox2 thành Huyen ---> Hợp lý chứ
2> Phần Rowsource của ComboBox2 được Add tự động dựa vào việc chọn ComboBox1 nên bạn không được thiết lập phần Rowsource này trong Properties nữa
đại khái code phải sửa lại như sau:
PHP:
Private Sub Tinh_Change()
  Dim Clls As Range
  On Error Resume Next
  Huyen.Clear
  With Sheet3.Range("A1").CurrentRegion
    .AutoFilter 1, Tinh.Value
    For Each Clls In Intersect(.Cells, .Offset(1, 1)).SpecialCells(12)
      Huyen.AddItem Clls
    Next Clls
    .AutoFilter
  End With
End Sub
 

File đính kèm

Upvote 0
Như đã nói ở trên:
tôi định làm bài này theo kiểu tạo 1 List động để Add vào ComboBox2 (dùng hàm MATCH và COUNTIF) ... Và cách này cho tốc độ cực nhanh... nhưng sợ rằng hơi khó hiểu, nên tôi vẩn quyết định dùng AutoFilter, nó thông dụng với mọi người hơn
Nhân đây cho bạn tham khảo luôn
PHP:
Private Sub Tinh_Change()
  Dim CountItem As Long, RngAdd As String
  Huyen.RowSource = ""
  With Range(Sheet3.[A2], Sheet3.[A65536].End(xlUp))
    CountItem = WorksheetFunction.CountIf(.Cells, Tinh)
    If CountItem Then
      RngAdd = "'" & .Parent.Name & "'!" & .Offset(WorksheetFunction.Match(Tinh, .Cells, 0) - 1, 1).Resize(CountItem).Address
      Huyen.RowSource = RngAdd
    End If
  End With
End Sub
Cách làm này đương nhiên nhanh hơn gấp nhiều lần so với cách dùng AutoFilter + 1 vòng lập
 

File đính kèm

Upvote 0
Sai quá trời chổ luôn, nói sao nó chẳng chạy:
1> Bạn đã sửa tên mấy ComboBox ấy rồi thì khi viết code phải ghi tên cho đúng chứ ---> Ví dụ bạn sửa ComboBox1 thành Tinh và ComboBox2 thành Huyen... vậy trong code, những chổ nào có chử ComboBox1 phải sửa lại thành Tinh và ComboBox2 thành Huyen ---> Hợp lý chứ
2> Phần Rowsource của ComboBox2 được Add tự động dựa vào việc chọn ComboBox1 nên bạn không được thiết lập phần Rowsource này trong Properties nữa
đại khái code phải sửa lại như sau:
PHP:
Private Sub Tinh_Change()
  Dim Clls As Range
  On Error Resume Next
  Huyen.Clear
  With Sheet3.Range("A1").CurrentRegion
    .AutoFilter 1, Tinh.Value
    For Each Clls In Intersect(.Cells, .Offset(1, 1)).SpecialCells(12)
      Huyen.AddItem Clls
    Next Clls
    .AutoFilter
  End With
End Sub

Em đã phát hiện ra sai ở chỗ đó rồi, nhưng lại không nghĩ là phải bỏ Rsw ở CBo2. Thank bác nhé.
À vừa nãy bác nói là định làm theo cách khác vậy bác post lên luôn đi để mọi người cùng học tập.
 
Upvote 0
Như đã nói ở trên:

Nhân đây cho bạn tham khảo luôn
PHP:
Private Sub Tinh_Change()
  Dim CountItem As Long, RngAdd As String
  Huyen.RowSource = ""
  With Range(Sheet3.[A2], Sheet3.[A65536].End(xlUp))
    CountItem = WorksheetFunction.CountIf(.Cells, Tinh)
    If CountItem Then
      RngAdd = "'" & .Parent.Name & "'!" & .Offset(WorksheetFunction.Match(Tinh, .Cells, 0) - 1, 1).Resize(CountItem).Address
      Huyen.RowSource = RngAdd
    End If
  End With
End Sub
Cách làm này đương nhiên nhanh hơn gấp nhiều lần so với cách dùng AutoFilter + 1 vòng lập

Cách này của bác đúng là phong cách VBA, nó pro và dễ hiểu hơn cách trước.

Thật tuyệt, Cảm ơn bác.
 
Upvote 0
Web KT

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

Back
Top Bottom