【发布时间】: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