Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA函数失败,但公式在工作表中有效_Excel_Vba_User Defined Functions - Fatal编程技术网

Excel VBA函数失败,但公式在工作表中有效

Excel VBA函数失败,但公式在工作表中有效,excel,vba,user-defined-functions,Excel,Vba,User Defined Functions,VBA for Excel中的奇怪数学错误 大家好,我很想得到关于我的错误的反馈 很奇怪。我有一个简单的公式,如果我 仅在普通图纸单元格中使用,并按列向下复制, 但是,如果我尝试在vba代码中进行简单的迭代来执行相同的函数,我会得到错误的值 描述:一个数字是平方,然后除以另一个值 在0.99到1.99之间,取下模量,然后 将数字再次平方,并重复整个公式。 如果我把公式语句按列复制下来,它就可以计算了, 包括合理的十进制精度 有四个输入; 基本值(输入x) decx=除数 模值 (E2)处的第一个

VBA for Excel中的奇怪数学错误

大家好,我很想得到关于我的错误的反馈

很奇怪。我有一个简单的公式,如果我 仅在普通图纸单元格中使用,并按列向下复制, 但是,如果我尝试在vba代码中进行简单的迭代来执行相同的函数,我会得到错误的值

描述:一个数字是平方,然后除以另一个值 在0.99到1.99之间,取下模量,然后 将数字再次平方,并重复整个公式。
如果我把公式语句按列复制下来,它就可以计算了, 包括合理的十进制精度

有四个输入; 基本值(输入x) decx=除数 模值

(E2)处的第一个公式如下:=国防部((B2^2)/$B$3,$B$4)

在(E3)中,该陈述被放置=国防部((E2^2)/$B$3,$B$4)

然后,将完全相同的语句向下复制,逐列复制到下一个98个单元格

很好,没问题。从数值上看,它似乎是精确的,精确到小数点 精度,所有列单元格中显示超过小数点的值

用于测试的一些样本输入值

输入X-->231
DECX 1.010101
MOD 400
循环次数100

但当我尝试实现时,这是Excel VBA代码(Excel 2007) 我经常得到错误的值,绝对没有超过小数点的值

尝试使用各种不同的数据类型;单、双、变型等。。。但是我创建的VBA函数返回的所有值都会返回 整数,并且经常是错误的,肯定不符合 由简单的基于列的语句返回的值

曾试图找到解决方法,遇到“CDEC”,尝试 这一切都没有改变。完全被难住了,想了解一下 如果可以修复此问题,则函数循环返回相同的值 与基于列的语句和 非常感谢您对如何完成此任务的反馈

我在下面包括我的示例代码

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

你的代码有很多错误。就我所见,不需要循环,而且你在mod之后而不是之前分割

这似乎奏效了

Public Function NuFunc(InputX As Variant, DecX As Variant) As Variant
  NuFunc = ((InputX ^ 2) / DecX) Mod 400
End Function

我将只介绍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

您好,谢谢您的反馈-我明白您的意思,这很有帮助,我对此表示感谢,但这并不能解决问题。当函数以输入值“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次迭代进行比较,证明了差异,我只希望函数返回与更麻烦的基于表/列的方法产生的值和精度相同的值和精度。因此,在您上面提供的代码片段中(非常感谢这一点)-我希望能够输入循环/迭代的数量,我不希望只获得输入的一个平方,但是我需要递归这个,同时保留精度和十进制值,而不是self。。不要回答一个问题然后上床睡觉:-)评论不用于长时间的讨论;这个对话已经结束了。嗨,Ron,我刚刚下载了Xnumbers for XP,并将在我的Excel 2007版本中试用它,看看会发生什么-可以这样问吗,您是否为Xnumbers编写了代码/脚本,比如一个mod函数以供测试?如果是的话,你能和我分享一下吗?