【问题标题】:Run-time error '1004' when creating macro to delete shape创建宏以删除形状时出现运行时错误“1004”
【发布时间】:2019-06-19 16:37:26
【问题描述】:

我所做的是创建一个宏,如果存在图像Range("D199:U205",则删除特定单元格范围内的任何图像,然后在工作表底部复制一个名为“JB Sig”的图像,并将其粘贴到工作表中现在的空白位置。

我在使用宏时收到“运行时错误'1004':应用程序定义或对象定义错误”。当这个错误发生并且我调试时,导致问题的行是If Not Intersect(Range("D199:U205"), Range(Pic.TopLeftCell, Pic.BottomRightCell)) Is Nothing Then Pic.Delete

我已经在网上给出的示例中以多种方式重写了这个,但错误仍然给我带来了问题。奇怪的是,有时我得到错误,有时我没有,甚至 VBA 代码中的最小外观变化可以修复它(暂时)。所以目前宏在我的电脑上运行良好。但是,正在访问同一文件(在不同办公室)的我的同事仍然遇到运行时错误。

我对代码非常缺乏经验,我编写的任何 VBA 通常都是从某个地方复制和粘贴的,而不是让我了解自己在做什么。所以请耐心等待我的愚蠢。谢谢

我已经尝试通过删除我必须查看它的密码来解除对 VBAProject 的保护。这没有用。我尝试将用于删除图像的代码更改为在线各种不同的建议,但有时我仍然遇到相同的错误。似乎有许多不同的方法可以让代码工作,但它们都容易受到运行时错误的影响。

Sub Approval_JB()
'
' Approval_JB Macro
'

'
    Dim ws As Worksheet
    Set ws = Sheets("Issue Letters")
    ws.Unprotect Password:="john123"
    Dim Pic As Object
    For Each Pic In ws.Shapes
    Dim R As Range
    Debug.Print Pic.Name
    Debug.Print Pic.TopLeftCell.Address
    Debug.Print Pic.BottomRightCell.Address
    Set R = Range(Pic.TopLeftCell, Pic.BottomRightCell)
    If Not Intersect(Range("D199:U205"), R) Is Nothing Then Pic.Delete
    Next Pic
    Range("D199:U205").ClearContents
    ws.Shapes.Range(Array("JB Sig")).Select
    Selection.Copy
    ws.Range("D201").Select
    With ws.Range("D199")
    .Value = "Yours Faithfully"
    End With
    With ws.Range("D204")
    .Value = "Joe Bloggs"
    End With
    With ws.Range("D205")
    .Value = "Engineer"
    End With
    Range("B192").Select
    ws.Protect Password:="john123"
End Sub

它有时会起作用,如上所述。但是其他时候,当我运行宏时,会出现此错误。

运行时错误“1004”:应用程序定义或对象定义错误

【问题讨论】:

  • 我注意到您使用的是 FormulaR1C1,并且您没有在其中添加公式。您可能应该使用.Value 也使用.Select 被认为是不好的做法。 How to avoid using Select in Excel VBA
  • 一种调试思路是声明一个范围变量R,并将问题行分成两行:Set R = Range(Pic.TopLeftCell, Pic.BottomRightCell),后跟If Not Intersect(Range("D199:U205"), R) Is Nothing Then Pic.Delete。这不会解决问题,但应该有助于集中调试工作。
  • “不良做法”等甚至没有让我感到惊讶,我不知道自己在做什么。我可以厚颜无耻地问如果你这样做,你将如何重写上面的代码?鉴于您的有用链接,我想我知道如何使用 .value 函数。但是,我不确定如何在不使用 .Select 的情况下复制和粘贴图像。任何帮助表示赞赏。
  • 我建议您使用对形状所在工作表的显式引用,而不是 Activesheet
  • 谢谢,使用显式引用有望有所作为

标签: excel vba excel-2013


【解决方案1】:

只有错误 1004 并不意味着某些特定错误,但我的猜测是在这种情况下出现错误是因为 Range(Pic.TopLeftCell, Pic.BottomRightCell)

试试这个:Range(Pic.TopLeftCell.Address & ":" & Pic.BottomRightCell.Address)

【讨论】:

  • “我的猜测”建议这应该是评论而不是答案
  • Range(Pic.TopLeftCell, Pic.BottomRightCell) 本身就可以完美运行。无需将 Range 转换为字符串(通过Address-method)并让 VBA 将其转换回来。
  • @JohnColeman 为什么这个答案不是一个问题的正确解决方案?
  • 你有“猜测”和“尝试”这两个词。适当的解决方案应该诊断问题并使用经过测试的代码修复特定诊断。你提出了一个建议,一个(正如@FunThomas 指出的那样)不会有所作为。
  • 感谢先生们的贡献。所以,FunThomas 我说你不认为这实际上是一个解决方案是正确的吗?我很难判断是否有任何东西可以立即工作,因为解决方案通常会在我再次开始收到 1004 错误之前工作一段时间:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多