选择命令按钮时用户窗体打开。如何将数据输入到表格中的文本框中插入单独的行 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
,我们获取下一个行号以在
上插入数据
我正在尝试创建一个用户窗体,它将在我 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
,我们获取下一个行号以在