2013-09-10 3 views
1

Я не знаю, если это место, чтобы задать такой вопрос, но поскольку это касалось некоторых скриптов VBA, я думал, что это возможно.Macro возвращает #REF! in excel

Я пишу эту функцию Макро:

Function Mod10(tl As String) As Byte 

    Dim c(13) As Integer 
    Dim er As Integer 

    c(13) = Mid(tl, 14, 1) * 2 
    c(12) = Mid(tl, 13, 1) 
    c(11) = Mid(tl, 12, 1) * 2 
    c(10) = Mid(tl, 11, 1) 
    c(9) = Mid(tl, 10, 1) * 2 
    c(8) = Mid(tl, 9, 1) 
    c(7) = Mid(tl, 8, 1) * 2 
    c(6) = Mid(tl, 7, 1) 
    c(5) = Mid(tl, 6, 1) * 2 
    c(4) = Mid(tl, 5, 1) 
    c(3) = Mid(tl, 4, 1) * 2 
    c(2) = Mid(tl, 3, 1) 
    c(1) = Mid(tl, 2, 1) * 2 
    c(0) = Mid(tl, 1, 1) 

    For i = 0 To 13 
     If c(i) > 9 Then 
      c(i) = CInt(Left(c(i), 1)) + CInt(Right(c(i), 1)) 
     End If 
    Next 

    er = 0 
    For i = 0 To 13 
     er = er + c(i) 
    Next 

    Mod10 = 10 - er Mod 10 

End Function 

Но как вы можете видеть здесь, в этой картине:

enter image description here

возвращает ошибку говоря #REF!. Я пишу это в fx: =Mod10(a1).

Сценарий находится здесь: http://kronsell.net/fikkontrol.htm (датский сайт) Он используется для вычисления окончательной цифры в строке. Немного нравится при вычислении кода EAN-13, просто еще один вид вычисления.

Если кто-нибудь с знанием VBA или EXCEL может сказать мне, что делать, я бы очень признателен.

ответ

5

Не знаете почему, но похоже, что Mod10 - это зарезервированное ключевое слово. Я попытался переименовать функцию в Mod_10, и это сработало.

enter image description here

Вы, возможно, потребуется объявить несколько переменных, если вы держите Option Explicit в верхней части модуля.

Попробуйте это и назвать его из клетки с =MOD_10(A1)

Function MOD_10(tl As String) As Byte 

    Dim i As Long 
    Dim c(13) As Integer 
    Dim er As Integer 

    c(13) = Mid(tl, 14, 1) * 2 
    c(12) = Mid(tl, 13, 1) 
    c(11) = Mid(tl, 12, 1) * 2 
    c(10) = Mid(tl, 11, 1) 
    c(9) = Mid(tl, 10, 1) * 2 
    c(8) = Mid(tl, 9, 1) 
    c(7) = Mid(tl, 8, 1) * 2 
    c(6) = Mid(tl, 7, 1) 
    c(5) = Mid(tl, 6, 1) * 2 
    c(4) = Mid(tl, 5, 1) 
    c(3) = Mid(tl, 4, 1) * 2 
    c(2) = Mid(tl, 3, 1) 
    c(1) = Mid(tl, 2, 1) * 2 
    c(0) = Mid(tl, 1, 1) 

    For i = 0 To 13 
     If c(i) > 9 Then 
      c(i) = CInt(Left(c(i), 1)) + CInt(Right(c(i), 1)) 
     End If 
    Next 

    er = 0 
    For i = 0 To 13 
     er = er + c(i) 
    Next 

    MOD_10 = 10 - er Mod 10 

End Function 
+5

'MOD10' действительный адрес ячейки (Excel 2007+), так же, как' A1' –

+1

Это довольно странно, что VBE не выделяет его как зарезервированное ключевое слово. Вместо этого функция просто игнорируется и не выполняется. Если вы попытаетесь переименовать его в 'Function Rem()', он сразу выделит его, так как 'Rem' (* комментарий *) является зарезервированным ключевым словом, но я не вижу никакого соединения между функциями MOD() и' MOD10' как имя функции: O –

+1

Вам также необходимо изменить ссылку 'Mod10' в последней строке функции на' Mod_10'. Дайте мне знать, если это не решит вашу проблему. –