运行时错误“1004”:应用程序定义或对象定义的错误代码每隔一段时间运行一次

Run-time error '1004': Application-defined or object-defined error code works every other time I run

关于此主题的众多 post 之一,很可能回答了我的问题,但我对此太陌生了,无法识别它。以下代码从用户表单和 post 获取输入到 table 中的下一行。每次使用 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,我正在尝试从输入表单添加下一行数据。 我在第一次通过时很流畅,在第二次通过时产生错误。我在错误消息上单击结束,然后再次正常运行下一条记录。 非常感谢任何帮助。

看看这段代码,看看你是否能适应你的情况。

发生了什么:

  • 激活用户窗体,设置 sheet名称,调用子 ClearData。

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

  • PutData 只是根据地址将用户窗体控件(文本框、列表框、组合框、复选框等)中的数据放入 sheet。

  • ClearData 将用户窗体重置为清除,并在日期文本框中使用新日期。

  • 如果您想构建一个导航器以在整个记录中移动,那就是另一回事了,但是如果您这样做了,GetData sub 将执行与 PutData 完全相反的操作。我将包括一个 GetData 的示例,但为了简洁起见不添加导航控件。

结果是您将在单击 "Update" 后将用户表单中的值传输到作品的新行sheet,然后使用新日期重置。

订阅者: 包含在示例中

 - UserForm_Activate  
 - cmdUpdate_click  
 - cmdClear_Click  
 - PutData  
 - ClearData  
 - GetData   (Bonus)

此代码放置在用户窗体的代码中,在 Activation 上方声明变量使这些变量的作用域成为整个用户窗体,并可供其上的每个子窗体使用。

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

注: 命令按钮的单击事件只是调用执行实际工作的子程序。其原因在子 ClearData 中很明显。它在表单激活时调用,更新后再次调用,以及单击 cmdClear 按钮时调用。因此,无需将它写三遍并在更改时更新或更正它,它都在一个地方,您可以从多个来源调用它。

奖金: 如果您选择浏览所有记录,那么下一个子项只是您可能想要使用的额外项。为此,您将有一个用于 Prev、Next、First、Last、New 等的按钮,然后每个按钮适当地降低或提高 lRow 值并调用 GetData。

Here is a link to an answer I provided that does exactly that,变量名和这个略有不同,但是功能很清楚。

我将它包括在内是因为它展示了如何使用作品中的数据填充用户窗体sheet。

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

另外: 因为我在你的代码保护工作中没有看到任何东西sheet,我没有包括 un-protecting 它们以避免混淆未来的读者。这只是提供了一个工作示例,说明如何将数据移入和移出 UserForms 和 Worksheets.