VBA - 运行时错误 1004 '应用程序定义或对象定义错误'

16 浏览
0 Comments

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 '应用程序定义或对象定义错误'”。我将非常感谢任何帮助。

0
0 Comments

VBA - 运行时错误1004 '应用程序定义或对象定义错误'

在VBA中,当我们尝试给一个以“=”开头的值赋值时,会启动公式的计算过程,而这在某些情况下会引发上述错误1004。在我的情况下,通过在值前加一个空格就解决了这个问题。

出现此问题的原因是,VBA将以“=”开头的值视为一个公式,而不是普通的字符串或数值。由于公式的计算可能涉及到其他单元格或变量,因此可能会出现应用程序定义或对象定义错误。这个错误通常是由于公式中引用的单元格或变量存在问题而导致的。

解决此问题的方法是在赋值操作之前在值前加一个空格。这样做可以将以“=”开头的值视为纯文本或数字,而不会触发公式计算。通过这种方式,我们可以避免触发错误1004,并成功将值赋给相应的变量或单元格。

以下是一个示例代码,展示了如何使用空格来解决此问题:

Sub AssignValue()
    Dim value As String
    
    '使用空格来赋值,避免触发公式计算
    value = " =Hello World"
    
    '将值赋给单元格
    Range("A1").Value = value
End Sub

在上述示例中,我们在赋值操作中的值前加了一个空格,这样就可以成功将值赋给单元格A1,而不会触发公式计算。

总结起来,当在VBA中尝试给一个以“=”开头的值赋值时,可能会引发运行时错误1004 '应用程序定义或对象定义错误'。解决这个问题的方法是在赋值操作之前在值前加一个空格,将其视为纯文本或数字,而不触发公式计算。这样我们就可以避免该错误并成功赋值。

0
0 Comments

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非常确定。

0
0 Comments

VBA - 运行时错误1004 '应用程序定义或对象定义错误'的出现原因以及解决方法

在VBA中,当出现运行时错误1004 '应用程序定义或对象定义错误'时,通常是因为没有完全限定(cells object)单元格对象。解决方法是在单元格对象之前添加一个“点”符号。

例如:

With Worksheets("Cable Cards")
    .Range(.Cells(RangeStartRow, RangeStartColumn), _
           .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

同样地,需要完全限定所有的Cells对象。

感谢这个解决方法,否则我可能永远也不会发现这个错误!

+1 这很令人惊讶,有多少次错误是因为没有适当地限定范围。

0