Hỏi về Validation trong UserForm (combo box) (1 người xem)

  • Thread starter Thread starter kumori
  • Ngày gửi Ngày gửi
Liên hệ QC

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

kumori

Thành viên mới
Tham gia
14/10/15
Bài viết
20
Được thích
1
Chào mọi người


Em đang làm một file như dưới.
Trong đó:
- Cột A là danh sách tên các người trong phòng (define name là Engineer_Name_List)
- Cột C:D thể hiện từng người được gán với 1 project name
- Mình đã tạo 1 user form với combo box ở dòng đầu tiên cho kéo chọn tên của nhân viên trong cột A
- Bài toán là em muốn là khi chọn tên 1 nhân viên ở combo box dòng đầu, thì combo box dòng 2 sẽ xổ ra những project name mà nhân viên đó đang được gán cho ở cột C:D


Nhưng hiện tại em đang không biết xử lý kiểu này thế nào. Nhờ mọi người giúp đỡ
Thanks
 

File đính kèm

Chào mọi người


Em đang làm một file như dưới.
Trong đó:
- Cột A là danh sách tên các người trong phòng (define name là Engineer_Name_List)
- Cột C:D thể hiện từng người được gán với 1 project name
- Mình đã tạo 1 user form với combo box ở dòng đầu tiên cho kéo chọn tên của nhân viên trong cột A
- Bài toán là em muốn là khi chọn tên 1 nhân viên ở combo box dòng đầu, thì combo box dòng 2 sẽ xổ ra những project name mà nhân viên đó đang được gán cho ở cột C:D


Nhưng hiện tại em đang không biết xử lý kiểu này thế nào. Nhờ mọi người giúp đỡ
Thanks
Bạn thêm đoạn code sau vào trong Form:
Mã:
Private Sub CB_EngineerList_Change()
CB_ProjectName.Clear
For i = 2 To Range("D2").End(xlDown).Row
   If Cells(i, 3).Value = CB_EngineerList.Text Then CB_ProjectName.AddItem Cells(i, 4).Value
Next i
End Sub
 
Upvote 0
Thank bác
Giờ em thêm cột G:H để định nghĩa project code
Vẫn là userform khi nãy, nhưng khi em chọn tên 1 nhân viên thì combo box thứ 2 sẽ xổ ra cả Project Code và định nghĩa của Project đấy ở cột H
Code em viết thì đã chạy được như dưới
Mã:
Private Sub CB_EngineerList_Change()
Dim cPJCode As Range
CB_ProjectName.Clear
For i = 2 To Range("D2").End(xlDown).Row
    If Cells(i, 3).Value = CB_EngineerList.Text Then
 '       CB_ProjectName.AddItem Cells(i, 4).Value
            For Each cPJCode In Range("Project_Code_List")
                   If cPJCode = Cells(i, 4) Then
                        CB_ProjectName.AddItem cPJCode.Value & " " & cPJCode.Offset(0, 1).Value
                   End If
            Next cPJCode
    End If
Next i
End Sub

Tuy nhiên em cảm giác khi xử lý thế này thì gặp dữ liệu lớn file excel sẽ chạy rất chậm
Hình như combo box có .List có thể giải quyết được yêu cầu của em, tuy nhiên em không hiểu cách dùng .List cho lắm
Các bác tối ưu hộ em dòng code hoặc chỉ em cách dùng .List trong trường hợp này được không
Em cảm ơn
 

File đính kèm

Upvote 0
Thank bác
Giờ em thêm cột G:H để định nghĩa project code
Vẫn là userform khi nãy, nhưng khi em chọn tên 1 nhân viên thì combo box thứ 2 sẽ xổ ra cả Project Code và định nghĩa của Project đấy ở cột H
Code em viết thì đã chạy được như dưới
Mã:
Private Sub CB_EngineerList_Change()
Dim cPJCode As Range
CB_ProjectName.Clear
For i = 2 To Range("D2").End(xlDown).Row
    If Cells(i, 3).Value = CB_EngineerList.Text Then
 '       CB_ProjectName.AddItem Cells(i, 4).Value
            For Each cPJCode In Range("Project_Code_List")
                   If cPJCode = Cells(i, 4) Then
                        CB_ProjectName.AddItem cPJCode.Value & " " & cPJCode.Offset(0, 1).Value
                   End If
            Next cPJCode
    End If
Next i
End Sub

Tuy nhiên em cảm giác khi xử lý thế này thì gặp dữ liệu lớn file excel sẽ chạy rất chậm
Hình như combo box có .List có thể giải quyết được yêu cầu của em, tuy nhiên em không hiểu cách dùng .List cho lắm
Các bác tối ưu hộ em dòng code hoặc chỉ em cách dùng .List trong trường hợp này được không
Em cảm ơn

cho biết lý do cần phải có bảng G:H mà không gắn chung Project Definition vào chung bảng C:D ?
 
Upvote 0
cho biết lý do cần phải có bảng G:H mà không gắn chung Project Definition vào chung bảng C:D ?

Ở bảng C:D thể hiện người nào gắn với Project code nào, do thế ở cột D các project code sẽ bị trùng lặp rất nhiều
Ngoài ra file này là em làm ví dụ để hỏi, chứ thực ra file thực tế em làm thì có 2 sheet riêng, một sheet dùng để gán project, validation, một sheet chuyên để định nghĩa các bảng như kiểu database thế này.
 
Upvote 0
Ở bảng C:D thể hiện người nào gắn với Project code nào, do thế ở cột D các project code sẽ bị trùng lặp rất nhiều
Ngoài ra file này là em làm ví dụ để hỏi, chứ thực ra file thực tế em làm thì có 2 sheet riêng, một sheet dùng để gán project, validation, một sheet chuyên để định nghĩa các bảng như kiểu database thế này.
thế thì bạn phải tự làm rồi , vì tôi không viết code khi đã biết chắc code viết ra không xài được . Có phải file thật đâu mà xài được
 
Upvote 0
Thank bác
Giờ em thêm cột G:H để định nghĩa project code
Vẫn là userform khi nãy, nhưng khi em chọn tên 1 nhân viên thì combo box thứ 2 sẽ xổ ra cả Project Code và định nghĩa của Project đấy ở cột H
Code em viết thì đã chạy được như dưới
Mã:
Private Sub CB_EngineerList_Change()
Dim cPJCode As Range
CB_ProjectName.Clear
For i = 2 To Range("D2").End(xlDown).Row
    If Cells(i, 3).Value = CB_EngineerList.Text Then
 '       CB_ProjectName.AddItem Cells(i, 4).Value
            For Each cPJCode In Range("Project_Code_List")
                   If cPJCode = Cells(i, 4) Then
                        CB_ProjectName.AddItem cPJCode.Value & " " & cPJCode.Offset(0, 1).Value
                   End If
            Next cPJCode
    End If
Next i
End Sub

Tuy nhiên em cảm giác khi xử lý thế này thì gặp dữ liệu lớn file excel sẽ chạy rất chậm
Hình như combo box có .List có thể giải quyết được yêu cầu của em, tuy nhiên em không hiểu cách dùng .List cho lắm
Các bác tối ưu hộ em dòng code hoặc chỉ em cách dùng .List trong trường hợp này được không
Em cảm ơn
Bạn thay bằng đoạn code này thử xem có nhanh hơn chút nào không?
Mã:
Private Sub CB_EngineerList_Change()
On Error Resume Next
Dim k As Long, gt As String
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
CB_ProjectName.Clear
For i = 2 To Range("D2").End(xlDown).Row
    If Cells(i, 3).Value = CB_EngineerList.Text Then
     gt = Cells(i, 4).Value
     k = Application.WorksheetFunction.Match(gt, Range("g2:g" & Range("g2").End(xlDown).Row))
     CB_ProjectName.AddItem gt & " " & Cells(k + 1, 8).Value
    End If
Next i
    Application.DisplayAlerts = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom