functionMOD的Excel错误
我想在我的Excel文件(最好是VBA)中input这个公式。 但是由于某种原因,当我把这个函数放到我的公式栏时,出现错误:
#NUM! - Number Error
我的function是:
=98-mod(2000000000123456*100;97))
但是,当我input10位数字,那么它的工作原理。 我需要使用16位数字。 我正在尝试基本上validation号码基于ISO 7064 Mod 97,10公式在此先感谢。
感谢pepople,为你的努力,但我已经尝试了@Robyn写的代码,并且我得到溢出错误。 这里是我的代码(我将只写Function部分):'注意:input的参数是:3259300700853850和97
Function DblMod(Dividend, Divisor) ' Declare two double precision variables Dim D1 As Double Dim D2 As Double ' Copy function arguments to local variables D1 = Dividend D2 = Divisor DblMod = D1 Mod D2 End Function
正如已经写过的,Excel有15位精度的限制。 所以当你input你的公式时,你的16位数字将被改变:
2000000000123456
变成2000000000123460
一种解决这个限制的方法是使用VBA并改变公式。
input16 digit number * 100
而不是input整个值作为string:
“200000000012345600”
例如:
=98-xMOD("200000000012345600";97)
然后使用这个UDF,它使用VBA的Decimal数据types提供的更高的精度:
Option Explicit Function xMOD(Num As Variant, Div As Long) Dim x As Variant, y As Variant x = CDec(Num) y = CDec(Div) xMOD = x - Int(x / y) * y End Function
如果您要在某个单元格中input16位数字( 以stringforms ),并且总是乘以100,则可以使用以下公式:
=98-xMOD(C1&"00";97)
或者,您可以只input18位数字作为string进入某个单元格,并在公式中引用它,省略&"00"
部分。
另一个选项,如果你能find它,将是一个不受支持的免费加载项称为xNumbers
。 最新版本6.0
仍然适用于Excel 2016,但与function区的集成不存在,因此某些configuration选项无法使用。
编辑由于你写道,你无法得到这个UDF在你的系统中工作,我会发布一个屏幕截图,显示它在我的工作,并且它也同意你在你的恩惠描述中发布的结果。 (xNumbers中的xIntMod也返回相同的结果)
对于abs()小于或等于2,147,483,647的数字
这是每个Microsoft支持文章XL:MOD()函数的已知问题返回#NUM! 错误值 。
请注意,这篇文章是相当过时的 – 所以这可能不是您的实例的真正根源。
本文提出以下解决方法:
而不是使用这个公式
=MOD(J13,K13)
使用这个公式:=J13-(INT(J13/K13)*K13)
或者, 本文提出了一个VBA等价物:
Function DblMod(Dividend, Divisor) ' Declare two double precision variables Dim D1 As Double Dim D2 As Double ' Copy function arguments to local variables D1 = Dividend D2 = Divisor DblMod = D1 Mod D2 End Function
对于abs()大于2,147,483,647的数字
在这种情况下,VBA MOD函数溢出与Run Time Error '6': Overflow
。 这是在Microsoft支持文章PRB:整数部门和MOD操作员“溢出”解决 。 文章build议在VBA中的下面的解决scheme,我已经testing的作品与预期的OP给定的数字:
Sub Main() Call DblMod2(3259300700853850, 97) ' returns 46, which matches the Big Integer Calculator at http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm suggested by Ron End Sub Function DblMod2(Dividend, Divisor) Dim dblX As Double Dim dblY As Double dblX = Dividend ' numerator dblY = Divisor ' denominator ' round off the numerator and denominator (ensure number is .0) dblX = Int(dblX + 0.5) dblY = Int(dblY + 0.5) ' Emulate integer division with: Fix(dblX / dblY) ' Emulate modulo arithmetic with: dblX - (dblY * Fix(dblX / dblY)) DblMod2 = dblX - (dblY * Fix(dblX / dblY)) Debug.Print DblMod2 End Function
这里有一个MODfunction的替代scheme
a - (b * (a / b)) =98-((2000000000123450*100)-(97*((2000000000123450*100)/97)))
编辑1
尝试下面,它将返回46
Function DblMod(Dividend, Divisor) ' Declare two double precision variables Dim D1 As Double Dim D2 As Double Dim D3 As Double Dim str1 Dim Str2 ' Copy function arguments to local variables D1 = CDbl(Dividend) D2 = Divisor DblMod = CDec(D1) - (Round(CDec(D1) / D2) * D2) End Function
Sub test() test = DblMod("3259300700853850", 97) End Sub
而不是处理非常大的数字,只需要像这样分割它们:
Public Function ExtMod(Dividend As String, Divisor As Long) As Double Dim i As Long, j As Double For i = 1 To Len(Dividend) If Not IsNumeric(Mid(Dividend, i, 1)) Then j = j & Mid(Dividend, i) Exit For End If j = j * 10 + Mid(Dividend, i, 1) While j >= Divisor j = j - Divisor Wend Next ExtMod = j End Function
也适用于小数点和区域设置不应该。 唯一的限制是你可能永远不会碰到的string的最大长度。
用“123456789012345678901234567890.3241543”和643即435.3241543进行testing。
如果你有问题,就问吧 ;)