Lars在宏中使用ATAN2函数遇到了一个问题。他开发了一套相当复杂的指令,只是让VBA在尝试使用ATAN2函数时生成错误。他能够简化宏,以便重新创建问题:

Sub Test()

Dim A As Double

Dim C As Double     Dim E As Double

A = 5908     C = 0     C = -C     E = 180 / WorksheetFunction.Pi

MsgBox E * WorksheetFunction.Atan2(C, A)

End Sub

当执行代码时,将在执行ATAN2的行上生成错误。拉尔斯想知道到底是什么引起了问题。

问题显然与您如何操纵C变量有关。首先将C定义为零,然后取反该值。没有负零之类的东西,当您尝试取反该值时,Excel显然会在随后在公式中使用该值时感到沮丧。

解决该问题的一种方法就是简单地更改C转换为零值的方式。更改宏,使其看起来像这样:

Sub Test()

Dim A As Double

Dim C As Double     Dim E As Double

A = 5908     C = 0     If C <> 0 Then C = -C     E = 180 / WorksheetFunction.Pi

MsgBox E * WorksheetFunction.Atan2(C, A)

End Sub

现在,宏将正常工作,因为如果C不等于0,则仅在C上进行转换。

还似乎只有在将C定义为浮点值时才产生错误。如果将C标注为整数,则原始宏不会生成错误。这可能表明该问题与如何内部表示不存在的负零的浮点表示有关。由于Integer数据类型严格处理整数,因此不会出现表示问题。

如果将C声明为Variant数据类型,或者完全删除声明行(这意味着VBA在首次使用时默认将C声明为Variant),也可以摆脱此问题。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(2892)适用于Microsoft Excel 97、2000、2002和2003。