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

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

我正在编写一个模块来修复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
vba excel-vba excel
1个回答
0
投票

我现在的解决方法是简单地在第二次设置currLabel.top = newTop之后立即生效。希望它也可以在我客户的电脑上运行!

© www.soinside.com 2019 - 2024. All rights reserved.