我有一个像这样的Excel图表:
以下 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 值之前会出现延迟。
删除 Legend 后,在从 Left 属性读取新值之前,会再打印原始位置值 4 次。 我如何以可靠的方式对其进行编程,以便代码阻塞,直到更新值,而不添加一些随机数量的 DoEvents,或添加一些随机时间跨度的计时器循环,并希望得到最好的结果?
示例工作簿:https://www.dropbox.com/scl/fi/3b96fim1lkxz1mh5i4pq4/test.xlsm?rlkey=ivdghw3xr87b99ss1avkqgi79&dl=1
任何事情都不能立即完成...
为了等待左侧位置更新,请尝试下一个改编代码:
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