[Help]Liên kết combobox (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

pdhung197

Thành viên mới
Tham gia
24/11/11
Bài viết
20
Được thích
0
Chào mọi người.

E có 1 file như đính kèm. E đã tạo 2 combobox cho việc chọn Tỉnh và chọn Huyện rồi.

Vấn đề của e bây giờ là :

1/ Ở mục chọn tỉnh, có cách nào để lọc dữ liệu trùng ? Tức là vì mỗi huyện nó lại có 1 dòng tên tỉnh tương ứng nên dẫn tới combobox tên tỉnh nó trùng lặp.

2/ Sau bước 1 (lọc dữ liệu trùng khi hiển thị trên combobox) thì làm thế nào để liên kết combobox tên huyện với combobox tên tỉnh. Tức là khi chọn tên tỉnh ở combobox 1 thì ở combobox 2 sẽ chỉ chứa danh sách các huyện tương ứng với tỉnh được chọn ở combobox.

Nhờ mọi người hướng dẫn giúp. Search google nãy giờ mà mù tịt **~**
 

File đính kèm

Chào mọi người.

E có 1 file như đính kèm. E đã tạo 2 combobox cho việc chọn Tỉnh và chọn Huyện rồi.

Vấn đề của e bây giờ là :

1/ Ở mục chọn tỉnh, có cách nào để lọc dữ liệu trùng ? Tức là vì mỗi huyện nó lại có 1 dòng tên tỉnh tương ứng nên dẫn tới combobox tên tỉnh nó trùng lặp.

2/ Sau bước 1 (lọc dữ liệu trùng khi hiển thị trên combobox) thì làm thế nào để liên kết combobox tên huyện với combobox tên tỉnh. Tức là khi chọn tên tỉnh ở combobox 1 thì ở combobox 2 sẽ chỉ chứa danh sách các huyện tương ứng với tỉnh được chọn ở combobox.

Nhờ mọi người hướng dẫn giúp. Search google nãy giờ mà mù tịt **~**
Ta làm như sau
1> Copy các code dưới đây cho vào 1 module:
PHP:
Sub Auto_Open()
  Dim cboProvince As DropDown
  Dim sArray, Arr
  On Error Resume Next
  sArray = Sheet1.Range("A2:A1000").Value
  Set cboProvince = Sheet1.DropDowns("cboProvince")
  Arr = UniqueList(sArray)
  If IsArray(Arr) Then cboProvince.List() = Arr
End Sub
PHP:
Sub cboProvince_Change()
  Dim cboDistrict As DropDown
  Dim sProvince As String, sArray, Arr()
  Dim lR As Long, n As Long
  On Error Resume Next
  sArray = Sheet1.Range("A2:B1000").Value
  Set cboDistrict = Sheet1.DropDowns("cboDistrict")
  With Sheet1.DropDowns("cboProvince")
    sProvince = .List(.Value)
  End With
  For lR = 1 To UBound(sArray, 1)
    If sArray(lR, 1) = sProvince Then
      n = n + 1
      ReDim Preserve Arr(1 To n)
      Arr(n) = sArray(lR, 2)
    End If
  Next
  If n Then cboDistrict.List = Arr
End Sub
PHP:
Function UniqueList(ParamArray sArray())
  Dim Item, TmpArr, SubArr
  On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each SubArr In sArray
      TmpArr = SubArr
      If TypeName(TmpArr) <> "Variant()" Then
        If TmpArr <> "" Then .Add TmpArr, ""
      Else
        For Each Item In TmpArr
          If Item <> "" Then
            If Not .Exists(Item) Then .Add Item, ""
          End If
        Next
      End If
    Next
    UniqueList = .Keys
  End With
End Function
2> Đặt tên cho ComboBox Tỉnh là cboProvince và ComboBox Huyện là cboDistrict
3> Assign Macro cboProvince cho Sub cboProvince_Change
4> Đóng và lưu file
5> Mở file trở lại và kiểm tra
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn thầy. Bây giờ e muốn hiển thị tên tỉnh và tên huyện ra 1 ô khác thì làm sao ah ?

Ở tên tỉnh thì e có thể Control cho Cell link ra 1 ô, rồi dùng hàm index để hiển thị ra đúng tên tỉnh với thứ tự như trong Cell link (như e đã làm trong file đính kèm) . Nhưng tên huyện thì ko làm được như vậy, vì thứ tự của nó lại phụ thuộc vào tên tỉnh đã chọn :(
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn thầy. Bây giờ e muốn hiển thị tên tỉnh và tên huyện ra 1 ô khác thì làm sao ah ?

Ở tên tỉnh thì e có thể Control cho Cell link ra 1 ô, rồi dùng hàm index để hiển thị ra đúng tên tỉnh với thứ tự như trong Cell link (như e đã làm trong file đính kèm) . Nhưng tên huyện thì ko làm được như vậy, vì thứ tự của nó lại phụ thuộc vào tên tỉnh đã chọn :(

Đã code thì code luôn chứ LinkCell rồi hàm chi cho cực
Đoạn code này:
PHP:
With Sheet1.DropDowns("cboProvince")
  sProvince = .List(.Value)
End With
Sửa thành:
PHP:
With Sheet1.DropDowns("cboProvince")
  sProvince = .List(.Value)
  .Parent.Range("D11").Value = sProvince
End With
- Thêm 1 đoạn code nữa:
PHP:
Sub cboDistrict_Change()
  Dim sDistrict As String
  On Error Resume Next
  With Sheet1.DropDowns("cboDistrict")
    sDistrict = .List(.Value)
    .Parent.Range("D12").Value = sDistrict
  End With
End Sub
- Assign Macro cboDistrict cho Sub vừa thêm ở trên
Xong
 

File đính kèm

Upvote 0
Đã code thì code luôn chứ LinkCell rồi hàm chi cho cực
Đoạn code này:
PHP:
With Sheet1.DropDowns("cboProvince")
  sProvince = .List(.Value)
End With
Sửa thành:
PHP:
With Sheet1.DropDowns("cboProvince")
  sProvince = .List(.Value)
  .Parent.Range("D11").Value = sProvince
End With
- Thêm 1 đoạn code nữa:
PHP:
Sub cboDistrict_Change()
  Dim sDistrict As String
  On Error Resume Next
  With Sheet1.DropDowns("cboDistrict")
    sDistrict = .List(.Value)
    .Parent.Range("D12").Value = sDistrict
  End With
End Sub
- Assign Macro cboDistrict cho Sub vừa thêm ở trên
Xong

Cho e hỏi cù lần tí. Chỗ .Parent.Range("D11").Value = sProvince nếu e muốn dòng hiển thị ở Sheet2 chẳng hạn, thì sẽ đổi thành .Parent.Sheet2.Range("D11").Value = sProvince là sai hay sao mà làm xong lưu xong mở file lên thì ko hiển thị theo đúng ý mình được ạ :(
 
Upvote 0
Cho e hỏi cù lần tí. Chỗ .Parent.Range("D11").Value = sProvince nếu e muốn dòng hiển thị ở Sheet2 chẳng hạn, thì sẽ đổi thành .Parent.Sheet2.Range("D11").Value = sProvince là sai hay sao mà làm xong lưu xong mở file lên thì ko hiển thị theo đúng ý mình được ạ :(
- ParentCHA
cái thằng .Parent trong đoạn này
Mã:
With Sheet1.DropDowns("cboProvince")
  [B].Parent[/B].Range("D11").Value = sProvince
End With
ý muốn nói đến CHA của thằng cboProvince ở phía trên ---> CHA nó đương nhiên là Sheet chứa nó rồi, tức sheet1
Cả đoạn trên nếu viết rõ ra thì sẽ vầy:
Mã:
With Sheet1.DropDowns("cboProvince")
  sProvince = .List(.Value)
End With 
[COLOR=#ff0000][B]Sheet1[/B][/COLOR].Range("D11").Value = sProvince
Vậy, trường hợp muốn đổi thành sheet2 thì sửa .Parent thành Sheet2.. ---> Sheet2.Range("D11").Value = sProvince (không có dấu chấm đàng trước Sheet2 đâu nha... nghĩa là không cha con gì với thàng cboProvince phía trên cả. Nó độc lập)
 
Lần chỉnh sửa cuối:
Upvote 0
E cảm ơn ạ. Vậy nếu muốn ở combobox của Huyện có nhiều lựa chọn thì sao ah ? Tức là ở combobox hiển thị như 1 tickbox, nếu tick vào nhiều huyện thì sẽ hiện tên nhiều huyện (lần lượt theo hàng dọc chẳng hạn).
 
Upvote 0
E cảm ơn ạ. Vậy nếu muốn ở combobox của Huyện có nhiều lựa chọn thì sao ah ? Tức là ở combobox hiển thị như 1 tickbox, nếu tick vào nhiều huyện thì sẽ hiện tên nhiều huyện (lần lượt theo hàng dọc chẳng hạn).
ComboBox bạn đang dùng là ComboBox Forms, sẽ không có tính năng như bạn vừa mô tả đâu
Thích thì phải chuyển sang loại ComboBox ActiveX thôi
 
Upvote 0
Dạ, vậy phải sửa thế nào ạ ? Phần dữ liệu trên của e ko có tiếng Việt nên ko sợ ạ :)
Thôi vầy đi: Để đơn giản hóa vấn đề, tôi vẫn dùng các Control thuộc Forms, có điều sẽ thay ComboBox Huyện bằng 1 ListBox (vì listBox cho phép Muti Select)
Code chỉ sửa lại đôi chút:
PHP:
Sub Auto_Open()
  Dim cboProvince As DropDown
  Dim sArray, Arr
  On Error Resume Next
  sArray = Sheet1.Range("A2:A1000").Value
  Set cboProvince = Sheet1.DropDowns("cboProvince")
  Arr = UniqueList(sArray)
  If IsArray(Arr) Then cboProvince.List() = Arr
End Sub
PHP:
Sub cboProvince_Change()
  Dim lstDistrict As Object
  Dim sProvince As String, sArray, Arr()
  Dim lR As Long, n As Long
  On Error Resume Next
  sArray = Sheet1.Range("A2:B1000").Value
  Set lstDistrict = Sheet1.ListBoxes("lstDistrict")
  With Sheet1.DropDowns("cboProvince")
    sProvince = .List(.Value)
    .Parent.Range("D11").Value = sProvince
  End With
  For lR = 1 To UBound(sArray, 1)
    If sArray(lR, 1) = sProvince Then
      n = n + 1
      ReDim Preserve Arr(1 To n)
      Arr(n) = sArray(lR, 2)
    End If
  Next
  If n Then lstDistrict.List = Arr
End Sub
PHP:
Sub lstDistrict_Change()
  Dim Arr(1 To 100, 1 To 1), lR As Long, n As Long
  On Error Resume Next
  With Sheet1.ListBoxes("lstDistrict")
    For lR = 1 To .ListCount
      If .Selected(lR) Then
        n = n + 1
        Arr(n, 1) = .List(lR)
      End If
    Next
  End With
  With Sheet1.Range("D12")
    .Resize(100).ClearContents
    If n Then .Resize(n).Value = Arr
  End With
End Sub

Capture.JPG
 

File đính kèm

Upvote 0
Bạn nào chỉ giùm cách tạo Combobox để lấy dữ liệu được không vậy?
trong file mẫu thì có bảng này, còn cái làm mới thì không có bạn à.
11111111111111.jpg
222222222222222.jpg
 
Upvote 0
Web KT

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

Back
Top Bottom