关于这个话题的很多帖子之一,很可能回答了我的问题,但是我太新了,不能认识到它。以下代码从用户表单获取输入并发布到表中的下一行。它每隔一次使用btsubmit按钮。导致运行时错误的代码行是wirelistrow.Range(1,13).Value =" 123"。
Private Sub btnsubmit_Click()
Dim ssheet As Worksheet
Dim wirelist As ListObject
Dim wirelistrow As ListRow
Set ssheet = Sheets("Database")
Set wirelist = ssheet.ListObjects(1)
Set wirelistrow = wirelist.ListRows.Add
ssheet.Unprotect Password:="wire$"
wirelistrow.Range(1, 13).Value = "123"
findrowintable = ssheet.Range("M65536").End(xlUp).Row
wirelistrow.Range(1, 12).Value = findrowintable
Nextrowdata = findrowintable
ssheet.Range("A" & Nextrowdata) = Me.tbdate
end sub
表格是A3到M6300,我正在尝试从输入表单添加下一行数据。 我在第一次通过时工作,并在第二次通过时生成错误。我单击结束错误消息,然后再次运行正常下一条记录。 非常感谢任何帮助。
答案 0 :(得分:0)
查看此代码,看看您是否可以根据自己的情况进行调整。
会发生什么:
UserForm激活,并设置了sheetName,并调用了子ClearData。
单击“更新”按钮时,将调用子PutData。
PutData只是根据地址将UserForm控件(文本框,列表框,组合框,复选框等)中的数据放入工作表中。
ClearData重置UserForm以使用TextBox日期中的新日期清除。
如果你想构建一个导航器来移动整个记录,这是另一个故事,但如果你这样做,GetData子将与PutData完全相反。我将包含GetData的示例,但为了简洁起见,不添加导航控件。
结果是,您在点击"更新"然后使用新日期重置后,将值从用户表单传输到工作表的新行。
Subs:包含在示例中
- UserForm_Activate
- cmdUpdate_click
- cmdClear_Click
- PutData
- ClearData
- GetData (Bonus)
此代码放在UserForm的代码中,声明激活之上的变量使这些变量成为'范围整个用户表单,并可用于其上的每个子。
Dim lastRow As Long, lRow As Long
Dim sheetName As String
Private Sub UserForm_Activate()
sheetName = "Database"
Call ClearData
End Sub
Private Sub cmdUpdate_Click()
Call PutData
End Sub
Private Sub cmdClear_Click()
Call ClearData
End Sub
Private Sub PutData()
'Save the Text from the Control into the sheet, using .Cells(row,col)
Sheets(sheetName).Cells(lRow, 1) = txtDate.Text
Sheets(sheetName).Cells(lRow, 13) = txtValue.Text
ActiveWorkbook.Save
Call ClearData
End Sub
Private Sub ClearData()
txtDate.Text = Now 'Reset the UserForm to blank with the date as NOW.
txtValue.Text = ""
'Re-Acquire the last Row and set the new row variable.
lastRow = Sheets(sheetName).Range("A" & Rows.count).End(xlUp).row
lRow = lastRow + 1
End Sub
注意:强> 命令按钮的click事件只是调用执行实际工作的sub。使用子ClearData可以明显看出这一点。它在表单激活时调用,并在更新后再次调用,以及单击cmdClear按钮。因此,不是将其写入三次并且必须更新它或在更改时更正它,而是在一个地方进行更新,并且您从多个来源调用它。
<强>加成:强> 如果您选择浏览所有记录,则可以使用下一个子目录。为此,您将有一个Prev,Next,First,Last,New等按钮,然后每个按钮适当降低或提高lRow值并调用GetData。
Here is a link to an answer I provided that does exactly that,变量名称与此略有不同,但功能很明确。
我包括它,因为它显示如何使用工作表中的数据填充UserForm。
Private Sub GetData()
'If you get a navigating control for your row source, you can use a GetData sub
'To bring data from your sheet to the User Form.
'Changing lRow changes the Sheets Row Source. Call GetData to refresh the Form.
txtDate.Text = Sheets(sheetName).Cells(lRow, 1)
txtValue.Text = Sheets(sheetName).Cells(lRow, 13)
End Sub
另外:由于我在代码保护工作表中看不到任何内容,因此我不包括对其进行取消保护,以免混淆未来的读者。这只是提供了一个如何在UserForms和Worksheets之间移动数据的工作示例。