我有一个用户表单,我需要让用户输入多组任务,以及估算执行每项任务所需的时间。
在完成每项任务和时间估算之后,我希望在电子表格中输入信息,并且字段再次变为空白,以便输入下一个任务。
这是主要代码:
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)在清除下一个要输入的任务的数据之前,如何让代码循环执行一系列指令,例如从表单中获取信息并将其放入电子表格中?我尝试过这段代码,但它似乎只适用于一次迭代。
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)输入数据后,我希望用户能够TAB到下一个框。目前,如果我点击TAB,它会将光标向右移动。如何通过TAB按钮启用移动到下一个框/按钮?
答案 0 :(得分:1)
您应该有几个过程将数据添加到工作表并清除现有数据的形式。
清除表单只是通过表单上的每个控件并将其值设置为某些默认值 - 通常为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
属性来存储应保存的列号和数据的数据类型。
因此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
程序 - 今天的日期输入到控件中,组合框设置好,标签上有一个显示当前指定范围内的增值税金额,重点是正确的控制:
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个小数位或只允许整数。还有代码检查是否已输入所需数据,并在保存到工作表之前突出显示缺少数据的控件。尽管如此,这还需要更多的解释。