首页 文章

在Excel 2013中,VBA删除图表对象的重复副本失败

提问于
浏览
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 .

我很沮丧地被困住了 . 任何线索?

2 回答

  • 0

    如果这样的话

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

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

  • 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 . 我可以删除此Shape,但不能删除Chart本身或ChartObject . Excel 2010将允许,但不允许Excel 2013 .

    我仍然不明白原因,但至少我有一些有用的东西(直到下一次excel更新可能......) .

相关问题