Excel工作表和VBA INT(LOG())函数之间不一致

Excel工作表和VBA INT(LOG())函数之间不一致,excel,int,worksheet-function,logarithm,vba,Excel,Int,Worksheet Function,Logarithm,Vba,在标准Excel VBA代码模块中,我创建了自定义公式MyLog10(),以获得10个基本对数: Public Function MyLog10(ByVal dbl_Input As Double) As Double MyLog10 = Log(dbl_Input) / Log(10) End Function 测试值为1000,得到3的准确结果。令人惊讶的是,将Int()VBA函数应用于MyLog10()的结果时,结果是2。Fix()VBA函数也观察到了同样的情况(请参见以下测试子

在标准Excel VBA代码模块中,我创建了自定义公式
MyLog10()
,以获得10个基本对数:

Public Function MyLog10(ByVal dbl_Input As Double) As Double
    MyLog10 = Log(dbl_Input) / Log(10)
End Function
测试值为1000,得到3的准确结果。令人惊讶的是,将
Int()
VBA函数应用于
MyLog10()
的结果时,结果是2。
Fix()
VBA函数也观察到了同样的情况(请参见以下测试子部分):

更令人惊讶的是,我在Excel工作表中输入的自定义函数
MyLog10(1000)
作为
=MyLog10(1000)
=INT(MyLog10(1000))
在这两种情况下都返回了正确的结果3

对VBA/工作表不一致(可能是错误)有何解释


此外,通过向自定义VBA
MyLog10()
的输出中添加一个非常小的数字(1E-12),在这两种情况下都产生了正确的结果(有/没有额外的
Int()
):


您只需在excel中使用=LOG10即可获得相同的效果,而无需创建自己的函数(我有excel 2013,我不确定旧版本是否有该公式)

如果您需要VBA中的公式,您可以使用
Application.WorksheetFunction.Log10(
number或name of variable


我知道这并不能真正回答您的问题,但这是一个可靠的解决方案

您只需在excel中使用=LOG10即可获得相同的效果,而无需创建自己的函数(我有excel 2013,我不确定旧版本是否有该公式)

如果您需要VBA中的公式,您可以使用
Application.WorksheetFunction.Log10(
number或name of variable


我知道这并不能真正回答您的问题,但这是一个可靠的解决方案

您只需在excel中使用=LOG10即可获得相同的效果,而无需创建自己的函数(我有excel 2013,我不确定旧版本是否有该公式)

如果您需要VBA中的公式,您可以使用
Application.WorksheetFunction.Log10(
number或name of variable


我知道这并不能真正回答您的问题,但这是一个可靠的解决方案

您只需在excel中使用=LOG10即可获得相同的效果,而无需创建自己的函数(我有excel 2013,我不确定旧版本是否有该公式)

如果您需要VBA中的公式,您可以使用
Application.WorksheetFunction.Log10(
number或name of variable


我知道这并不能真正回答您的问题,但这是一个可靠的解决方案

在尝试了多种类型转换后,找到了解决方案:它使用
十进制
类型作为自定义日志函数
MyLog10Decimal
返回类型。以下是包含通用VBA解决方案和测试子项的代码段
TestIntMyLog10()


一点解释。VBA不支持将Decimal类型作为函数参数/输出,因此它声明为应用CDec转换的变量。到目前为止,它在多个输入上进行了测试(>1和在尝试了多个类型转换之后,找到了解决方案:它使用
Decimal
类型作为自定义日志函数
MyLog10Decimal
返回类型。下面是包含通用VBA解决方案和测试子
TestIntMyLog10()
的代码片段:


一点说明。VBA不支持将十进制类型作为函数参数/输出,因此它声明了一个变量,并应用了CDec转换。到目前为止,它在多个输入上进行了测试(>1和在尝试多个类型转换后,找到了解决方案:它使用
Decimal
类型作为自定义日志函数
MyLog10Decimal
返回类型。以下是包含通用VBA解决方案和test Sub的代码段
TestIntMyLog10()


一点说明。VBA不支持将十进制类型作为函数参数/输出,因此它声明了一个变量,并应用了CDec转换。到目前为止,它在多个输入上进行了测试(>1和在尝试多个类型转换后,找到了解决方案:它使用
Decimal
类型作为自定义日志函数
MyLog10Decimal
返回类型。以下是包含通用VBA解决方案和test Sub的代码段
TestIntMyLog10()


一点说明。VBA不支持将十进制类型作为函数参数/输出,因此它声明了一个变量,并应用了CDec转换。到目前为止,它已在多个输入(>1)上进行了测试,感谢您的输入。我将对您的答案投赞成票,尽管它没有直接解决此问题(查找通用VBA解决方案以在其他MS Office应用程序中工作,无需参考Excel对象库)。致以最诚挚的问候,感谢您的输入。我将投票支持您的答案,尽管它没有直接解决问题(查找通用VBA解决方案以在其他MS Office应用程序中工作,无需参考Excel对象库)。致以最良好的祝愿,感谢您的输入。我将对您的答案进行更新投票,尽管它没有直接解决问题(查找通用VBA解决方案在其他MS Office应用程序中工作,而不参考Excel对象库)。致以最良好的祝愿,感谢您的输入。我将对您的答案进行更新投票,尽管它没有直接解决问题(发现通用VBA解决方案可在其他MS Office应用程序中工作,而无需参考Excel对象库)。致以最诚挚的问候,
Sub TestIntMyLog10()
    Debug.Print MyLog10(1000) 'Result 3 (accurate)
    Debug.Print Int(MyLog10(1000)) 'Result 2  (inaccurate)
    Debug.Print Fix(MyLog10(1000)) 'Result 2  (inaccurate)
End Sub
Debug.Print Int (Log10(1000)+1E-12) 'Result 3 (accurate)
' SOLUTION: using output type decimal : Int() and Fix() return correct value
Public Function MyLog10Decimal(ByVal dbl_Input As Double) As Variant
    MyLog10Decimal = CDec(Log(dbl_Input) / Log(10))
End Function

'Problem: using output type double: Int() and Fix() may return incorrect
Public Function MyLog10(ByVal dbl_Input As Double) As Double
     MyLog10 = Log(dbl_Input) / Log(10)
End Function

Sub TestIntMyLog10()
   ' ** test sample: input number 1000
   'using Log output type double: Int() and Fix() produces incorrect results
    Debug.Print MyLog10(1000) 'Result 3 (accurate)
    Debug.Print Int(MyLog10(1000)) 'Result 2  (inaccurate)
    Debug.Print Fix(MyLog10(1000)) 'Result 2  (inaccurate)

    'using Log output type decimal: Int() and Fix() produces correct results
    Debug.Print Int(MyLog10Decimal(1000)) 'Result 3  (accurate)
    Debug.Print Int(MyLog10Decimal(1000)) 'Result 3  (accurate)
    Debug.Print Fix(MyLog10Decimal(1000)) 'Result 3  (accurate)

   ' ** test sample: input number 0.001
   'using Log output type double: Fix() produces incorrect results
    Debug.Print MyLog10(0.001) 'Result -3 (accurate)
    Debug.Print Int(MyLog10(0.001)) 'Result -3  (accurate)
    Debug.Print Fix(MyLog10(0.001)) 'Result -2  (inaccurate)

    'using Log output type decimal: Int() and Fix() produces correct results
    Debug.Print Int(MyLog10Decimal(0.001)) 'Result -3  (accurate)
    Debug.Print Int(MyLog10Decimal(0.001)) 'Result -3  (accurate)
    Debug.Print Fix(MyLog10Decimal(0.001)) 'Result -3  (accurate)
End Sub