图表不会在Excel中更新(2007)

时间:2011-02-04 20:41:46

标签: excel vba excel-vba excel-2007

我有一个带有图表(Clustered Column)的Excel文档(2007),该图表从包含计算值的单元格中获取其数据系列

计算值不会直接更改,而只会因工作表中其他单元格的更改而改变

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

我可以通过保存/关闭或切换其中一个设置(例如,反转x / y轴然后将其放回)或重新选择数据系列来更新图表

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

  • 是我已将计算设置为 自动
  • Ctrl + Alt + F9更新一切正常,除了图表
  • 我已经多次重新创建了图表,并在不同的计算机上重建了
  • 我尝试过像以下的VBA脚本:

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

这些都不会更新或刷新图表

我注意到如果我输入我的数据系列,实际数字而不是计算,它将更新图表 - 就像Excel不想识别计算中的变化一样

以前有没有人经历过这个或知道我可以做些什么来解决这个问题? 谢谢

35 个答案:

答案 0 :(得分:12)

这是我发现不断更新图表的唯一方法。它减少了问题的根本原因(我假设):系列数据被缓存在图表中。通过强制图表重新评估系列,我们正在清除缓存。

' 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 :(得分: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来强制图表更新。

答案 2 :(得分:4)

通过VBA生成1000多张图表时出现此问题。我生成了图表并为他们的系列分配了一个范围。但是,当重新计算工作表时,图表不会随着数据范围更改值而更新。

解决方案 - >我在生成图形的For ... Next循环之前关闭了WrapText,然后在循环之后再次打开它。

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

之后...

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

这是一个很好的解决方案,因为它可以同时更新1000多个图形,而无需循环遍历所有图形并单独更改。

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

答案 3 :(得分:4)

我在简单的饼图上遇到了同样的问题。

我试过的宏没有工作。在cutpastingrelocating图表上没有任何效果。

我找到的解决方法是编辑图表文本,删除标签,然后重新选择标签。一旦他们重新出现,他们就会更新。

答案 4 :(得分:3)

这是一个荒谬的错误,严重妨碍了我使用Excel工作。

根据发布的工作原理,我采取了以下行动作为前进的简单方法......

单击要更新的图表 - 选择CTRL-X,CTRL-V将图表剪切并粘贴到位......将强制更新。

答案 5 :(得分: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

答案 6 :(得分:2)

我遇到了同样的问题。这个问题是由于没有限制。计算公式中的公式你可以用两种方法解决它:

手动重新计算:

Press SHEFT + F9

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

Activesheet.Calculate

我找到了它的解决方案: 从excel选项确保更改计算选项,如下所示。在excel繁重的工作之后,它有时变为手动。

Auto Calculation

答案 7 :(得分:2)

这是一个已知的Excel错误......

最好和最快的解决方法是Columns.AutoFit - 特技:

Sub Update_Charts()
    Application.ScreenUpdating = False
    Temp = ActiveCell.ColumnWidth
    ActiveCell.Columns.AutoFit
    ActiveCell.ColumnWidth = Temp
    Application.ScreenUpdating = True
End Sub

答案 8 :(得分:2)

我有另一个重新映射图表的问题。自动生成图表时,会显示一些图表并将文本缓存在工作表中。这恰好是刷新生成的图表的问题。当我放大或缩小时,我可以得到预期的结果。所以我在这里发布解决方案,如果它感兴趣的人。 以编程方式,我在生成图表后添加了这个:

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

答案 9 :(得分:1)

我遇到了这个问题,发现它是由于同时运行两个excel应用程序引起的。如果我关闭了所有内容并打开了文件,我就会遇到类似动态的图表问题。也许这有帮助

答案 10 :(得分:1)

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

我发现我的图表没有首先更新的问题是在我隐藏了一些数据列进入图表后不久发生的,并在图表的“选择数据源”信息框中选中了“隐藏在行和列中的数据”。

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

以编程方式我将以下内容插入到我链接了一个按钮的宏中,它会快速刷新我的所有图表,以便解决已知错误。此代码假定每个工作表有一个图表,但如果需要,可以添加另一个图表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

答案 11 :(得分:1)

这对我有用,它会在活动工作表上剪切并重新粘贴图表。我的基础是Jason的代码以及我在快速Google搜索中找到的blog post

Sub RepasteCharts()

Dim StrTemp As String
Dim IntTempTop As Integer
Dim IntTempLeft As Integer


Set sht = ActiveSheet

For Each co In sht.ChartObjects
    'Activate the chart
    co.Activate

    'Grab current position on worksheet
    IntTempTop = ActiveChart.Parent.Top
    IntTempLeft = ActiveChart.Parent.Left

    'Cut and paste
    ActiveChart.Parent.Cut
    ActiveSheet.Paste

    'Reposition to original position
    ActiveChart.Parent.Top = IntTempTop
    ActiveChart.Parent.Left = IntTempLeft
Next co


End Sub

答案 12 :(得分:1)

从Excel 2013开始,有Chart.Refreh方法(https://msdn.microsoft.com/de-de/library/office/ff198180.aspx)对我有用:

Dim cht As ChartObject
For Each cht In ThisWorkbook.ActiveSheet.ChartObjects
    cht.Chart.Refresh
Next cht    

答案 13 :(得分:1)

我们找到了一个不涉及VBA的解决方案:将图表数据范围的某些元素乘以TODAY()-TODAY()+1

即使范围是在没有这个的情况下重新计算,TODAY()的不稳定特性也会给它一个额外的提升,触发图表重新计算。

答案 14 :(得分:1)

这个问题太荒谬了!没有人的解决方案在2010年对我有用,但我的基础是tpascale:

Dim C As ChartObject
Set C = ActiveSheet.ChartObjects("CTR_Chart")
C.Chart.SetSourceData Source:=Range( _
    "KeywordBreakdown!$A$8:$A$12,KeywordBreakdown!$E$8:$E$12")

只需重新定义源数据范围。如果它是一个命名范围,可以想象可以合理清洁。我想这是最好的解决方案是继续尝试修改不同的图表属性,直到它刷新。

答案 15 :(得分:0)

图表不是"感觉"使用宏直接向源单元格插入值进行更改。您必须从图表单元格中发送值,然后使用此代码

工作表("工作表Sheet&#34)范围内。(" A1:K1")=工作表(" Sheet2的")范围(" A4:K4& #34;。)值

答案 16 :(得分:0)

我遇到了同样的问题,并且还发现只有在输入错误数据(字符而不是数字)时才会显示该行。这会导致显示该行,但更改回有效数据会导致它再次消失。

我发现如果我双击该行(出现错误的数据),它会显示它出于某种原因它在SECONDARY轴上。将其更改为PRIMARY轴解决了我的问题。

答案 17 :(得分:0)

在Excel 2013中,我遇到了相同的问题,但它似乎与我使用的某些(自制)加载项有关,这些加载项将一个选项卡添加到功能区。在“选项”>“加载项”>“转到:Exce-Add-Ins”>“ Add_Ins Box” 并重新启动Excel (!)后,将这些附件解钩,工作簿中的所有图表都会立即保持更新。但是,一旦我激活(挂接)这些加载项之一,就不会再更新任何图表。 其他加载项(例如Solver)不会出现此问题,因此我仍然必须找出它是由加载项在功能区中创建附加选项卡还是仅由.xlam的任何加载项引起的-输入。

只有借助以下变通方法代码,我才能说服图表完成其工作:

Dim chtChart As ChartObject

For Each chtChart In ActiveSheet.ChartObjects
   chtChart.Chart.ChartWizard
Next chtChart

奇怪的是, .Chart.Charre 方法也不起作用,但是 .Chart.ChartWizard 起作用了,尽管没有给出参数,所以没有改变任何东西!

(是的,工作簿的计算方法是/仍然是自动的


更新(2019-09-17):

由于另一个(第3方)加载项没有阻止任何图表的更新,因此我投入了进一步的研究,禁用了所有代码,删除了customUI的所有XML内容-功能区,并删除了与外部库的所有关系(如据VBE允许我执行的操作)。我仍然可以通过激活此完全无用的插件来可靠地阻止所有图表的更新。

作为最后的尝试,我从头开始通过将所有代码复制到一个新的.xlam-文件中来重建外接程序,设置了所有必需的库关系,最后使用customUI-编辑器为功能区添加了XML代码。

看哪!:现在所有图表都在不断更新:-D


所以-没有证据-我只能猜测我的旧AddIn(最初是2011年,大概是用Excel 2007或2010完成的)与Excel 2013不完全兼容。因此,进行新的设置/用当前版本的Excel重新创建任何AddIn;-)

祝你好运!

答案 18 :(得分:0)

我遇到了类似的问题 - 图表似乎没有更新。我在这个帖子上尝试了一切,但没有运气。我终于意识到我复制和粘贴的图表与源数据相关联,这就是为什么它们都显示相同的结果。

在您完成所有其他动作之前,请务必复制并粘贴图片....

答案 19 :(得分:0)

今天我遇到了一个类似的问题,一个包含大量公式和多个数据库连接的2010文件。未更新参考范围的图表轴具有隐藏列,与此链中的其他列类似,标签显示动态数据的月份和年份“MMM-YY”。我尝试了所有列出的解决方案,除了VBA选项,因为我更愿意在没有代码的情况下解决。

我能够通过将日期(轴标签)封装在TEXT公式中来解决问题:= TEXT(A10,“MMM-YY”)。当价值变化时,一切都会立即更新。再次快乐的日子!

通过阅读上面的其他贡献者问题,我开始认为图表特别是DATE数据类型有问题,因此使用TEXT函数将值转换为文本解决了我的问题。希望这对你也有帮助。只需更改双引号内的格式(TEXT函数的第二个参数)即可满足您的需求。

答案 20 :(得分:0)

只需激活图表所在的工作表:

ActiveCell.Activate

你的问题就消失了。

我遇到了同样的问题,在我刚刚激活工作表之前,你提到的所有问题都没有为我工作。接受的答案对我来说也不起作用。

或者你可以:

{{1}}

答案 21 :(得分:0)

对我来说,宏并没有更新所有系列的x轴,只有第一个。我找到的解决方案是更新所有系列的x轴,然后重新刷新(我也有代码来改变x轴的格式,但我不认为这就是问题)。

ActiveSheet.ChartObjects("Diagram 7").Activate
ActiveChart.Axes(xlCategory).Select
ActiveChart.SeriesCollection(1).XValues = "={""""}"
ActiveChart.SeriesCollection(1).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(2).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(3).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(4).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(5).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(6).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(7).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(8).XValues = "=YYY!$BQ$85:$BQ$8844"

完整宏;

Sub TEST()
'
' TEST Makro
'
ActiveSheet.ChartObjects("Diagram 7").Activate
ActiveChart.Axes(xlCategory).Select
Selection.TickLabels.NumberFormat = "@"
ActiveSheet.ChartObjects("Diagram 7").Activate
ActiveChart.SeriesCollection(1).XValues = "={""""}"
ActiveChart.SeriesCollection(1).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(2).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(3).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(4).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(5).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(6).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(7).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.SeriesCollection(8).XValues = "=YYY!$BQ$85:$BQ$8844"
ActiveChart.Axes(xlCategory).Select
ActiveChart.Axes(xlCategory).TickMarkSpacing = 730
ActiveChart.Axes(xlCategory).TickLabelSpacing = 730
End Sub

答案 22 :(得分:0)

对我来说,首先禁用然后重新启用计算(例如,对于活动工作表)解决了问题:

ThisWorkbook.ActiveSheet.EnableCalculation = False
ThisWorkbook.ActiveSheet.EnableCalculation = True

也许连续两次执行。 工作表中的所有图表都完全更新。

答案 23 :(得分:0)

要更新图表,只需放置表格(" Sheet1")。计算到您的子程序。如果您在不同的选项卡上有更多图表,那么只需创建一个工作表循环。

答案 24 :(得分:0)

在更改源数据的值时,图表未相应更新。刚关闭所有excel实例并重新启动,问题就消失了。

答案 25 :(得分:0)

我对此问题的两分钱 - 我在Access 2010报告中遇到了类似的问题。我正在动态构建一个querydef,将其设置为我的报告中的rowsource,然后尝试遍历每个系列并设置每个系列的属性。我最终要做的是将querydef创建和属性设置分解为单独的subs。另外,我放了一个

SendKeys ("{DOWN}")
SendKeys ("{UP}")

位于两个潜艇的底部。

答案 26 :(得分:0)

因为我几乎尝试了所有提出的解决方案,因为在我的情况下没有一个工作,我也在这里加上我的两分钱。希望它可以帮助别人。

关于这个问题的共识似乎是我们需要以某种方式强制excel重绘图,因为它不应该在它应该的时候这样做。

我的解决方案是杀死X轴数据并将其替换为任何内容,然后再将其更改为我想要的内容。这是我的代码:

With wsReport
    .Activate
    .ChartObjects(1).Activate
    ActiveChart.FullSeriesCollection(1).XValues = "=" 'Kill data here
        .Range("A1").Select 'Forwhatever reason a Select statement was needed
        .ChartObjects(1).Activate
        ActiveChart.FullSeriesCollection(1).XValues = "=tblRef[Secs]"
End With
End Sub

答案 27 :(得分:0)

这可能看起来非常基本,但我只是在图表所在的电子表格上尝试手动计算(通过按F9)并且它有效! Tha VBA代码就是:

计算

;)

答案 28 :(得分:0)

我也在努力解决这个问题。最后通过重新计算自定义函数重新计算后具有图表数据的工作表来解决它。因此,在Sheet 1中,我有一个包含

的单元格
=ComputeScore()

在VBA模块中,该功能被定义为Volatile,以确保ComputeScore()在对电子表格进行任何更新后运行。

Function ComputeScore() As Double
    Application.Volatile True
    . . . do some stuff to get a total . . .
    ComputeScore = theTotal
End Function

然后,在表1的VBA中,这个:

Private Sub Worksheet_Calculate()
    'Recalculate the charts data page to force the charts to update.
    'Otherwise, they don't update until the next change to a sheet, and so
    'chart data is always one update behind the user's data changes.
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlManual
    Sheets("Charts Data").Calculate
    Application.Calculation = xlAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

因此,引用Sheet 1的自定义函数单元格的名为Charts Data的工作表将在ComputeScore()函数更新工作表1的单元格后进行重新计算,因为在ComputeScore()重新计算后,Worksheet_Calculate()将触发。图表数据的这一额外计算导致图表现在更新,而不是更晚或根本不更新。 EnableEvents和xlManual的设置会使无限的recalc循环和其他事件发生。

答案 29 :(得分:0)

我在完成一个教程时遇到了同样的问题(当你按照步骤并且没有得到预期的结果时非常令人沮丧)。

创建饼图的教程要我选择范围A3:A10,然后选择非相邻范围E3:E10。我这样做了。我得到了图表。

然后它要求我更改一个值并观察百分比变化,然后查看饼图并查看更新。

它没有更新。

我查看了饼图的数据源,范围很奇怪。它已正确标注A3:A10范围,但E10单元格引用重复了几次,并且它以随机顺序列出了所有E个单元格。看起来像是

=SERIES(,(Revenue!$A$3:$A$10,Revenue!$E$3,Revenue!$E$10,Revenue!$E$10,Revenue!$E$10,Revenue!$E$10,Revenue!$E$10,Revenue!$E$9,Revenue!$E$8,Revenue!$E$7,Revenue!$E$6,Revenue!$E$5,Revenue!$E$4),1

我将数据源更改为:

=SERIES(,Revenue!$A$3:$A$10,Revenue!$E$3:$E$10,1)

问题解决了。有时这是清理代码的问题,因此计算处理器可以减少排序。

答案 30 :(得分:0)

对我来说有用的是使用宏来插入/删除图表数据表中的列。这将导致图表更新数据选择。

我发现这是解决问题的最快方法。

答案 31 :(得分:0)

上周我在工作单上添加了一些计算时遇到了同样的问题。之后,使用单选按钮选择要在图形上显示的数据不再更新图形。

到目前为止,我能找到的最佳解释是: http://support.microsoft.com/kb/243495

如果我理解正确,如果有超过65536个公式在文件中有另一个单元作为参考,Excel将开始优化计算,在某些情况下,图形不再正确更新。

如果在没有使用VBA宏的情况下有解决方法,我很高兴听到(不能使用那些,因为文件需要通过没有VBA宏的SharePoint共享)。

答案 32 :(得分:0)

我和海报有同样的问题。基本上我正在运行一个仪表板,我有一堆命名范围,这些范围填充了一些UDF的返回值。在仪表板上,有一些饼图,其数据系列与包含这些命名范围的单元格相关联(如果数据系列目标单元格直接包含UDF,绕过命名范围,也会出现问题。)

我更改了一个单元格值,其中包含例如基于仪表板的日期范围,并且命令范围和UDF被强制计算。但是,饼图不会更新 - 出于某种原因,其他类型的图表会更新。顺便说一句,这些是图表对象,而不是图表。无论如何,让我们切入解决方案:

我不想明显改变图表标题或其他方面,无论如何我注意到这并没有一直更新我的图表。有时第一次触发计算时,馅饼会更新,但随后进行计算,馅饼不会。但是,我注意到,每次我对代码进行更改时,我的仪表板都能正常工作。因此:

<强>解决方案:

With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule

     .AddFromString "'test"
     .DeleteLines 1

End With

如果您正在使用工作簿模块(我不是这种情况),只需创建一个新模块并引用它。

答案 33 :(得分:0)

我自己花了半天时间。

我有一个宏可以更改作为图表数据的值。所有这些都在Excel 2003中运行良好,但在Excel 2007中,图表似乎失去了与其数据的所有连接,尽管手动更改两列中的数据值会触发重新计算。

我的解决方案是在更改数据之前使活动工作表上的所有图表都不可见,然后再次使其可见并调用图表刷新以获得良好的衡量标准。 (似乎只是可见的图表更新了这个问题)。

这对我有用,也可以处理图表和图表对象的类似问题。可能不需要刷新 - 需要更多测试。

Dim chrt As Chart
Dim chrtVis As XlSheetVisibility
Dim sht As Worksheet
Dim bChartVisible() As Boolean
Dim iCount As Long

Dim co As ChartObject

On Error Resume Next

Set chrt = ActiveChart

If Not chrt Is Nothing Then
        chrtVis = chrt.Visible
        chrt.Visible = xlSheetHidden
        End If

Set sht = ActiveSheet

If Not sht Is Nothing Then
        ReDim bChartVisible(1 To sht.ChartObjects.Count) As Boolean
        iCount = 1
        For Each co In sht.ChartObjects
            bChartVisible(iCount) = co.Visible
            co.Visible = False
            iCount = iCount + 1
            Next co
        End If

DO MACRO STUFF改变数据

If Not sht Is Nothing Then
        iCount = 1
        For Each co In sht.ChartObjects
            co.Visible = bChartVisible(iCount)
            co.Chart.Refresh
            iCount = iCount + 1
        Next co
        End If

If Not chrt Is Nothing Then
        chrt.Visible = chrtVis 
        chrt.Refresh
        If chrt.Visible Then
            chrt.Select
            End If
        End If

On Error GoTo 0

答案 34 :(得分:-1)

我发现通过在单独的工作表中创建图表,将应用任何更新。 HTH