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

Userform opens when selecting command button. How do I make data input into the textboxes in the form insert onto row in separate sheet?

我正在尝试创建一个用户窗体,它将在我 select 命令按钮时打开。它的目的是从 selected 行中捕获有关 "tour" 的数据 - 即旅行代码、开始日期和结束日期,然后对我来说 "split" 旅行,因为我需要输入新的旅行代码、开始日期和结束日期。

我需要将表格中的数据放入单独的 sheet(称为 "splits"),这样我就可以记录原始旅游详情,并将新旅游详情合二为一sheet。但是当我尝试 运行 宏时,出现 运行-Time 错误“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

用户窗体初始化部分自动填写用户窗体的前三个单元格,然后我将使用该窗体输入新数据。

“关闭”命令部分只是表单上用于退出的单独按钮。

如何获取表格,当我单击 "split tour" 命令按钮时,将数据输入 "splits" sheet 的下一个空行?

非常感谢您的帮助。

你们是如此亲密

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

不需要对象变量

结束参数是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
erow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

您的代码中有 2 个错误。首先,命令是 xlUp,而不是 x1Up - "xl" 是 "Excel" 的缩写,而不是 "X One" - 这是一个完美的例子,说明为什么你应该几乎总是使用 Option Explicit

其次:您的代码按原样尝试将单元格中的 .Value 放入未类型化变量 erow - 因为单元格是空白的(因为下面的单元格 最后一个有数据的单元格),这意味着 erow 总是 0。并且第 0 行不存在,无法放入数据。

相反,通过使用 Range.Row,我们获取下一个行号以在

上插入数据