Excel 运行时错误';1004';:每隔运行一次,应用程序定义或对象定义的错误代码就会起作用
关于这个话题的众多帖子中,有一篇很可能回答了我的问题,但我对这一点太陌生了,无法认识到这一点。下面的代码从用户表单获取输入,并发布到表中的下一行。每隔使用btsubmit按钮一次,它就会工作。导致运行时错误的代码行是wirelistrow.Range(1,13)。Value=“123” 表是A3到M6300,我正在尝试从输入表单添加下一行数据。 我在第一个过程中工作得很顺利,在第二个过程中产生错误。我在错误消息上单击“结束”,并再次为下一条记录正常运行。Excel 运行时错误';1004';:每隔运行一次,应用程序定义或对象定义的错误代码就会起作用,excel,vba,Excel,Vba,关于这个话题的众多帖子中,有一篇很可能回答了我的问题,但我对这一点太陌生了,无法认识到这一点。下面的代码从用户表单获取输入,并发布到表中的下一行。每隔使用btsubmit按钮一次,它就会工作。导致运行时错误的代码行是wirelistrow.Range(1,13)。Value=“123” 表是A3到M6300,我正在尝试从输入表单添加下一行数据。 我在第一个过程中工作得很顺利,在第二个过程中产生错误。我在错误消息上单击“结束”,并再次为下一条记录正常运行。 非常感谢您的帮助。请查看此代码,看看是否
非常感谢您的帮助。请查看此代码,看看是否可以根据您的情况对其进行调整 发生了什么:
- 用户表单被激活,sheetName被设置,子ClearData被调用
- 单击“更新”按钮时,将调用子PutData
- PutData只是根据地址将来自UserForm控件(文本框、列表框、组合框、复选框等)的数据放入一个工作表中
- ClearData使用日期文本框中的新日期将UserForm重置为clear
- 如果您想构建一个导航器在记录中移动,那是另一回事,但是如果您这样做了,GetData子函数将与PutData完全相反。我将包括一个GetData示例,但为了简洁起见,不添加导航控件
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
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。这种情况的原因在sub-ClearData中很明显。它在表单激活时调用,在更新以及单击cmdClear按钮后再次调用。因此,与其写三次,并在它发生变化时更新或更正它,不如把它放在一个地方,然后从多个来源调用它
奖金:
如果您选择在所有记录中导航,那么您可能希望使用下一个子项。要做到这一点,您将有一个按钮用于Prev、Next、First、Last、New等,然后每个按钮适当地降低或提高lRow值,并调用GetData
,变量名与此略有不同,但功能是明确的
我之所以包括它,是因为它显示了如何使用工作表中的数据填充用户表单。
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
另外:因为我在您的代码保护工作表中没有看到任何内容,所以我不包括取消对它们的保护,以避免让未来的读者感到困惑。这只是提供了一个如何在用户表单和工作表之间移动数据的工作示例。我想请您进行备份,并可能修改问题,以解释您希望将值保存在哪里。例如,文本框1到C列,等等。假设所有文本框都指向同一行。或者解释一下你想要完成什么。有时可能会有更好的方法,如果你清楚地知道你在大局中要做什么,而不仅仅是用当前的方法解决这个问题。如果这有意义的话。UserForm上有多少字段?它们的名称是什么?哪个列将保存每个值?从外观上看,您试图将一些数据放在“工作表(“数据库”)。单元格([newRow],13)”,可能还有A列中的日期?