Excel VBA范围值有时无法进行比较检查

时间:2015-01-15 02:53:07

标签: excel excel-vba vba

场合

在工作表上,我有一个名为named range的{​​{1}}(其值介于0和1之间,格式为百分比)。

total_Dist我正在检查此值VBA是否使用=1语句。以下是整个代码,我已通过评论IF突出显示IF语句。用户按工作表上的按钮调用代码。

****Issue occurs here***

问题

有时,即使Sub distribution_Next() Dim tbl As ListObject Dim i As Integer Set tbl = Range("tbl_Activity").ListObject '****Issue occurs here*** If Range("total_Dist").Value <> 1 Then 'the time allocation does not equal 100% MsgBox "Please ensure the total time allocated adds up to 100%" GoTo clean Else Debug.Print "else" End If Application.ScreenUpdating = False With tbl For i = 1 To .ListColumns(2).DataBodyRange.Rows.Count 'enable/visible each worksheet that has a time allocation If .ListColumns(2).DataBodyRange.Cells(i, 1).Value > 0 Then Worksheets(.ListColumns(1).DataBodyRange.Cells(i, 1).Value).Visible = True Else Worksheets(.ListColumns(1).DataBodyRange.Cells(i, 1).Value).Visible = False End If Next i End With Sheets("Finish").Visible = True Worksheets("Distribution of Time").Activate 'included this line to stop 'nextPage' going to incorrect sheet Application.ScreenUpdating = True nextPage clean: 'clean up Set tbl = Nothing End Sub 代码仍然进入range = 1语句,如屏幕截图所示:

If statement failing

您可以从tiptext和“Watches”窗口看到值IF,但它仍然输入=1语句。

每次都不会发生这种情况,但我无法看到一种模式,也无法解决为什么它会像这样失败。

备注

我在没有IF.value的情况下尝试过它。

我在Windows 7计算机上使用Excel 2013。

编辑/更新

此屏幕截图显示有时会通过.value2检查:

If statement pass

1 个答案:

答案 0 :(得分:2)

我认为这是一个浮点问题所以实际值并不精确1.如果是这样你可以使用:

If Round(Range("total_Dist").Value, 7) <> 1 Then
例如

。 7是任意数字,具体取决于您需要的精度等级。我倾向于使用它,因为它通常足够小数位来排除浮点错误但不会引入新的舍入问题。 (请记住,对于显示为2DP的百分比值,将实际值四舍五入为4 DP可能会影响基于实际值而不是浮点问题的结果。)