Excel(2007)中的图表无法更新

20

我有一个包含图表(聚合柱状图)的Excel文档(2007),它取决于包含计算值的单元格的数据系列。

计算值从未直接更改,但只会因工作表中其他单元格的更改而更改。

当我更改工作表中的其他单元格时,数据系列单元格将重新计算,并显示新值 - 但基于此数据系列的图表拒绝自动更新。

我可以通过保存/关闭文件,切换其中一个设置(例如:反转x/y轴并再次设置回来),或重新选择数据系列来更新图表。

我在网上找到的每个解决方案都不起作用。

  • 是的,我已经将计算方式设置为自动
  • Ctrl+Alt+F9 可以很好地更新所有内容,除了图表
  • 我已经多次在不同的计算机上重新创建了图表
  • 我尝试过使用VBA脚本,例如:

    Application.Calculate
    Application.CalculateFull
    Application.CalculateFullRebuild
    ActiveWorkbook.RefreshAll
    DoEvents

这些都不能更新或刷新图表。

我注意到如果我覆盖数据系列,输入实际数字而不是计算值,它将更新图表-好像Excel不想识别计算中的更改。

有没有人遇到过这种情况?或者知道我该怎么解决这个问题吗?谢谢


你使用的是哪种类型的图表? - Stewbob
啊,是的,忘了提到了,它是一个集群柱形图。 - samJL
3
适合放在SuperUser上,与编程无关。 - Ken White
检查您的状态栏是否显示消息“计算”。请记得在回复评论时加上@用户名。 - Dr. belisarius
1
这是我几个月前在一篇帖子中描述的同一个问题吗?:MS Excel图表在数据更改时不会自动更新 - Adam
这个问题在5年前就被提出了,但在Excel 2016中仍未得到解决。难以置信。 - Kit Johnson
35个回答

15

这是我找到的唯一可以持续更新图表的方法。它解决了问题的根本原因(我猜测):图表中的系列数据被缓存了。通过强制图表重新评估系列,我们清除了缓存。

' Force the charts to update
Set sht = ActiveSheet
For Each co In sht.ChartObjects
    co.Activate
    For Each sc In ActiveChart.SeriesCollection
        sc.Select
        temp = sc.Formula
        sc.Formula = "=SERIES(,,1,1)"
        sc.Formula = temp
    Next sc
Next co

1
这对我有用!在尝试这个之前,我尝试了其他10种解决方案。 - user1283776
我发现你只需要“激活”每个图表,就足以“刷新”它 - 无需遍历每个图表的系列。 (我很清楚这个答案已经超过十年了,所以也许以前不是这样,但我只是想分享一下我现在看到的情况。) - TehDrunkSailor

4

在通过VBA生成1000多个图表时,我遇到了这个问题。我生成了图表并为它们的系列分配了一个范围。然而,当工作表重新计算时,图表不会更新,因为数据范围已更改。

解决方法 --> 在生成图表的 For...Next 循环之前关闭 WrapText,然后在循环结束后再打开它。

Workbooks(x).Worksheets(x).Cells.WrapText=False 

之后...

Workbooks(x).Worksheets(x).Cells.WrapText=True

这是一个很好的解决方案,因为它可以同时更新1000多个图表,而不需要逐个遍历并单独更改它们。

此外,我不太确定为什么它会起作用;我想当WrapText更改数据范围的一个属性时,它会使图表更新,尽管我没有相关文档。


4
我也遇到了同样的问题——不知道为什么。当出现这种情况时,我唯一能强制更新图表的方法是改变图表定义中的某些内容,可以通过 VBA 容易地完成,如下所示:
Dim C As ChartObject: Set C = Me.ChartObjects("chart name")
C.Chart.ChartTitle.Text = C.Chart.ChartTitle.Text + "1"

可能有更好的答案可以解决问题,但我认为这个可能会有所帮助。在处理工作表时,可以快速使用Ctrl-X、Ctrl-V对表格的一部分(或整个表格)进行复制和粘贴,以强制更新图表。


7
警惕使用 + 进行字符串拼接!应该使用 & - Jean-François Corbett

4
我曾经遇到过一个简单的饼图问题。我尝试了所有可用的宏,但都无法解决。对于剪切、粘贴和移动图表等操作都没有效果。我找到的解决方法是编辑图表文本,删除标签,然后重新选择标签。一旦它们重新出现,它们就会被更新。

这个修复方法对我有用,稍作修改即可。将“数据标签=无”设置为“数据标签=底部”。按照自己的喜好重新格式化。(Excel 2010) - DaveL17

3
这是一个荒谬的漏洞,严重影响我在Excel上的工作。
根据发布的解决方法,我得出以下行动方案作为最简单的前进方式...
点击要更新的图表 - 选择CTRL-X,CTRL-V剪切和粘贴图表...它将被强制更新。

2

这对我非常有效 - 它会翻转所有图表的轴,然后再翻转回来,从而使它们刷新而不改变任何内容。

'Refresh all charts
For Each mysheet In ActiveWorkbook.Sheets
    mysheet.Activate
    For Each mychart In ActiveSheet.ChartObjects
        mychart.Activate
        ActiveChart.PlotArea.Select
        ActiveChart.PlotBy = xlRows
        ActiveChart.PlotBy = xlColumns
        ActiveChart.PlotBy = xlRows
    Next
Next

2

我也遇到了同样的问题。这个问题是因为您的表格中计算公式的数量受限制。您可以使用两种方法解决它:

手动强制重新计算:

Press SHEFT + F9

强制重新计算的宏: 将以下代码添加到更改数据的函数末尾

Activesheet.Calculate

我找到了解决方法: 从Excel选项中确保更改如下的计算选项。在Excel中进行繁重工作后,有时会将其更改为手动模式。

Auto Calculation


我在Excel 2013中遇到了同样的问题,这个解决方案真的很有效。我不明白为什么这个设置会在几天前明明是“自动”的时候变成了“手动”。 - vladiz
如果工作表中有大量带有公式的数据,经常使用后通常会自动更改为手动计算模式。这似乎是Excel采取的一种预防措施,以避免崩溃。 - Ayman Al-Absi

2

我还有一个刷新图表的问题。在自动生成图表时,一些图表会出现并缓存工作表中的文本。这是刷新生成的图表的问题。当我放大或缩小时,就能获得预期的结果。因此,如果有人感兴趣,我在这里发布解决方案。

通过编程,在生成图表后添加以下内容:

ActiveWindow.Zoom = ActiveWindow.Zoom + 1
ActiveWindow.Zoom = ActiveWindow.Zoom - 1

2
我们找到了一种不涉及VBA的解决方案:将图表数据范围中的某个元素乘以TODAY()-TODAY()+1
即使没有这个操作,该范围也会重新计算,但是TODAY()的易变性在某种程度上给它带来了额外的推动力,从而触发了图表的重新计算。

这当然是一个可怕的hack。但在我的情况下它确实起作用(第二次计算通过,出于某种原因);我使用了& T(NOW()),但原理相同。显然,如果有很多计算依赖于您现在超级易变的单元格,那么这将是一个可怕的想法,但会产生一个xlsx,可以发送给那些对xlsm感到困惑的人,并且仍将具有正确的数据。 - tobriand

2

好的,我有一个解决方案...

我发现我的图表不更新的问题是在我隐藏了一些数据列并在图表的“选择数据源”消息框中选中“显示行和列中隐藏的数据”后不久首次出现的。

我发现如果我回到“选择数据源”消息框中取消选中/重新选中“显示行和列中隐藏的数据”,图表就会刷新。

编程方面,我将以下代码插入到一个宏中,然后将该宏链接到一个按钮上,它可以快速刷新所有图表,以解决已知的错误。这段代码假定每个工作表只有一个图表,但是如果需要,可以添加另一个用于图表1到N的语句:

Sub RefreshCharts()

    Application.ScreenUpdating = False

For I = 1 To ActiveWorkbook.Worksheets.Count

Worksheets(I).Activate

    ActiveSheet.ChartObjects("Chart 1").Activate

    ActiveChart.PlotVisibleOnly = True

    ActiveChart.PlotVisibleOnly = False

Next I

    Application.ScreenUpdating = True

End Sub

简直不敢相信..我一直在为一个应用程序苦苦挣扎(真的!),其中我正在获取股票价格并将它们推入图表(使用VBA中的数组,因此没有工作表内的范围)。当从一个图表类型(线条,charttype = 51)更改为另一个图表类型(股票图表,charttype = 89)时,股票图表系列将无法显示。我可以通过选择“选择数据”并简单地双击数据系列来手动强制它们显示,之后所有数据都会变得可见。在此之前,甚至访问VBA中的xvalues也指出了一个空系列。plotvisibleonly=true/false 解决了这个问题! - Chri.s

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