List combobox từ điều kiện combobox khác

Liên hệ QC

thang bom khung

Thành viên mới
Tham gia
10/8/11
Bài viết
16
Được thích
1
Em chào mọi người,
Em đã tìm trên mạng nhưng không thấy hoặc không có trường hợp nào giống cách em đang làm.
Trường hợp của em là list combobox B (Type) sẽ phụ thuộc vào sự thay đổi của list combobox A (Using) dùng VB.
Em có hai mục
Mục 1 (Type): Banking Fee, Beauty, Education, Entertaiment, ...
Mục 2 (Using):
ứng với Banking Fee: ATM charge, Service, ...
ứng với Beauty: Clothing, Spa, Haidress, ...
ứng với Education: book, language, ....​
Em muốn rằng khi chọn Mục 1 thì sẽ hiện ra các list trong Mục 2, ứng với điều kiện trong Mục 1.
Em gửi file kèm, các anh chĩ giúp em với nhé.
Em đã tạo một vài define name trước cho các mục, và Button "Outcome" in Sheet "Data".

Em cảm ơn nhiều.
 

File đính kèm

  • Personal Financial - internet.rar
    22 KB · Đọc: 39
Em chào mọi người,
Em đã tìm trên mạng nhưng không thấy hoặc không có trường hợp nào giống cách em đang làm.
Trường hợp của em là list combobox B (Type) sẽ phụ thuộc vào sự thay đổi của list combobox A (Using) dùng VB.
Em có hai mục
Mục 1 (Type): Banking Fee, Beauty, Education, Entertaiment, ...
Mục 2 (Using):
ứng với Banking Fee: ATM charge, Service, ...
ứng với Beauty: Clothing, Spa, Haidress, ...
ứng với Education: book, language, ....​
Em muốn rằng khi chọn Mục 1 thì sẽ hiện ra các list trong Mục 2, ứng với điều kiện trong Mục 1.
Em gửi file kèm, các anh chĩ giúp em với nhé.
Em đã tạo một vài define name trước cho các mục, và Button "Outcome" in Sheet "Data".

Em cảm ơn nhiều.
1. Tạo ra 2 name động:
Mã:
Type=OFFSET(LookupLists!$C$2,,,,COUNTA(LookupLists!$2:$2)-1)
Mã:
Using=OFFSET(LookupLists!$B$2,1,MATCH(Data!$A2,Type,0),COUNTA(OFFSET(LookupLists!$B$2,,MATCH(Data!$A2,Type,0),10000))-1)
(Với name Using, bạn chọn ô B2 trên sheet Data và tạo công thức cho name như trên)

2. Sử dụng Validation list cho 2 cột Type và Using trên sheet Data với 2 name động vừa tạo.

Bây giờ, với mỗi lựa chọn ở cột A (Type), bạn sẽ thấy danh sách xổ xuống tại cột B khác nhau rồi đấy.
 

File đính kèm

  • Personal Financial - internet.rar
    21.2 KB · Đọc: 82
Upvote 0
1. Tạo ra 2 name động:
Mã:
Type=OFFSET(LookupLists!$C$2,,,,COUNTA(LookupLists!$2:$2)-1)
Mã:
Using=OFFSET(LookupLists!$B$2,1,MATCH(Data!$A2,Type,0),COUNTA(OFFSET(LookupLists!$B$2,,MATCH(Data!$A2,Type,0),10000))-1)
(Với name Using, bạn chọn ô B2 trên sheet Data và tạo công thức cho name như trên)

2. Sử dụng Validation list cho 2 cột Type và Using trên sheet Data với 2 name động vừa tạo.

Bây giờ, với mỗi lựa chọn ở cột A (Type), bạn sẽ thấy danh sách xổ xuống tại cột B khác nhau rồi đấy.

Cảm ơn sự giúp đở của anh.
Nhưng em muốn viết trong lập trình VB, với form là "frmXuat", để em có thể Add vào sheet Data, vì sau này em còn nhiều mục khác để nhập số liệu nữa.
Đã có một bạn trên diễn đàn hỏi và có trả lời, nhưng lại không có vấn đề nhập dữ liệu vào excel. Với lại bạn đó không có đặt define name như em, nên em không biết phải làm sao, để sau này em có thể thêm và chỉnh sửa ở các mục.
 

File đính kèm

  • hoiGPE.rar
    122.4 KB · Đọc: 36
Upvote 0
Cảm ơn sự giúp đở của anh.
Nhưng em muốn viết trong lập trình VB, với form là "frmXuat", để em có thể Add vào sheet Data, vì sau này em còn nhiều mục khác để nhập số liệu nữa.
Đã có một bạn trên diễn đàn hỏi và có trả lời, nhưng lại không có vấn đề nhập dữ liệu vào excel. Với lại bạn đó không có đặt define name như em, nên em không biết phải làm sao, để sau này em có thể thêm và chỉnh sửa ở các mục.

Dạo này có nhiều người học cùng THẦY lên đây hỏi cùng chủ đề quá nhỉ!
Topic này y chang câu hỏi của bạn:
http://www.giaiphapexcel.com/forum/...-theo-điều-kiện-trên-form&p=440702#post440702
 
Upvote 0
Dạo này có nhiều người học cùng THẦY lên đây hỏi cùng chủ đề quá nhỉ!
Topic này y chang câu hỏi của bạn:
http://www.giaiphapexcel.com/forum/...-theo-điều-kiện-trên-form&p=440702#post440702

Chào anh,
Như em đã nói ở trên, vấn đề của em và bạn đó giống nhau.
Vì kiến thức VB của em còn hạn hẹp nên em không biết cách làm sao để nhập số liệu vào excel đối với trường hợp của bạn đó.
Mong anh giúp đỡ thêm.
Em có đính kèm 2 file (của em và bạn đó).
 

File đính kèm

  • Hai trường hợp.rar
    144.8 KB · Đọc: 23
Upvote 0
Chào anh,
Như em đã nói ở trên, vấn đề của em và bạn đó giống nhau.
Vì kiến thức VB của em còn hạn hẹp nên em không biết cách làm sao để nhập số liệu vào excel đối với trường hợp của bạn đó.
Mong anh giúp đỡ thêm.
Em có đính kèm 2 file (của em và bạn đó).

Trường hợp tổng quát cho file bạn với bạn đó nè:

Khởi động form, tạo list cho cbo1:

PHP:
Private Sub UserForm_Initialize()
      With Sheets("LookupLists")
            CbBType.List = WorksheetFunction.Transpose(.Range("C2", .Range("C2").End(xlToRight)))
      End With
End Sub

Bằng sự kiện Change của cbo1, tạo list cho cbo2:

PHP:
Private Sub CbBType_Change()
      If CbBType = "" Then GoTo Xoa
      Dim Rng As Range, FindRng As Range
      Dim c As Long, r As Long
      With Sheets("LookupLists")
            Set Rng = .Range("C2", .Range("C2").End(xlToRight))
            Set FindRng = Rng.Find(CbBType, LookIn:=xlValues, LookAt:=xlWhole)
            If FindRng Is Nothing Then GoTo Xoa
                  c = FindRng.Column
                  r = .Cells(1048576, c).End(xlUp).Row
            If r < 3 Then GoTo Xoa
            CbBUsing.List = Range(.Cells(3, c), .Cells(r, c)).Value
      End With
      Exit Sub
Xoa:
      CbBUsing = ""
      CbBUsing.Clear
End Sub

Add vào Sheet Data:

PHP:
Private Sub CmBAdd_Click()
      If CbBType = "" Or CbBUsing = "" Then Exit Sub
      With Sheets("Data").Range("A1048576").End(xlUp).Offset(1)
            .Value = CbBType
            .Offset(, 1) = CbBUsing
      End With
      CbBType = "": CbBUsing = ""
End Sub

Chỉ đơn giản là vậy!
 

File đính kèm

  • Personal_Financial_Internet.rar
    21.6 KB · Đọc: 61
Upvote 0
Chỉnh lại thủ tục Change của Cbo1 tí, cải tiến này sẽ chống trường hợp 1 giá trị:

Mã:
Private Sub CbBType_Change()
      If CbBType = "" Then GoTo Xoa
      Dim Rng As Range, FindRng As Range
      Dim c As Long, r As Long
      With Sheets("LookupLists")
            Set Rng = .Range("C2", .Range("C2").End(xlToRight))
            Set FindRng = Rng.Find(CbBType, LookIn:=xlValues, LookAt:=xlWhole)
            If FindRng Is Nothing Then GoTo Xoa
                  c = FindRng.Column
                  r = .Cells(1048576, c).End(xlUp).Row
            If r < 3 Then GoTo Xoa
[COLOR=#0000cd][B]            Dim sArr As Variant
            sArr = Range(.Cells(3, c), .Cells(r, c)).Value
            If IsArray(sArr) Then
                  CbBUsing.List = sArr
            Else
                  CbBUsing.AddItem sArr
            End If[/B][/COLOR]
      End With
      Exit Sub
Xoa:
      CbBUsing = ""
      CbBUsing.Clear
End Sub
 
Upvote 0
Cảm ơn anh Nghĩa nhiều.
Quá tuyệt vời.

Lưu ý, với những dạng bài này, bạn không cần phải dùng Name đâu, cho nên trong file đó nếu name phục vụ cho các ComboBox thì xóa hết đi.

Từ Cột C trở về sau, nếu bạn cứ tiếp tục thêm Type mới và cứ liền kề nhau thì không cần phải sửa code gì nữa!
 
Upvote 0
Bạn có hỏi tôi:

thang bom khung đã viết:
Lưu ý, với những dạng bài này, bạn không cần phải dùng Name đâu, cho nên trong file đó nếu name phục vụ cho các ComboBox thì xóa hết đi.

Từ Cột C trở về sau, nếu bạn cứ tiếp tục thêm Type mới và cứ liền kề nhau thì không cần phải sửa code gì nữa!

Anh Nghĩa ơi,
Trong phương pháp của anh, em nên chèn thêm câu lệnh gì nửa để chặn dưới cho mục Using.
Vì những Row phía dưới em có thêm các dữ liệu khác.
Thanks anh.

Tôi nghĩ câu hỏi này cũng không cần phải riêng tư nên tôi đưa lên diễn đàn luôn.

Tôi chưa rõ vấn đề của bạn lắm, "chặn dưới cho mục Using" là chặn như thế nào?
 
Upvote 0
Theo tôi đoán thì phía dưới của bảng tra dữ liệu bạn còn sử dụng vào mục đích khác vì vậy bạn mới giới hạn dòng. Vậy thì với code này bạn có thể dễ dàng giới hạn số dòng và số cột nếu bạn muốn.

Mã:
'Diem moi:
Dim MyRng As Range

Private Sub CbBType_Change()
      If CbBType = "" Then GoTo Xoa
      Dim Rng As Range, FindRng As Range
      Dim c As Long, r As Long
      
      CbBUsing = ""

      With Sheets("LookupLists")
            'Dung lai MyRng:
            Set FindRng = MyRng.Find(CbBType, LookIn:=xlValues, LookAt:=xlWhole)
            
            If FindRng Is Nothing Then GoTo Xoa
                  c = FindRng.Column
                  'Old:
                  'r = .Cells(1048576, c).End(xlUp).Row
                  'New: Chon so hang can gioi han:
                  r = .Cells(31, c).End(xlUp).Row
            If r < 3 Then GoTo Xoa
            Dim sArr As Variant
            sArr = Range(.Cells(3, c), .Cells(r, c)).Value
            If IsArray(sArr) Then
                  CbBUsing.List = sArr
            Else
                  CbBUsing.AddItem sArr
            End If
      End With
      Exit Sub
Xoa:
      CbBUsing = ""
      CbBUsing.Clear
End Sub

Private Sub CmBAdd_Click()
      If CbBType = "" Or CbBUsing = "" Then Exit Sub
      'Tuong tu voi cai nay, neu gioi han so dong thi chinh tai A1048576
      With Sheets("Data").Range("A1048576").End(xlUp).Offset(1)
            .Value = CbBType
            .Offset(, 1) = CbBUsing
      End With
      CbBType = "": CbBUsing = ""
End Sub

Private Sub cmBClose_Click()
      Unload Me
End Sub


Private Sub UserForm_Initialize()
      With Sheets("LookupLists")
            'Old:
            'CbBType.List = WorksheetFunction.Transpose(.Range("C2", .Range("C2").End(xlToRight)))
            'New: Lay tieu de gioi han tu cot X tro ve cot C
            Set MyRng = .Range("C2", .Range("Y2").End(xlToLeft))
            CbBType.List = WorksheetFunction.Transpose(MyRng)
      End With
End Sub

Xem file đính kèm và nhớ thực hiện đúng với các lưu ý màu đỏ!
 

File đính kèm

  • Personal_Financial_Internet_2.rar
    25.6 KB · Đọc: 28
Upvote 0
Cảm ơn anh đã giúp đở và chĩ rỏ ràng chổ nào đã thay đổi.
Nhưng nếu thay đổi các con số dòng và cột giới hạn thì thủ công quá. Em muốn nó tự hiểu là nếu có một dòng trống thì không list nữa.
Nếu sau này, các mục của em dài ra (em insert thêm dòng, giả sử vượt qua con số giới hạn). Thì em lại phải chỉnh lại con số giới hạn dòng và cột (ví dụ là C2, Y2 hay C31).
Em có đính kèm file. Anh xem giúp.
 

File đính kèm

  • Personal Financial.rar
    28.6 KB · Đọc: 9
Upvote 0
Cảm ơn anh đã giúp đở và chĩ rỏ ràng chổ nào đã thay đổi.
Nhưng nếu thay đổi các con số dòng và cột giới hạn thì thủ công quá. Em muốn nó tự hiểu là nếu có một dòng trống thì không list nữa.
Nếu sau này, các mục của em dài ra (em insert thêm dòng, giả sử vượt qua con số giới hạn). Thì em lại phải chỉnh lại con số giới hạn dòng và cột (ví dụ là C2, Y2 hay C31).
Em có đính kèm file. Anh xem giúp.

Thông thường thì tôi không giới hạn gì cả, như bài gửi đầu tiên ở bài 6 và bài 7

http://www.giaiphapexcel.com/forum/...ừ-điều-kiện-combobox-khác&p=441000#post441000

http://www.giaiphapexcel.com/forum/...ừ-điều-kiện-combobox-khác&p=441005#post441005

Lý do:

Bạn sẽ sử dụng hiệu quả cơ sở dữ liệu (nguồn) nếu bạn không để lung tung dữ liệu vào một sheet. Khi đó, bạn thêm hàng hay thêm bất cứ cột nào thì code đều nhận ra.

Vì vậy nếu thông minh hơn, bạn để riêng mỗi loại dữ liệu vào mỗi sheet khác nhau để tránh rườm rà và dễ dàng tìm kiếm thông tin của dữ liệu nguồn.


Vấn đề của bạn không phải là không có cách, nhưng giờ tôi không có thời gian.

Trân trọng.
 
Upvote 0
Cảm ơn anh đã giúp đở và chĩ rỏ ràng chổ nào đã thay đổi.
Nhưng nếu thay đổi các con số dòng và cột giới hạn thì thủ công quá. Em muốn nó tự hiểu là nếu có một dòng trống thì không list nữa.
Nếu sau này, các mục của em dài ra (em insert thêm dòng, giả sử vượt qua con số giới hạn). Thì em lại phải chỉnh lại con số giới hạn dòng và cột (ví dụ là C2, Y2 hay C31).
Em có đính kèm file. Anh xem giúp.

Nếu bạn vẫn hứng thú với dạng cấu trúc như trong file thì tôi sẽ làm cho bạn.

Vì là cấu trúc "di động" nên phải có một giải pháp di động đối với hàng cột, vậy làm sao để cho code cập nhật mà không phải chỉnh sửa địa chỉ đây?

Thử thí nghiệm với Name, khi ta đặt name tại một ô nào đó, thử delete hoặc insert hàng/ cột mà tránh cái ô chứa name ra thì name có thay đổi địa chỉ ô hay không? Dĩ nhiên địa chỉ của name sẽ chạy theo cái mà ta đã thay đổi, trừ khi ta xóa ngay cái hàng/ cột có chứa name đó.

Vậy thì ta bắt tay làm việc với Name để giới hạn dòng, giới hạn cột và ô bắt đầu với tiêu đề.

Tôi đặt 3 name RCStart, RowLim, ColLim lần lượt trong sheet LookupLists (bạn sẽ nhận ra khi xem file), để code chạy luôn luôn đúng thì chớ có xóa những name này.

Khởi động chạy khi load form ta có thủ tục:

Mã:
Private Sub UserForm_Initialize()
      [COLOR=#008000]'Them cho ban cai calendar[/COLOR]
      Calendar1.Value = Date
      TxtDate = Date
      With Sheets("LookupLists")
            [COLOR=#008000]'Lay dia chi dao dong theo Name:[/COLOR]
            [COLOR=#0000cd]Set [/COLOR][B][COLOR=#800080]MyRng [/COLOR][/B][COLOR=#0000cd]= .Range("[/COLOR][COLOR=#ff0000]RCStart[/COLOR][COLOR=#0000cd]", .Range("[/COLOR][COLOR=#ff0000]ColLim[/COLOR][COLOR=#0000cd]").End(xlToLeft))[/COLOR]
            CbBType.List = WorksheetFunction.Transpose(MyRng)
      End With
End Sub

Tạo List cho CbBUsing đương nhiên ta phải dùng sự kiện Change của CbBType:

Mã:
Private Sub CbBType_Change()
      If CbBType = "" Then GoTo Xoa
      Dim Rng As Range, FindRng As Range
      Dim c As Long, r As Long, h As Long
      
      CbBUsing = ""
      
      With Sheets("LookupLists")
            [COLOR=#008000]'Dung lai MyRng:[/COLOR]
            Set FindRng = [B][COLOR=#800080]MyRng[/COLOR][/B].Find(CbBType, LookIn:=xlValues, LookAt:=xlWhole)
            
            If FindRng Is Nothing Then GoTo Xoa
                  c = FindRng.Column
[COLOR=#0000cd]                  h = [[/COLOR][COLOR=#ff0000]RCStart[/COLOR][COLOR=#0000cd]].Row + 1
                  r = .Cells([[/COLOR][COLOR=#ff0000]RowLim[/COLOR][COLOR=#0000cd]].Row, c).End(xlUp).Row[/COLOR]
            If r < 3 Then GoTo Xoa
            Dim sArr As Variant
            sArr = Range(.Cells(h, c), .Cells(r, c)).Value
            If IsArray(sArr) Then
                  CbBUsing.List = sArr
            Else
                  CbBUsing.AddItem sArr
            End If
      End With
      Exit Sub
Xoa:
      CbBUsing = ""
      CbBUsing.Clear
End Sub

Tại nút Add, tôi cũng gợi ý cho bạn cách thức nhập liệu, bạn tự mày mò mà làm thêm, chủ yếu để tự học:

Mã:
Private Sub CmBAdd_Click()
     [COLOR=#008000] 'Dat dieu kien de bay loi hoac khong cho cac box bi rong:[/COLOR]
      If CbBType = "" Or CbBUsing = "" Then Exit Sub
      
      [COLOR=#008000]'Duoi day la goi y ban lam tiep theo...[/COLOR]
      With Sheets("Data").Range("A1048576").End(xlUp).Offset(1)
            .Value = Format(TxtDate, "mm/dd/yyyy") [COLOR=#008000]'<--- dac biet la o cho nay (mm/dd xuong sheet thanh dd/mm)[/COLOR]
            .Offset(, 1) = CbBAccount
            '.Offset(, 2) = 'tieusan
            .Offset(, 3) = CbBType
            .Offset(, 4) = CbBUsing
            [COLOR=#008000]'......[/COLOR]
      End With
      
      [COLOR=#008000]'Sau khi nhap xong, xoa het cac du lieu trong cac box:[/COLOR]
      CbBType = "": CbBUsing = ""
      [COLOR=#008000]'......[/COLOR]
      
End Sub

Khi insert hay delete hàng/ cột, bạn nên đặt con trỏ trong vùng màu xanh của bảng dữ liệu để hàng, cột có chứa name luôn luôn bao ở ngoài bảng dữ liệu nhé!
 

File đính kèm

  • Personal_Financial_2.rar
    36 KB · Đọc: 56
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh Nghĩa nhiều. Quá tuyệt vời.
Anh hướng dẫn rất kỹ và rõ ràng.

Have a nice weekeend.
 
Upvote 0
Web KT
Back
Top Bottom