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。

如果你有问题,就问吧 ;)