1

我有一个 VBA 代码,旨在将范围的内容复制到图表中,以便能够将其导出到 PNG 文件(+使用外部命令进行一些后处理)。以下是相关部分:

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 过程只是从另一个工作表中收集一些参数来定义:

  • “MiseEnPage”:对我要复制的范围所在的工作表对象的引用,
  • “ZoneImage”设置为“B4:F11”字符串(指范围地址),
  • “ObjetGraphique”是对“MiseEnPage”表内的 ChartObject 的引用。这个 ChartObject 是一个空容器(我主要是用它来轻松设置宽度和高度)。
  • “CheminImage”是一个字符串,包含磁盘上图片文件名的路径。

这段代码曾经在 Excel 2010 中完美运行。现在我的公司已经部署了 Excel 2013,我的代码现在.Delete在线失败,将 ChartObject 的副本(其中粘贴了范围图片)留在工作表上并停止宏执行。

我曾尝试先激活工作表,在删除它和其他内容之前选择重复项,但无济于事。在调试器中跟踪执行时,它在删除行上阻塞并出现错误 1004。

我沮丧地卡住了。有什么线索吗?

4

2 回答 2

0

如果这有效

 With ObjetGraphique.Duplicate
    .Chart.Paste
    .Chart.Export Filename:=CheminImage, Filtername:="PNG"
    .Select
End With
Selection.Delete

我们必须假设 With 持有引用并阻止删除,或者选择对象调用的删除例程与 ObjetGraphique.Duplicate.delete 调用的删除例程不同,或者这是一个微妙的计时错误,并且检索所选对象所需的额外时间足以修复它。

于 2017-11-16T12:58:20.417 回答
0

好吧,在摆弄了很多对象模型之后,这是我最终解决方案的(相关部分)。非常感谢 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 。我可以删除此形状,但不能删除图表本身或 ChartObject。Excel 2010 允许这样做,但 Excel 2013 不允许。

I still do not understand the reasons, but at least I have something that works (until the next excel update probably...).

于 2017-11-16T15:45:40.893 回答