用户窗体上的迭代

我有一个用户表单,我需要让用户input多个任务集,以及估计执行每个任务所需的时间。

在完成每项任务和时间估算之后,我想要在电子表格中input信息,并且字段再次变为空白,以便input下一个任务。

这是主要的代码:

Global i As Integer ' Rows Global j As Integer ' Columns Global tCount As Integer ' Task Count Sub Time_Calcs() Dim mcHours As Integer ' M/C process in hours Dim hDays As Integer ' Hours available per day i = 2 j = 3 tCount = 1 hDays = 6 Worksheets("Calculations").Activate Cells.Delete i = i + 1 Cells(i, 2) = "Item" Cells(i, 3) = "Task" Cells(i, 4) = "# of iterations" Cells(i, 5) = "Maker" Cells(i, 6) = "Checker" i = i + 1 TaskForm.Show End Sub 

我有两个问题:

1)我怎样才能让代码循环执行一系列指令,比如从表单中获取信息,并将其放入电子表格中,然后清除要input的下一个任务的数据? 我已经试过这个代码,但它似乎只能用于一个迭代。

 Private Sub CommandButton1_Click() j = 3 Cells(i, 2) = tCount While j <= 6 If j = 3 Then Cells(i, j) = TaskName ElseIf j = 4 Then Cells(i, j) = NoofIts ElseIf j = 5 Then Cells(i, j) = mTime ElseIf j = 6 Then Cells(i, j) = cTime End If j = j + 1 Wend i = i + 1 j = 3 tCount = tCount + 1 'MSForms.Control(TaskName).Value = vbNullString 'MSForms.Control(NoofIts).Value = vbnullstrins 'MSForms.Control(mTime).Value = vbNullString 'MSForms.Control(cTime).Value = vbNullString TaskName = vbNullString NoofIts = vbNullString mTime = vbNullString cTime = vbNullString End Sub 

2)input数据后,我希望用户能够select下一个框。 目前,如果我打TAB,它会右移光标。 我怎样才能让它通过TABbutton移动到下一个框/button?

您应该有几个步骤将数据添加到工作表并清除现有数据的forms。

清除表单只是通过窗体上的每个控件的一种情况,它的值是一些默认值 – 通常是Null

 Private Sub Reset() Dim ctrl As Control For Each ctrl In Me.Controls Select Case TypeName(ctrl) Case "TextBox", "ComboBox" ctrl.Value = Null Case "OptionButton" ctrl.Value = False Case Else 'Do nothing End Select Next ctrl End Sub 

保存表格数据可能会非常复杂,具体取决于您希望在传输数据之前进行的检查。
我利用控件的Tag属性来存储应该保存的列号和数据的数据types。 因此,像16;CCur会表示它将被保存在第16栏作为货币。

保存数据的实际代码将从查找包含数据的工作表上的最后一个单元格开始,然后可以将这些新数据放在下一个可用的行上。 然后检查每个控件,并将数据保存到tag属性中指定的列中。

所有的数据保存后,表格被重置并执行initialize程序

 Private Sub btnSave_Click() Dim rLastCell As Range Dim ctrl As Control Dim lCol As Long Dim wrkSht As Worksheet Set wrkSht = ThisWorkbook.Worksheets("Raw Data") Set rLastCell = wrkSht.Cells(wrkSht.Rows.Count, 1).End(xlUp).Offset(1) For Each ctrl In Me.Controls With ctrl If TypeName(ctrl) = "TextBox" Or TypeName(ctrl) = "ComboBox" Then If Trim(ctrl.Value) <> "" Then If InStr(.Tag, ";") > 0 Then lCol = Split(.Tag, ";")(0) 'Decide which data type to use. Select Case Split(.Tag, ";")(1) Case "CLNG" wrkSht.Cells(rLastCell.Row, CLng(lCol)) = CLng(ctrl.Value) Case "CCur" wrkSht.Cells(rLastCell.Row, CLng(lCol)) = CCur(ctrl.Value) Case "CDATE" wrkSht.Cells(rLastCell.Row, CLng(lCol)) = CDate(ctrl.Value) Case "CSTR", "CSENTENCE" wrkSht.Cells(rLastCell.Row, CLng(lCol)) = CStr(ctrl.Value) Case "CDBL" wrkSht.Cells(rLastCell.Row, CLng(lCol)) = CDbl(ctrl.Value) Case "CPER" wrkSht.Cells(rLastCell.Row, CLng(lCol)) = CDbl(ctrl.Value) / 100 wrkSht.Cells(rLastCell.Row, CLng(lCol)).NumberFormat = "0.00%" Case Else End Select End If End If End If End With Next ctrl Reset UserForm_Initialize End Sub 

我已经添加了UserForm_Initlialize过程,因为它为数据input设置了表单 – 今天的date被input到一个控件中,combobox被设置,标签被赋予一个标题,显示了来自命名范围的当前增值税额以及正确的控制是给予重点:

 Private Sub UserForm_Initialize() Me.TextBox1 = Format(Date, "dd-mmm-yyyy") Me.lblVAT = "VAT @ " & Format$(ThisWorkbook.Names("VAT").RefersToRange, "Percent") With Me.ComboBox1 .AddItem "A" .AddItem "B" .AddItem "C" End With Me.TextBox1.SetFocus End Sub 

我对代码进行了扩展,代码会自动将名称转换为特殊格式,不允许超过2个小数位,或只允许整数。 还有一些代码可以检查是否input了所需的数据,并在保存到工作表之前突出显示缺less数据的控件。 尽pipe如此,这还需要更多的解释。