Excel图表中隐藏的整数计数器?

问题描述 投票:0回答:1

我通过一个非常简单的循环来制作 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中的项目等等?我可以清洁这个柜台吗?

谢谢您的回答

excel vba charts integer-overflow
1个回答
0
投票

可以确认该行为,但无法解释,我怀疑您是否会找到更多相关信息。但即使您能获得更多信息,您也不太可能对此采取措施 - 这是一个内部实现细节,没有任何内容暴露给 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
© www.soinside.com 2019 - 2024. All rights reserved.