Excel 2010 VBA删除图表。

3
我在业余时间支持一个Excel VBA应用程序。我是制造工艺工程师,而不是专业开发人员。
该应用程序的图表部分在Excel 2007中没有问题。我的公司正在升级到Excel 2010,但同样的应用程序现在在与工作表上的图表交互方面存在问题。
这个问题出现在条形图上。当应用程序重置时,使用下面的代码从图表中删除系列。我这样做是为了在导入/处理新数据时,不会出现向用户呈现不符合最新数据的图表的情况。
        'select the histogram chart
        Sheets(sChartSheet).Select
        ActiveSheet.ChartObjects("Chart 15").Activate

        Call PBarCaption("Delete Existing Histogram Series")
        'remove any existing series
        For i = 1 To ActiveChart.SeriesCollection.Count
            ActiveChart.SeriesCollection(1).Delete
        Next i

然后,当需要从外部数据文件导入新数据进行绘制时,创建新系列作为新数据。

    'add series for histogram
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).Values = "=HistogramData!$B$5:$B$29"
    ActiveChart.SeriesCollection(1).XValues = "=HistogramData!$A$5:$A$29"
    ActiveChart.SeriesCollection(1).charttype = xlColumnClustered

2010的问题在于,有时候运行VBA代码时,整个柱状图会被“丢失”(删除),而不是显示没有定义系列的图表。
当通过另一段自动创建一系列图表并将它们复制到PowerPoint的VBA代码执行基本代码的连续执行时,“丢失”的图表似乎会发生。
手动执行图表序列时,没有问题。但是在自动生成第二个图表序列时运行时,图表会被删除。
我希望有人熟悉从Excel 2007到2010版本的图表变化,并能够提供帮助。
谢谢,
Len

你能确认图表是否被删除了,还是说它们只是隐藏了吗?当前工作表的ChartObjects集合长度确实减少了吗?我们将已有的包含图表操作代码的Excel 2003工作簿升级到Excel 2007后,发现我们的代码有时会导致图表从视图中消失,但它们仍然存在于后台。如果它们仍在后台,这听起来可能很奇怪,但如果你去控制面板并停止、然后重新启动名为“打印池”的服务,它们可能会重新出现。 - Michael Kingsmill
我们发现解决这个问题的最佳方法是编写代码,从头开始删除并重新创建所有图表,以全新的2010年版本图表来消除Excel 2003版本中的任何潜在“损坏”。 - Michael Kingsmill
迈克尔,谢谢。我希望下周有时间继续处理这个问题。由于在2010年的宏录制过程中暴露了图表对象,我可能会这样做,每次删除整个图表并从头开始重新创建,以便能够完全控制。我最初想在迁移到2007版本时这样做,但是图表对象发生了变化,并且由于宏录制中未公开对象模型,这有点难以实现。我会在取得进展时发布更新。 - NitroLen
2个回答

2

重新编写代码,不要激活/选择并依赖于“活动”对象不改变:如果在您不希望的情况下,其他代码激活了其他对象,则可能会导致代码崩溃。

Dim cht As Chart

Set cht = ActiveWorkbook.Sheets(sChartSheet).ChartObjects("Chart 15").Chart
Do While cht.SeriesCollection.Count > 0
    cht.SeriesCollection(1).Delete
Loop

With cht.SeriesCollection
    .NewSeries
    With .Item(1)
        .Values = "=HistogramData!$B$5:$B$29"
        .XValues = "=HistogramData!$A$5:$A$29"
        .ChartType = xlColumnClustered
    End With
End With

这绝对是更好的设计,例如选择隐藏工作表上的图表将会引发运行时异常,因此最好永远不要选择工作表对象。此外,关闭屏幕更新,可以帮助您减少屏幕闪烁。然而,这并不能解决您的问题。 - Michael Kingsmill
一个好的最佳实践。我会这样做的。我确实尽量减少直接使用选定对象,但它是有效的,屏幕更新已关闭,所以转而处理其他任务! - NitroLen

0

我重新格式化了所有与图表的交互,改为使用“with”而不是选择。这是更好的编程方式。

不幸的是,这并没有解决问题。

有关打印池的评论很有帮助,看起来问题与图表在屏幕上和打印机的交互方式有关。

参考

由于我的组织中有许多其他用户使用不同的打印机,当尝试将MS Office打印驱动程序设置为默认选项时,没有改善结果,必须找到另一种解决方案。

问题出现在使用VBA代码将工作表元素复制到PowerPoint时。正在使用复印机、位图进行复制:

rSlideArea.CopyPicture (2)  

已更改为使用屏幕位图进行复制:

rSlideArea.CopyPicture Appearance:=xlScreen, Format:=xlBitmap

有趣的是,使用位图格式生成的PowerPoint文件更易于处理且更小。

结果是,PowerPoint中的图片在屏幕格式下不太“漂亮”,但应用程序现在可以在Excel v2010中运行,这是当务之急。

感谢所有提供帮助的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接