我正在编写一个模块来修复Excel中图表中的重叠dataLabels。由于它用于循环遍历200个文件的宏,每次更新图表的数字,因此必须通过VBA完成。
当我测试它时,如果我只是从我的testChart
sub调用“fixPieLabels”子,它会给出所需的结果。如果我在调用“fixPieLabels”的行上有一个断点,以及在循环通过不同值集的testAll
子上的“next x”行(所以我可以检查每次迭代),它会给出所需的结果。如果我在fixPieLabels调用后的“next x”行上只有一个断点,则会给出错误的结果。
我认为图表没有及时更新“fixPieLabels”子,但我添加了一些debug.print语句来找出它关闭的地方......并且我对“off”之间的所有相关变量都有相同的值运行和“正确”运行,包括运行if / else条件的相同部分,但不知何故,它的计算方式不同。
例如,以下是错误测试的调试打印输出:
Fixed Income Investments
height: 25.5312598425197
percSide: 0.45 gT: 82.5076377952756 gH: 153.454803149606
40%-<60%
postTop: 153.09811023622
并且正确的测试:
Fixed Income Investments
height: 25.5312598425197
percSide: 0.45 gT: 82.5076377952756 gH: 153.454803149606
40%-<60%
postTop: 138.796692913386
这是它正在运行的计算:
currLabel.Top = gT - currLabel.Height / 2 + percSide * gH
如您所见,所有变量都是相同的,但在“错误”运行中,运行计算后的currLabel.Top
(“postTop”)在数学上是不正确的。在其他测试中,我让它在运行计算之前打印currLabel.Top
,并且它正在改变,所以问题不在于它根本没有分配新的顶部。
以下是调用“fixPieLabels”子的subs:
Private Sub testChart()
fixPieLabels ActiveSheet.ChartObjects(1)
End Sub
Private Sub testAll()
Dim testArea As range
Dim x As Integer
With ActiveSheet
Set testArea = range("D1").CurrentRegion
For x = 1 To testArea.Columns.Count
.range("ChartNum").Value = testArea.Columns(x).Value
.ChartObjects(1).Chart.Refresh
fixPieLabels .ChartObjects(1)
Next x
End With
End Sub
任何人都知道为什么会发生这种情况或如何解决它?为什么断点会导致它正确计算?
编辑:我试图debug.print计算,它是正确的,所以我尝试将计算分配给变量newTop
然后将dataLabel top
属性设置为newTop
...它仍然有错误的值! (是的,我这次使用的那个是不同的括号,所以计算方法不同......
(totSoFar
只是在此之前数据点的总和,thisPerc
是此数据点的值除以totSoFar
)
percOfSide = (totSoFar + thisPerc / 2) * 2
Debug.Print currLabel.Formula & " height: " & currLabel.Height
Debug.Print "percSide: " & percOfSide & " gT: " & grphTop & " gH: " & grphHeight
.....
ElseIf percOfSide > 0.75 Then
Debug.Print ">75%-90%"
Debug.Print "Answer: " & grphTop + percOfSide * grphHeight + currLabel.Height / 2
newTop = grphTop + percOfSide * grphHeight + currLabel.Height / 2
end if
Debug.Print newTop
currLabel.Top = newTop
Debug.Print "postTop: " & currLabel.Top & " preLeft: " & currLabel.Left
打印输出:
Alternative Investments
2.000% height: 28.8554330708661
percSide: 0.88 gT: 82.5076377952756 gH: 153.454803149606
>75%-90%
Answer: 231.975580370633
231.975580370633
postTop: 244.684251968504 preLeft: 278.302362204724
我现在的解决方法是简单地在第二次设置currLabel.top = newTop
之后立即生效。希望它也可以在我客户的电脑上运行!