2010-12-08 46 views
1

嗨,我有一个产生12位数字的UPC码(基于第一11位JavaScript函数:Javascript转换为Excel VB功能生成#NUM!错误

function ccc12(rawVal) { 
    factor = 3; 
    sum = 0; 
    rawVal = rawVal.toString(); 
    if (rawVal.length!=11){ 
     throw "The UCC-12 ID Number requires that you enter 11 digits."; 
    } 
    for (index = rawVal.length; index > 0; --index) { 
    sum = sum + rawVal.substring (index-1, index) * factor; 
    factor = 4 - factor; 
    } 
    return ((1000 - sum) % 10); 
} 

假设上面如果我给84686400201作为rawVal,然后2将结果返回。 这是再转换为

Function generateUPC(upcCode As Integer) As String 
    Dim upcCheckDigit, factor, sum As Integer 
    Dim upcString As String 
    factor = 3 
    sum = 0 

    For i = Len(upcCode) To 0 Step -1 
     sum = sum + Mid(upcCode, i - 1, 1) * factor 
     factor = 4 - factor 
    Next i 
    upcCheckDigit = ((1000 - sum) Mod 10) 
    upcString = upcCode & upcCheckDigit 

    generateUPC = upcString 
End Function 

该函数返回原始字符串加上一个数字,而是我得到#NUM!在工作表中,当我把= generateUPC(84686400201)进入细胞。

有何想法?从来没有真正困扰做VB宏等之前,所以这是我新

回答

2

我建议改变upcCode为一个字符串,以避免溢出,改变Mid函数内的循环和索引,以避免超出界限的错误。

Function generateUPC(upcCode as String) As String 
    Dim upcCheckDigit, factor, sum As Integer 
    Dim upcCode, upcString As String 
    factor = 3 
    sum = 0 

    For i = Len(upcCode) To 1 Step -1 
     sum = sum + Mid(upcCode, i, 1) * factor 
     factor = 4 - factor 
    Next i 
    upcCheckDigit = ((1000 - sum) Mod 10) 
    upcString = upcCode & upcCheckDigit 

    generateUPC = upcString 
End Function 
2

VBA整数是-32K至+ 32K

VBA多头是-2B至+ 2B

你“upcCode”整数大于长数据类型,所以我有双,这是一个浮动尝试过,但工作原理:

Function generateUPC(upcCode As Double) As String 
    Dim upcCheckDigit, factor, sum As Double 
    Dim upcString As String 
    factor = 3 
    sum = 0 

    For i = Len(upcCode) To 0 Step -1 
     sum = sum + Mid(upcCode, i - 1, 1) * factor 
     factor = 4 - factor 
    Next i 
    upcCheckDigit = ((1000 - sum) Mod 10) 
    upcString = upcCode & upcCheckDigit 

    generateUPC = upcString 

End Function 
+0

尽管我将第一个答案标记为正确,但这同样好。也赞成你指出整数与长期问题的事实。 – CogitoErgoSum 2010-12-08 21:58:01