VBA 删除图表对象的重复副本在 Excel 2013 年失败
VBA deleting a duplicate copy of chart object fails in Excel 2013
我有一个 VBA 代码,用于将范围的内容复制到图表中,以便能够将其导出到 PNG 文件(+一些 post-使用外部命令)。这是相关部分:
Sub GenererImage() ' Entry point
getparams ' Collect parameters and define global variables
MiseEnPage.Range(ZoneImage).CopyPicture Appearance:=xlScreen,Format:=xlPicture
Application.DisplayAlerts = False
With ObjetGraphique.Duplicate
.Chart.Paste
.Chart.Export Filename:=CheminImage, Filtername:="PNG"
.Select
.Delete
End With
Application.DisplayAlerts = True
End Sub
里面调用的getparams过程只是从另一个worksheet收集一些参数来定义:
- "MiseEnPage":引用我要复制的范围所在的worksheet对象,
- "ZoneImage"设置为"B4:F11"字符串(指范围地址),
- "ObjetGraphique" 是对 "MiseEnPage" sheet 中的 ChartObject 的引用。这个ChartObject是一个空容器(我主要是用来方便设置宽高的)
- "CheminImage" 是包含磁盘上图片文件名路径的字符串。
此代码在 Excel 2010 中完美运行。现在我的公司已部署 Excel 2013,我的代码现在在 .Delete
行失败,留下 ChartObject 的副本(其中粘贴了范围图片)在 sheet 上并停止宏执行。
我试过先激活作品sheet,在删除之前选择副本和其他东西,但无济于事。在调试器中跟踪执行时,它在删除行上阻塞并出现错误 1004。
我很沮丧地卡住了。有什么线索吗?
如果可行
With ObjetGraphique.Duplicate
.Chart.Paste
.Chart.Export Filename:=CheminImage, Filtername:="PNG"
.Select
End With
Selection.Delete
我们必须假设 With 持有引用并阻止删除,或者选择对象调用的删除例程与 ObjetGraphique.Duplicate.delete 调用的删除例程不同,或者它是一个微妙的计时错误,并且检索所选对象所需的额外时间足以修复它。
OK 在摆弄了很多对象模型之后,这是我最终解决方案的(相关部分)。非常感谢 HarassedDad 提供的线索。
Sub GenererImage() ' Point d'entrée
getparams
MiseEnPage.Range(ZoneImage).CopyPicture Appearance:=xlScreen, Format:=xlPicture
Application.DisplayAlerts = False
With ObjetGraphique
.Chart.Paste
.Chart.Export filename:=CheminImage, Filtername:="PNG"
.Chart.Shapes(1).Delete
End With
Application.DisplayAlerts = True
End Sub
似乎 发生的是 Chart 对象的 .Paste 方法在该对象的 .Shapes 集合中创建了一个 Shape。我可以删除此形状,但不能删除图表本身或图表对象。 Excel 2010 年允许,但 Excel 2013 年不允许。
我仍然不明白其中的原因,但至少我有一些有用的东西(直到下一次 excel 更新可能...)。
我有一个 VBA 代码,用于将范围的内容复制到图表中,以便能够将其导出到 PNG 文件(+一些 post-使用外部命令)。这是相关部分:
Sub GenererImage() ' Entry point
getparams ' Collect parameters and define global variables
MiseEnPage.Range(ZoneImage).CopyPicture Appearance:=xlScreen,Format:=xlPicture
Application.DisplayAlerts = False
With ObjetGraphique.Duplicate
.Chart.Paste
.Chart.Export Filename:=CheminImage, Filtername:="PNG"
.Select
.Delete
End With
Application.DisplayAlerts = True
End Sub
里面调用的getparams过程只是从另一个worksheet收集一些参数来定义:
- "MiseEnPage":引用我要复制的范围所在的worksheet对象,
- "ZoneImage"设置为"B4:F11"字符串(指范围地址),
- "ObjetGraphique" 是对 "MiseEnPage" sheet 中的 ChartObject 的引用。这个ChartObject是一个空容器(我主要是用来方便设置宽高的)
- "CheminImage" 是包含磁盘上图片文件名路径的字符串。
此代码在 Excel 2010 中完美运行。现在我的公司已部署 Excel 2013,我的代码现在在 .Delete
行失败,留下 ChartObject 的副本(其中粘贴了范围图片)在 sheet 上并停止宏执行。
我试过先激活作品sheet,在删除之前选择副本和其他东西,但无济于事。在调试器中跟踪执行时,它在删除行上阻塞并出现错误 1004。
我很沮丧地卡住了。有什么线索吗?
如果可行
With ObjetGraphique.Duplicate
.Chart.Paste
.Chart.Export Filename:=CheminImage, Filtername:="PNG"
.Select
End With
Selection.Delete
我们必须假设 With 持有引用并阻止删除,或者选择对象调用的删除例程与 ObjetGraphique.Duplicate.delete 调用的删除例程不同,或者它是一个微妙的计时错误,并且检索所选对象所需的额外时间足以修复它。
OK 在摆弄了很多对象模型之后,这是我最终解决方案的(相关部分)。非常感谢 HarassedDad 提供的线索。
Sub GenererImage() ' Point d'entrée
getparams
MiseEnPage.Range(ZoneImage).CopyPicture Appearance:=xlScreen, Format:=xlPicture
Application.DisplayAlerts = False
With ObjetGraphique
.Chart.Paste
.Chart.Export filename:=CheminImage, Filtername:="PNG"
.Chart.Shapes(1).Delete
End With
Application.DisplayAlerts = True
End Sub
似乎 发生的是 Chart 对象的 .Paste 方法在该对象的 .Shapes 集合中创建了一个 Shape。我可以删除此形状,但不能删除图表本身或图表对象。 Excel 2010 年允许,但 Excel 2013 年不允许。
我仍然不明白其中的原因,但至少我有一些有用的东西(直到下一次 excel 更新可能...)。