VBA - 运行时错误 1004 '应用程序定义或对象定义错误'
VBA - 运行时错误 1004 '应用程序定义或对象定义错误'
我有一个Excel文档,第一次运行时会将一个模板工作表复制到一个新工作表中。按照此模板创建的其他工作表将追加到新创建的工作表中。
我在下面这段代码的标题处遇到了错误:
If Worksheets("User Configuration").Cells(9, 15).Value = 1 Then Worksheets("Cable Cards Template").Range("A1:J33").Copy With Worksheets("Cable Cards") **.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues** .Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlFormats End With Worksheets("Cable Cards Template").Shapes("Picture 1").Copy Worksheets("Cable Cards").Paste Cells(RangeStartRow, RangeStartColumn) Call Sheets.FormatCableCardRows End If
基本上,如果If
语句为真(单元格= 1),那么应将特定工作表上的范围复制并粘贴到给定范围的新工作表中,使用PasteSpecial
来处理值和格式。在此之后,将会复制一个图像到模板的左上角单元格,然后调用一个子程序来格式化新工作表的行。
我在With Worksheets("Cable Cards")
语句之后的第一个.Range
调用处遇到了错误。我尝试过不使用With
语句,直接复制值而不是特殊粘贴等。奇怪的是,在第一次运行时,通过以下方式创建新工作表时,它可以运行:
If (RangeStartRow = 1) Then Worksheets.Add().Name = "Cable Cards" ' 仅在第一个电缆卡上创建具有给定名称的新工作表 Columns(1).ColumnWidth = 9.43 Columns(6).ColumnWidth = 11 Columns(10).ColumnWidth = 9 Call FormatForA5Printing("Cable Cards", 71) End If
但是在第二次运行时,它完全失败,并显示“运行时错误1004 '应用程序定义或对象定义错误'”。我将非常感谢任何帮助。
VBA - 运行时错误1004 '应用程序定义或对象定义错误'
在VBA中,当我们尝试给一个以“=”开头的值赋值时,会启动公式的计算过程,而这在某些情况下会引发上述错误1004。在我的情况下,通过在值前加一个空格就解决了这个问题。
出现此问题的原因是,VBA将以“=”开头的值视为一个公式,而不是普通的字符串或数值。由于公式的计算可能涉及到其他单元格或变量,因此可能会出现应用程序定义或对象定义错误。这个错误通常是由于公式中引用的单元格或变量存在问题而导致的。
解决此问题的方法是在赋值操作之前在值前加一个空格。这样做可以将以“=”开头的值视为纯文本或数字,而不会触发公式计算。通过这种方式,我们可以避免触发错误1004,并成功将值赋给相应的变量或单元格。
以下是一个示例代码,展示了如何使用空格来解决此问题:
Sub AssignValue() Dim value As String '使用空格来赋值,避免触发公式计算 value = " =Hello World" '将值赋给单元格 Range("A1").Value = value End Sub
在上述示例中,我们在赋值操作中的值前加了一个空格,这样就可以成功将值赋给单元格A1,而不会触发公式计算。
总结起来,当在VBA中尝试给一个以“=”开头的值赋值时,可能会引发运行时错误1004 '应用程序定义或对象定义错误'。解决这个问题的方法是在赋值操作之前在值前加一个空格,将其视为纯文本或数字,而不触发公式计算。这样我们就可以避免该错误并成功赋值。
VBA - 运行时错误1004 '应用程序定义或对象定义的错误'的解决方法
解决方法1:
你的语句
.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
没有引用正确的范围进行操作。相反,
.Range(.Cells(RangeStartRow, RangeStartColumn), .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
是正确的(在某些情况下也是如此)。
解决方法2:
在使用它的单元格之前,激活Worksheets("Cable Cards")。
解释:
Cells(RangeStartRow, RangeStartColumn)(例如)给出了一个范围,这本来是可以的,这就是为什么你经常看到Cells以这种方式使用。但是由于它没有应用于特定的对象,它应用于ActiveSheet。因此,你的代码尝试使用.Range(rng1, rng2),其中.Range是一个Worksheet对象的方法,而rng1和rng2在不同的Worksheet中。
有两个检查可以使这一点非常明显:
1.在执行Sub之前激活Worksheets("Cable Cards"),它将开始工作(现在你有正确的引用范围)。对于你发布的代码,将.Activate添加到With...之后确实是一种解决方法,尽管在引用另一个Worksheet中的Range时,你可能在代码的其他地方遇到类似的问题。
2.在除Worksheets("Cable Cards")之外的工作表处于活动状态时,在抛出错误的行上设置断点,启动你的Sub,并在执行中断时在立即窗口中写入以下内容:
Debug.Print Cells(RangeStartRow, RangeStartColumn).Address(external:=True)
Debug.Print .Cells(RangeStartRow, RangeStartColumn).Address(external:=True)
并查看不同的结果。
结论:
在没有指定对象(例如Worksheet或Range)的情况下使用Cells或Range可能是危险的,特别是在使用多个Sheet时,除非对活动Sheet非常确定。
VBA - 运行时错误1004 '应用程序定义或对象定义错误'的出现原因以及解决方法
在VBA中,当出现运行时错误1004 '应用程序定义或对象定义错误'时,通常是因为没有完全限定(cells object)单元格对象。解决方法是在单元格对象之前添加一个“点”符号。
例如:
With Worksheets("Cable Cards") .Range(.Cells(RangeStartRow, RangeStartColumn), _ .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues
同样地,需要完全限定所有的Cells对象。
感谢这个解决方法,否则我可能永远也不会发现这个错误!
+1 这很令人惊讶,有多少次错误是因为没有适当地限定范围。