我通过一个非常简单的循环来制作 2d 点在 Excel 图表中移动的动画:
do while true
.ChartObjects(1).Chart.SeriesCollection(1).XValues = x
.ChartObjects(1).Chart.SeriesCollection(1).Values = y
doEvents
... some changes of (x,y) ...
loop
在 32768 个步骤之后,抛出运行时错误 1004,并且没有下一步解释。无法再使用图表对象。
知道发生了什么吗?
通过这种方式实现的任何动画都有一般行为。也许图表中存在一些隐藏的计数器,用于计算将插入到SeriesCollection中的项目等等?我可以清洁这个柜台吗?
谢谢您的回答
可以确认该行为,但无法解释,我怀疑您是否会找到更多相关信息。但即使您能获得更多信息,您也不太可能对此采取措施 - 这是一个内部实现细节,没有任何内容暴露给 VBA。
我发现,如果您保存并关闭工作簿,重新打开后可以继续,所以这可能是一个解决方案。
然而,我的想法是复制图表,将副本(我将其命名为“模板”)设置为隐藏,每当发生错误时,删除工作图表并使用模板创建一个新图表。
With ActiveSheet
Dim coTemplate As ChartObject, co As ChartObject
Set coTemplate = ws.ChartObjects("ChartTemplate")
Set co = ws.ChartObjects("Chart1")
coTemplate.Visible = False
Do While True
Dim s As Series
Set s = .ChartObjects("Chart1").chart.SeriesCollection(1)
On Error Resume Next
co.chart.SeriesCollection(1).XValues = x
If Err.Number = 1004 Then
copyTemplate co, coTemplate
Debug.print "chart recreated."
End If
co.chart.SeriesCollection(1).Values = y
On Error GoTo 0
(...)
Loop
End With
Sub copyTemplate(co As ChartObject, coTemplate As ChartObject)
Dim ws As Worksheet
Set ws = co.Parent
Dim saveLeft As Double, saveTop As Double, saveName As String
saveLeft = co.Left
saveTop = co.Top
saveName = co.Name
' Delete chart
co.Delete
' Copy the template
coTemplate.Copy
ws.Paste
Set co = .ChartObjects(.ChartObjects.Count)
co.Visible = True
co.Name = saveName
co.Left = saveLeft
co.Top = saveTop
End Sub