VBA在设置断点和运行之间返回不同的结果

时间:2017-12-18 20:25:07

标签: vba excel-vba excel

我正在编写一个模块来修复Excel中图表中的重叠dataLabels。由于它将用于循环遍历200个文件的宏,每次更新图表的数字,因此必须通过VBA完成。

当我测试它时,如果我只是调用" fixPieLabels"来自我的testChart子的子,它给出了期望的结果。如果我在调用" fixPieLabels"以及"下一个x"的行上有一个断点。从testAll子循环遍历不同值集的行(我可以检查每次迭代),它给出了所需的结果。如果我在"下一个x"上只有一个断点。在fixPieLabels调用之后,它会产生错误的结果。

我认为图表并没有及时更新" fixPieLabels" sub,但是我添加了一些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

如您所见,所有变量都是相同的,但在&#34;错误&#34;运行,运行计算后的currLabel.Top(&#34; postTop&#34;)在数学上是不正确的。在其他测试中,我让它在运行计算之前打印currLabel.Top,并且它正在改变,所以问题不在于它根本没有分配新的顶部。

以下是调用&#34; fixPieLabels&#34;子:

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

1 个答案:

答案 0 :(得分:0)

我现在的解决方法是在紧接着之后第二次设置currLabel.top = newTop,这到目前为止是有效的。希望它也可以在我客户的电脑上运行!