选择命令按钮时,用户窗体打开。如何将数据输入到表单中的文本框中,插入到单独工作表的行中?

时间:2019-01-16 10:08:07

标签: excel vba userform

我正在尝试创建一个用户窗体,该窗体将在我选择命令按钮时打开。它的目的是从所选行中获取有关“行程”的数据-即行程代码,开始日期和结束日期,然后让我“拆分”行程,为此我需要输入新的行程代码,开始日期和结束日期。

我需要将表单中的数据放入单独的工作表(称为“拆分”)中,以便在一张工作表中记录原始游览详细信息和新游览详细信息。但是,当我尝试运行宏时,出现运行时错误“ 1004”(应用程序定义的错误或对象定义的错误)。我是VBA的新手,我不知道自己做错了什么!

到目前为止,这是我的代码:

Private Sub UserForm_Initialize()
    With Me
        .OriginalTourCode.Value = Cells(ActiveCell.Row, "A").Value
        .OriginalStartDate.Value = Cells(ActiveCell.Row, "B").Value
        .OriginalEndDate.Value = Cells(ActiveCell.Row, "C").Value
    End With
End Sub

Private Sub SplitTourCommand_Click()

Dim ctrl As Control
    Dim ws As Worksheet
    Set ws = Sheets("Splits")

erow = ws.Cells(Rows.Count, 1).End(x1Up).Offset(1, 0)
    Cells(erow, 1) = OriginalTourCode.Text
    Cells(erow, 2) = OriginalStartDate.Text
    Cells(erow, 3) = OriginalEndDate.Text
    Cells(erow, 4) = NewTourCode1.Text
    Cells(erow, 5) = NewStartDate1.Text
    Cells(erow, 6) = NewEndDate1.Text
    Cells(erow, 7) = NewTourCode2.Text
    Cells(erow, 8) = NewStartDate2.Text
    Cells(erow, 9) = NewEndDate2.Text
    Cells(erow, 10) = ReasonForSplit.Text


End Sub

Private Sub CloseCommand_Click()

Unload Me

End Sub

Userform Intitialise部分自动填充UserForm的前三个单元格,然后我将使用该表单输入新数据。

“关闭命令”部分只是表单上的一个单独按钮,可以退出。

当我单击“拆分游览”命令按钮时,如何将表单输入数据到“拆分”工作表的下一个空行中?

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

你是如此亲近

Dim ctrl As Control
    Dim ws As Worksheet
    Set ws = Sheets("Splits")

erow = ws.Cells(Rows.Count, 1).End(x1Up).Offset(1, 0)
    ws.Cells(erow, 1) = OriginalTourCode.Text
    ws.Cells(erow, 2) = OriginalStartDate.Text
    ws.Cells(erow, 3) = OriginalEndDate.Text
    ws.Cells(erow, 4) = NewTourCode1.Text
    ws.Cells(erow, 5) = NewStartDate1.Text
    ws.Cells(erow, 6) = NewEndDate1.Text
    ws.Cells(erow, 7) = NewTourCode2.Text
    ws.Cells(erow, 8) = NewStartDate2.Text
    ws.Cells(erow, 9) = NewEndDate2.Text
    ws.Cells(erow, 10) = ReasonForSplit.Text


End Sub

答案 1 :(得分:0)

不需要对象变量

结束参数为 xlUp 而不是x1Up

阵列版本

Option Explicit

Private Sub SplitTourCommand_Click()

    Const cSheet As String = "Splits"

    Dim erow As Long
    Dim vnt As Variant

    ReDim vnt(1 To 1, 1 To 10) As String

    vnt(1, 1) = OriginalTourCode.Text
    vnt(1, 2) = OriginalStartDate.Text
    vnt(1, 3) = OriginalEndDate.Text
    vnt(1, 4) = NewTourCode1.Text
    vnt(1, 5) = NewStartDate1.Text
    vnt(1, 6) = NewEndDate1.Text
    vnt(1, 7) = NewTourCode2.Text
    vnt(1, 8) = NewStartDate2.Text
    vnt(1, 9) = NewEndDate2.Text
    vnt(1, 10) = ReasonForSplit.Text

    With Worksheets(cSheet)
        erow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(erow, 1).Resize(, 10) = vnt
    End With

End Sub

范围版本

Option Explicit

Private Sub SplitTourCommand_Click()

    Const cSheet As String = "Splits"

    Dim erow As Long

    With Worksheets(cSheet)
        erow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(erow, 1) = OriginalTourCode.Text
        .Cells(erow, 2) = OriginalStartDate.Text
        .Cells(erow, 3) = OriginalEndDate.Text
        .Cells(erow, 4) = NewTourCode1.Text
        .Cells(erow, 5) = NewStartDate1.Text
        .Cells(erow, 6) = NewEndDate1.Text
        .Cells(erow, 7) = NewTourCode2.Text
        .Cells(erow, 8) = NewStartDate2.Text
        .Cells(erow, 9) = NewEndDate2.Text
        .Cells(erow, 10) = ReasonForSplit.Text
    End With

End Sub

答案 2 :(得分:0)

erow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

您的代码中有2个错误。首先,命令是xlUp,而不是x1Up-“ xl”是“ Excel”的缩写,而不是“ X One”-这是为什么您几乎总是使用{{3} }

第二:由于您的代码是空白的(如下面的 ,因此您的代码将按原样尝试将单元格中的.Value放入无类型变量erow中。最后一个包含数据的单元格),这意味着erow始终0。而且第0行不存在要放入数据的地方。

相反,通过使用Range.Row,我们获得了下一行用于在其上插入数据的行号