Tạo control khi thực thi chương trình.

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,706
Giới tính
Nam
Chào các bạn,
Khi thiết kế form nhập liệu, đôi khi chúng ta không thể xác định được là có bao nhiêu TextBox, ComboBox, Label,...cần phải thêm khi thiết kế. Mà chúng ta phải viết câu lệnh để tạo ra các control này trong lúc thực thi. Đây là vấn đề cũng hấp dẫn, làm cho chương trình chúng ta linh động hơn.
Tôi lấy ví dụ: các bạn hãy xem chương trình quản lý kho vật tư
http://www.giaiphapexcel.com/forum/showthread.php?p=40994#post40994

Đối với chương trình này, làm việc với các biểu bảng thì rất nhiều. Với mỗi biểu bảng có số lượng thông tin khác nhau. Như vậy để chương trình linh động các bạn có thể phải thêm các control trong lúc thực thi chương trình.

Ví dụ: tôi có bảng dữ liệu được bố trí như sau:

InsertCtrls.jpg


Các trường dữ liệu là hàng số 5 (được tô màu vàng) như: Brand (nhãn hiệu), Products Group (nhóm sản phẩm), Products name (tên sản phẩm),...

Mỗi nhóm trường dữ liệu này lại được nhóm với nhau như: Nhóm Top cover (Mặt trên). Nhóm này có các trường: Fabric (vải), PU Quilting (PU để may chần), Fibre (gòn), Design (kiểu may chần).
Tôi cũng có các nhóm tương tự.

Nhóm các trường này lại nhằm giúp cho người lập trình, hoặc người quản lý dễ dàng truy vấn.

Bây giờ tôi muốn tạo một form nhập liệu nhằm điền vào các trường dữ liệu này. Khối dữ liệu của tôi sẽ bắt đầu từ hàng thứ 6 của Sheet Main, các bảng dữ liệu tôi đặt tại Sheet Data. Mỗi bảng dữ liệu tôi đều đặt tên để dễ lấy dữ liệu.

TenKhoiDuLieu.jpg


Tôi sẽ liệt kê tất cả các dữ liệu chính (như bảng ở trên gồm có các trường không thuộc nhóm nào như: Brand, Products group,Products name, Markets và tên của các nhóm như Top cover, Bottom cover,...(được tô màu xanh) vào một ListBox. Các nhóm tôi sẽ đưa vào một Page của đối tượng MultiPage

MultiPage.jpg


Tùy thuộc vào tên của các trường dữ liệu mà tôi sẽ đưa vào các control khác nhau như: ComboBox, TextBox,...

Form tôi thiết kế có các thành phần như sau:

FormChinh.jpg


Tôi có thủ tục sự kiện UserForm_Initialize() như sau:

Mã:
Private Sub UserForm_Initialize()
'Setting
    Call IniLBLayersList
    Call IniCbbProGroups
End Sub

Tôi đã tách các công việc cần thiết thành các thủ tục con.
Thủ tục IniLBLayersList nhằm tạo các control, và điền dữ liệu vào các control.
Mã:
Private Sub IniLBLayersList()
    Dim rng As Range, rngTemp As Range, cell As Range
    Dim sMainLayer As String, sSubLayer As String
    Dim i As Integer, ObjTxt As Control, ObjLabel As Control, ObjCbb As Control
    Dim j As Integer, k As Integer, l As Integer
    i = 0
    Set rng = ThisWorkbook.Worksheets("Main").Range("E5").Offset(0, i)
    Do While Len(rng.Formula) > 0
        sMainLayer = rng.Offset(-1, 0): sSubLayer = rng.Value
        If Len(sMainLayer) > 0 And Len(sSubLayer) > 0 Then
            k = 0    'Reset the variance k
            'Add the item to ListBox LBLayersList
            Me.LBLayersList.AddItem sMainLayer
            'Add the main item to MultiPage first
            If j < 2 Then
                Me.MultiPage1.Pages(j).Caption = sMainLayer
            Else
                Me.MultiPage1.Pages.ADD "Page" & i, sMainLayer
            End If

            Set ObjLabel = Me.MultiPage1.Pages(j).Controls.ADD("Forms.Label.1")
            With ObjLabel
                .Name = "lbl" & i
                .Caption = sSubLayer
                .Left = 6
                .Top = 6 + k * 24
                .Height = 24
                .Width = 114
            End With
            Select Case sSubLayer
            Case "Fabric"
                Set ObjCbb = Me.MultiPage1.Pages(j).Controls.ADD("Forms.ComboBox.1")
                With ObjCbb
                    .Name = "Cbb" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 114
                    .ListWidth = 300
                    'Do not allow the user enter the new value
                    .Style = 2
                    Set rngTemp = ThisWorkbook.Worksheets("Fabric").Range("TB_FABRIC")
                    For Each cell In rngTemp.Cells
                        .AddItem cell.Value
                    Next cell
                   
                End With
            Case "Design"
                Set ObjCbb = Me.MultiPage1.Pages(j).Controls.ADD("Forms.ComboBox.1")
                With ObjCbb
                    .Name = "Cbb" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 114
                    .ListWidth = 150
                    'Do not allow the user enter the new value
                    .Style = 2
                    Set rngTemp = ThisWorkbook.Worksheets("Data").Range("TB_DESIGNS")
                    For Each cell In rngTemp.Cells
                        .AddItem cell.Value
                    Next cell
                   
                End With

            Case Else
                Set ObjTxt = Me.MultiPage1.Pages(j).Controls.ADD("Forms.TextBox.1")
                With ObjTxt
                    .Name = "TxtAdd" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 200
                End With
            End Select
            j = j + 1: k = 1
        ElseIf Len(sMainLayer) = 0 And Len(sSubLayer) > 0 Then
            Set ObjLabel = Me.MultiPage1.Pages(j - 1).Controls.ADD("Forms.Label.1")
            With ObjLabel
                .Name = "lbl" & i
                .Caption = sSubLayer
                .Left = 6
                .Top = 6 + k * 24
                .Height = 24
                .Width = 114
            End With
            Select Case sSubLayer
            Case "Fabric"
                Set ObjCbb = Me.MultiPage1.Pages(j - 1).Controls.ADD("Forms.ComboBox.1")
                With ObjCbb
                    .Name = "Cbb" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 114
                    .ListWidth = 300
                    'Do not allow the user enter the new value
                    .Style = 2
                    Set rngTemp = ThisWorkbook.Worksheets("Fabric").Range("TB_FABRIC")
                    For Each cell In rngTemp.Cells
                        .AddItem cell.Value
                    Next cell
                    

                End With
            Case "Design"
                Set ObjCbb = Me.MultiPage1.Pages(j - 1).Controls.ADD("Forms.ComboBox.1")
                With ObjCbb
                    .Name = "Cbb" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 114
                    .ListWidth = 150
                    'Do not allow the user enter the new value
                    .Style = 2
                    Set rngTemp = ThisWorkbook.Worksheets("Data").Range("TB_DESIGNS")
                    For Each cell In rngTemp.Cells
                        .AddItem cell.Value
                    Next cell
                   
                End With

            Case Else
                Set ObjTxt = Me.MultiPage1.Pages(j - 1).Controls.ADD("Forms.TextBox.1")
                With ObjTxt
                    .Name = "TxtAdd" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 200
                End With
            End Select

            k = k + 1
        End If

        i = i + 1
        Set rng = ThisWorkbook.Worksheets("Main").Range("E5").Offset(0, i)
    Loop
    Set rng = Nothing
    Set ObjLabel = Nothing
    Set ObjTxt = Nothing
    Set ObjCbb = Nothing
End Sub

Các bạn chú ý: khi thêm vào các control, nhằm làm cho các control này được sắp xếp theo thứ tự các bạn phải tính toán để xác định các giá trị cho các thuộc tính như:
Mã:
Set ObjTxt = Me.MultiPage1.Pages(j - 1).Controls.ADD("Forms.TextBox.1")
                With ObjTxt
                    .Name = "TxtAdd" & i
                    [B].Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 200[/B]
                End With

Đối với các ComboBox
Mã:
Set ObjCbb = Me.MultiPage1.Pages(j - 1).Controls.ADD("Forms.ComboBox.1")
                With ObjCbb
                    .Name = "Cbb" & i
                    .Left = 120
                    .Top = 6 + k * 24
                    .Height = 24
                    .Width = 114
                    .ListWidth = 150
                    'Do not allow the user enter the new value
                    .Style = 2
                    Set rngTemp = ThisWorkbook.Worksheets("Data").Range("TB_DESIGNS")
'Điền dữ liệu vào ComboBox với dữ liệu là bảng TB_DESIGNS
                    For Each cell In rngTemp.Cells
                        .AddItem cell.Value
                    Next cell
                End With

Lê Văn Duyệt
 
Kiểm tra dữ liệu được nhập vào các Controls

Giả sử trên form của tôi có hai controls TextBox, để kiểm tra ngày bắt đầu và ngày kết thúc được đặt tên là: Date1Box, Date2Box
Form tôi thiết kế như sau:

FormChonNgay.jpg


Vào đoạn mã kiểm tra khi người dùng nhập liệu vào và nhấn nút Đồng ý

Mã:
Option Explicit

Private Sub cmdDongY_Click()
    Dim ctl As Control
    Dim BegDate, EndDate
    For Each ctl In Me.Controls
        If TypeName(ctl) = "TextBox" Then
            If ctl.Value = "" Or Not IsDate(ctl) Then
                MsgBox "Xin nhap ngay vao TextBox.", vbInformation, "Thong bao"
                ctl.SetFocus
                Exit Sub
            End If
        End If
    Next
    BegDate = Date1Box
    EndDate = Date2Box
    If BegDate >= EndDate Then
        MsgBox "Ngay bat dau phai truoc ngay ket thuc.", vbInformation, "Thong bao"
        Date1Box.SetFocus
        Exit Sub
    End If
    Unload Me

End Sub

Private Sub cmdKetThuc_Click()
    Unload Me
End Sub

Trên đây chỉ là ví dụ, các bạn có thể xem file đính kèm.
Hy vọng rằng chúng ta có thể thiết kế các form dễ dàng và tiện dụng hơn.

Lê Văn Duyệt
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom