运行时错误“1004”:应用程序定义的错误代码或对象定义的错误代码在我运行的每个时间都有效

时间:2015-01-05 03:55:12

标签: excel vba

关于这个话题的很多帖子之一,很可能回答了我的问题,但是我太新了,不能认识到它。以下代码从用户表单获取输入并发布到表中的下一行。它每隔一次使用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,我正在尝试从输入表单添加下一行数据。 我在第一次通过时工作,并在第二次通过时生成错误。我单击结束错误消息,然后再次运行正常下一条记录。 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

查看此代码,看看您是否可以根据自己的情况进行调整。

会发生什么:

  • UserForm激活,并设置了sheetName,并调用了子ClearData。

  • 单击“更新”按钮时,将调用子PutData。

  • PutData只是根据地址将UserForm控件(文本框,列表框,组合框,复选框等)中的数据放入工作表中。

  • ClearData重置UserForm以使用TextBox日期中的新日期清除。

  • 如果你想构建一个导航器来移动整个记录,这是另一个故事,但如果你这样做,GetData子将与PutData完全相反。我将包含GetData的示例,但为了简洁起见,不添加导航控件。

结果是,您在点击"更新"然后使用新日期重置后,将值从用户表单传输到工作表的新行。

Screenshot

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之间移动数据的工作示例。