无法在Excel VBA中刷新图表(Excel 2016)

时间:2017-02-08 12:48:34

标签: excel vba charts

我的儿子(15岁)正在学习钟摆学校,物理课程。我试图用Excel中的模拟钟摆来帮助他,使用2点图表,一个固定点(摆锤的“绳索”附着,一个随时间移动(钟摆)。

计算还可以,但是我无法弄清楚为什么图表没有刷新:“钟摆”不动......我读了堆栈溢出的多个帖子而不是刷新Excel图表,但没有一个可以帮我解决它......有什么想法吗?

这是代码(好的,我不是IT专业人员......!)

Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const g = 9.80665 'gravity constant
Const PI = 3.14159265358979

Sub TestSimple()

'Declare variables
Dim l 'lenght of pendulum
Dim Tô1 'start angle
Dim Tôi 'angle of pendulum at time i
Dim x 'coordonnates of pendulum on x axis
Dim y 'coordonnates of pendulum on y axis
Dim Omega 'Sqr(g / l)
Dim t 'time
Dim s, phi


'-1- Initialization of variables
l = 0.7   'length is 70 cm
Omega = Sqr(g / l)
Tô1 = PI / 6 '30 degrees at start

'**** NOTE ****
'Equation of pendulum angle in function of time is
'Tô(t)=Tô1*cos(Wo.t) were Wo = sqrt(g/l) = Omega
'**************


'Calculation of time needed for 1 calculation
s = Timer
t = 2
Tôi = Tô1 * Cos(Omega * t)
x = l * Sin(Tôi)
y = 1 - l * Cos(Tôi)

'paste x and y value into spreadsheet
Worksheets(1).Range("A3").Value = x
Worksheets(1).Range("B3").Value = y
'refresh chart
ActiveSheet.ChartObjects("Chart 1").Chart.Refresh

phi = Timer - s


'-2- Simulation for 10 seconds
For t = 0 To 10 Step phi

    'position of pendulum in function of time
        Tôi = Tô1 * Cos(Omega * t)
        x = l * Sin(Tôi)
        y = 1 - l * Cos(Tôi)

    'paste x and y in spreadsheet
    Worksheets(1).Range("A3").Value = x
    Worksheets(1).Range("B3").Value = y
    'refresh of chart

    ActiveSheet.ChartObjects("Chart 1").Chart.Refresh

    Sleep (50) 'let machine sleeps for 50 milliseconds, for a smoother look
Next t


End Sub

2 个答案:

答案 0 :(得分:0)

听起来像是DoEvents问题。只需将DoEvents放入代码中即可:

...
ActiveSheet.ChartObjects("Chart 1").Chart.Refresh
DoEvents
Sleep (50)
...

答案 1 :(得分:0)

现在是2020年,正在运行Excel 2016 for MAC。我将此子例程放入代码中(结合了我在网络上找到的各种项目),并在每次调用该子例程时更新了图表(请确保在工作表中将单元格定义为“ stepper”,以便可以存储计数器数据)并更新)。 我的图表被excel自动命名为“图表8”:

Sub ChartAnimation3()
  Dim i As Double
  For i = 0 To 1000 Step 500
    ActiveSheet.Range("Stepper") = i
    DoEvents
    DoEvents
  Next

ActiveSheet.ChartObjects("Chart 8").Chart.Refresh
ActiveSheet.ChartObjects("Chart 8").Activate
ActiveChart.Refresh
DoEvents

End Sub

此代码中可能不需要一些项目,但是我是新手,而且可以用,所以很满意。