- 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:
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.
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
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:
Tôi có thủ tục sự kiện UserForm_Initialize() như sau:
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.
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ư:
Đối với các ComboBox
Lê Văn Duyệt
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:
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.
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
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:
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