对用户表单的迭代

时间:2017-10-19 15:03:39

标签: excel vba excel-vba excel-2010

我有一个用户表单,我需要让用户输入多组任务,以及估算执行每项任务所需的时间。

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

这是主要代码:

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按钮启用移动到下一个框/按钮?

1 个答案:

答案 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个小数位或只允许整数。还有代码检查是否已输入所需数据,并在保存到工作表之前突出显示缺少数据的控件。尽管如此,这还需要更多的解释。