【问题标题】:Chart Animation no longer works in 2016 VBA图表动画不再适用于 2016 VBA
【发布时间】:2020-07-24 10:25:47
【问题描述】:

此代码在 Excel 2013 中完美运行,但不显示实时动画,仅显示代码运行完成后的最终草图。 请解决它。

Public Sub Plot_Line() ' {

Dim sh As Worksheet
Set sh = Worksheets("Line")
Dim firstRow    As Integer
Dim lastRow     As Integer
Dim firstColumn As Integer
Dim lastColumn  As Integer

firstRow = 2
lastRow = firstRow + 302 - 1

firstColumn = 1
Dim rows As Integer
rows = lastRow - firstRow + 1
Dim columns As Integer
columns = lastColumn - firstColumn + 1


Dim dataRange As Range
Set dataRange = Range(Cells(firstRow, firstColumn + 1), Cells(lastRow, firstColumn + 2))

Set ch1 = ActiveSheet.ChartObjects("Chart 1")
ch1.Activate

ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
Set ch = ActiveChart
DoEvents

For t = 3 To 302

With Range("C3:C" & t)
    .Formula = "=SIN(2*A3)"
    Application.Wait (Now + TimeValue("00:00:05"))
    DoEvents

 End With
Next t

End Sub

'

【问题讨论】:

  • 任何一行显示错误?
  • 您的 sub 似乎主要由与动画完全无关的代码组成。你有各种各样的任务,什么都不做。例如——columns = lastColumn - firstColumn + 1 的意义何在?为什么不清理它以获得minimal reproducible example

标签: excel vba


【解决方案1】:

要在 Excel 2016 中制作体面的动画(由于其渲染引擎中的一些未记录的更改,这似乎比早期版本更难),首先手动创建图表会有所帮助。像这样的:

确保手动设置两个轴的最小值和最大值,而不是设置为自动。如果您现在删除数字但保留图表,则会显示一个空坐标系。

就代码而言,与其使用Application.Wait,不如用一块石头杀死两只鸟,并制作自己的延迟函数,其中包含DoEvents

Option Explicit 'Your code could use this!

Sub Pause(t As Double)
    Dim start As Double
    start = Timer
    Do While Timer < start + t
        DoEvents
    Loop
End Sub

那么动画子就是这样的:

Public Sub Plot_Line()
    Dim i As Long
    Dim x As Double
    Dim y As Double

    Range("A2:B316").ClearContents
    For i = 2 To 316
        x = 0.02 * (i - 1)
        y = Sin(x) 'you could insert a formula if you prefer
        Range("A" & i).Value = x
        Range("B" & i).Value = y
        Pause 0.02
    Next i
End Sub

请注意,动画代码不直接与图表交互。它只是控制提供图表数据的范围。我的猜测是这条线

ActiveChart.ChartType = xlXYScatterSmoothNoMarkers

是代码中的罪魁祸首。不知道为什么,但是尝试在动画中修改图表对象本身似乎在 Excel 2016 中不起作用。

【讨论】:

  • 您的Pause-函数将进入一个忙等待-循环,该循环将消耗100% CPU(至少一个内核)。
  • @FunThomas 关键是在动画的上下文中这不是一个坏主意。暂停是几分之一秒,循环没有做任何事情——它导致图表更新。对于更长的停顿,这将是一个坏主意。
  • 对,但是 OP 发布的代码循环了 300 次,每次等待 5s...
  • @FunThomas 我明白了。好点子。每 5 秒更新一次甚至是动画怎么办?乍一看,我把它误读为 0.05 秒。我有很多 Excel 动画,我通常可以获得每秒 20 到 50 次更新的不错的帧速率(部分取决于有多少变化)。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多