图表布局更改后Excel VBA图表数据标签位置属性更新延迟

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

我有一个像这样的Excel图表:

enter image description here

以下 VBA 宏用于切换 HasLegend 属性并多次检查第一个 DataLabel 的左侧位置:

Sub Button1_Click()

    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    ActiveSheet.ChartObjects("Chart 1").Chart.HasLegend = False
    
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    Debug.Print CStr(ActiveSheet.ChartObjects("Chart 1").Chart.SeriesCollection(1).DataLabels(1).Left)
    DoEvents
    
    ActiveSheet.ChartObjects("Chart 1").Chart.HasLegend = True

End Sub

正如您在下面的“立即”窗口中看到的,删除图例后,在更新 DataLabel Left 值之前会出现延迟。

Microsoft Visual Basic for Applications

删除 Legend 后,在从 Left 属性读取新值之前,会再打印原始位置值 4 次。 我如何以可靠的方式对其进行编程,以便代码阻塞,直到更新值,而不添加一些随机数量的 DoEvents,或添加一些随机时间跨度的计时器循环,并希望得到最好的结果?

示例工作簿:https://www.dropbox.com/scl/fi/3b96fim1lkxz1mh5i4pq4/test.xlsm?rlkey=ivdghw3xr87b99ss1avkqgi79&dl=1

excel vba charts
1个回答
0
投票

任何事情都不能立即完成...

为了等待左侧位置更新,请尝试下一个改编代码:

Sub Button1_Click()
    Dim prevPos As Double, actChart As ChartObject
    
    Set actChart = ActiveSheet.ChartObjects("Chart 1") ' just to make following code lines shorter...
    prevPos = actChart.Chart.SeriesCollection(1).DataLabels(1).Left
    Debug.Print prevPos
    
    actChart.Chart.HasLegend = False
    Do While actChart.Chart.SeriesCollection(1).DataLabels(1).Left = prevPos
        DoEvents
    Loop
    
    'do whatever you need here...
    
    Debug.Print actChart.Chart.SeriesCollection(1).DataLabels(1).Left
    actChart.Chart.HasLegend = True
End Sub
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.