遇到运行时错误“1004”:VBA中的应用程序定义或对象定义的错误

这个VBA代码循环,并复制并粘贴一个新行,直到它发现一个零不断给我一个运行时错误“1004”。 我无法弄清楚是什么原因造成的。 Sheets("Regular Invoice").Range("A29:N29").Copy (根据使用F8键)任何帮助,非常感谢。

 Sub BoxTest() Dim testRow As Integer Dim pasteRow As Integer testRow = 2 pasteRow = 30 Worksheets("Boxes").Select Do Until Worksheets("Boxes").Range(testRow, 13).Value = 0 Sheets("Regular Invoice").Range("A29:N29").Copy Worksheets("Regular Invoice").Cells(pasteRow, 1).PasteSpecial xlPasteAll testRow = testRow + 1 pasteRow = pasteRow + 1 Loop testRow = testRow + 1 pasteRow = pasteRow + 1 End Sub 

虽然@MutjayLee已经有了一个很好的答案,但我仍然想把这个额外的解决scheme放在考虑之中:

 Sub BoxTest() Dim testRow As Integer Dim pasteRow As Integer Dim lngLastRow As Long pasteRow = 30 With ThisWorkbook.Worksheets("Boxes") .Activate lngLastRow = .Cells(.Rows.Count, 13).End(xlUp).Row For testRow = 2 To lngLastRow If .Cells(testRow, 13).Value = 0 Then Exit For With ThisWorkbook.Sheets("Regular Invoice") .Range("A29:N29").Copy Destination:=.Cells(pasteRow, 1) End With pasteRow = pasteRow + 1 Next testRow End With 'Not really necessary 'testRow = testRow + 1 'pasteRow = pasteRow + 1 End Sub 

它避免了Do ... Loop并与For ... Next进行交换,如果符合条件,则可以select提前退出。 这些循环通常是首选的,因为它们是确定的,而不是像Do ... Loop那样不确定。 如果条件被错误地设置为Do ... Loop那么他们可以很容易地无限期地运行,并使您的Excel崩溃。

这条线是问题

 Do Until Worksheets("Boxes").Range(testRow, 13).Value = 0 

你也可以做

 Do Until Worksheets("Boxes").Cells(testRow, 13).Value = 0 

要么

 Do Until Worksheets("Boxes").Range("M" & testRow).Value = 0 

只有单元格将范围视为行号和列号。

范围只将数字作为行,并且列总是必须是字母