Excel VBA 函数失败,但公式在工作表中有效
Posted
技术标签:
【中文标题】Excel VBA 函数失败,但公式在工作表中有效【英文标题】:Excel VBA Function Fails but Formula works in sheet 【发布时间】:2019-03-07 22:28:05 【问题描述】:VBA for Excel 中出现奇怪的数学错误
大家好,希望对我遇到的异常错误提供反馈。
很奇怪。我有一个简单的公式,如果我可以 仅在普通工作表单元格中使用它并按列复制, 但是如果我尝试在 vba 代码中进行简单的迭代来执行相同的功能,我会得到错误的值。
说明:一个数取平方,然后除以另一个值 在 0.99 到 1.99 之间,接下来取模数,然后 数字再次平方并重复整个公式。 如果我将公式语句复制到列下,它计算得很好, 包括合理的小数精度。
有四个输入; 基值(输入x) decx = 除数 模组值
(E2) 处的第一个公式看起来像 ; =MOD(((B2^2)/$B$3),$B$4)
在 (E3) 中放置了这个语句; =MOD(((E2^2)/$B$3),$B$4)
然后这个完全相同的语句被复制下来,按列复制到接下来的 98 个单元格。
一切都很好,没问题。看起来准确的价值,小数点 精度,所有列单元格中显示小数点后的值。
一些用于测试的样本输入值;
输入 --> 231 DECX 1.010101 MOD 400 循环时间 100
但是当我尝试实现这是 Excel VBA 代码 (Excel 2007) 我经常得到错误的值,而且绝对不会显示超过小数点的值。
尝试过使用各种不同的数据类型;单,双,变体等......但我所做的VBA函数返回的所有值总是返回 整数,通常是错误的,当然不同意 简单的基于列的语句返回的值。
已尝试找到解决此问题的方法或解决此问题,遇到“CDEC”,尝试过 这并没有改变。完全被难住了,很想了解一下 如果这可以修复,以便函数循环返回相同的值 与基于列的语句相同的小数精度和 非常感谢有关如何完成 mthis 的反馈。
我在下面包括我的示例代码;
Public Function SQRD(inputx As Variant, looptime As Variant, decx As Variant) As Variant
Application.Volatile
Dim Count As Integer
SQRD = CDec(inputx)
'Dim decx As variant
Count = 1
For Count = 1 To looptime
SQRD = CDec(SQRD ^ 2) '+ looptime
SQRD = CDec(SQRD Mod 400 / decx)
Next Count
End Function
【问题讨论】:
【参考方案1】:我将只讨论您对 VBA Mod
运算符的使用。它不等同于 Excel MOD
函数。特别是,VBA Mod
运算符将在执行操作之前将浮点数四舍五入为整数。
要使用模仿 Excel MOD
函数的 VBA 函数,请使用类似:
Function xlMOD(a As Double, b As Double) As Double
xlMOD = a - (b * (a \ b))
End Function
编辑
VBA 中似乎存在错误(或文档错误)。在上面的公式中,\
运算符应该是整数除法运算符。它确实返回一个整数结果。但是,它不会截断,而是舍入。实际上,它可能正在做的是在返回结果之前对数字和除数执行 VBA 类型舍入。
因此,模拟 Excel MOD
函数的适当 vba 函数将是:
Function xlMOD(a As Double, b As Double) As Double
xlMOD = a - Int(a / b) * b
End Function
【讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 嗨,Ron,我刚刚下载了 XP 的 Xnumbers,将使用我的 Excel 2007 版本试用它,看看会发生什么 - 可以问一下,你是否像 mod 函数那样为 xnumbers 编写代码/脚本用它来测试?如果可以,可以和我分享一下吗?【参考方案2】:您的代码有很多问题。据我所知,不需要循环,并且您在 mod 之后而不是之前进行划分
这似乎可以解决问题
Public Function NuFunc(InputX As Variant, DecX As Variant) As Variant
NuFunc = ((InputX ^ 2) / DecX) Mod 400
End Function
【讨论】:
您好,感谢您的反馈 - 我明白您的意思,这很有帮助,我很感激,但这并不能解决问题。当函数以“404.0404”的输入值运行 100 次迭代时,它返回不正确的值 1,而工作表列公式返回正确的值“72.18545607” UDF VBA 函数不保留任何超过小数位的值,也不是否正确计算最终结果。 我怀疑这与数据类型以及 excel 如何处理 VBA 中的计算有关,但我无法弄清楚如何解决这个问题,因为我已经尝试了所有已知的相关数据类型。通过简单地输入任何值作为有理数的输入和任何高于 10 的循环,电子表格使用基本重复和复制我上面提到的列式语句,很容易理解我的意思; “放置在 (E2) 的第一个公式看起来像 ; =MOD(((B2^2)),$B$4) 在 (E3) 中放置了这个语句 ; =MOD(((E2^2)),$B$4 )" 然后将第 100 个单元格与函数的第 100 次迭代进行比较证明了差异,我只希望函数返回与基于更繁琐的表/列的方法产生的相同的值和准确性 另外,在您上面提供的代码 sn-p 中(非常感谢您提供的顺便说一句)-我希望能够输入循环/迭代的数量,我不想只得到输入的单个平方,但我需要在保留准确性和十进制值的同时对其进行递归 自我注意..不要回答问题然后去睡觉:-)以上是关于Excel VBA 函数失败,但公式在工作表中有效的主要内容,如果未能解决你的问题,请参考以下文章