Javascript преобразован в Excel VB Функция производит #NUM! ошибка - PullRequest
1 голос
/ 08 декабря 2010

Эй, ребята, у меня есть функция JavaScript, которая выдает 12-значный код UPC (на основе первых 11 цифр:

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 ]

2 голосов
/ 08 декабря 2010

Я предлагаю изменить 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 голосов
/ 08 декабря 2010

Целочисленные значения VBA составляют от -32k до + 32k

Длинные значения VBA составляют от -2B до + 2B

Ваше целое число 'upcCode' больше, чем тип данных long, поэтому я попробовал его с Double,который является поплавком, но работает:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...