2016-01-06 19 views
0

Я недавно написал эту короткую функцию, но с небольшим опытом работы в VBA im не смог понять, почему это не работает.Вопрос VBA (Excel) с формулой Check Digit

Sub barcodedigit() 
Dim barcode(12) As Variant 
Dim i As Integer 
Dim oddscount As Integer 
Dim evenscount As Integer 
Dim evensnumbers As Integer 
Dim oddsnumbers As Integer 
Dim finalnumber As Double 
Dim remainder As Integer 
oddsnumbers = 0 
evensnumbers = 0 

For i = 1 To 12 

barcode(i) = InputBox("Please enter number" & i) 

Next i 

For i = 1 To 12 
If barcode(i) Mod 2 = 0 Then 
evenscount = evenscount + 1 And evensnumbers = evensnumbers + barcode(i) 

Else 

oddscount = oddscount + 1 And oddsnumbers = oddsnumbers + barcode(i) 


End If 

Next i 

oddsnumbers = oddsnumbers * 3 

finalnumber = oddsnumbers + evensnumbers 

remainder = finalnumber Mod 10 

MsgBox ("Oddscount is equal to " & oddscount & vbNewLine & "Remainder is equal to" & " " & remainder) 
End Sub 

Моя проблема в том, что это устанавливает каждый результат 0 (oddscount & остатка), хотя это должно логически работать.

Любая помощь приветствуется.

Редактировать: удалять и работать отлично!

+2

Не думайте, что вам нужно И, просто используйте 2 строки кода. –

ответ

2

Ваш побитовое And очень странно — я думаю, вы имеете в виду

If barcode(i) Mod 2 = 0 Then 
    evenscount = evenscount + 1 
    evensnumbers = evensnumbers + barcode(i) 
Else 
    oddscount = oddscount + 1 
    oddsnumbers = oddsnumbers + barcode(i) 
End If 
0

я написал что-то вроде этого here. Вот код:

Function IsCodeValid(sNumber As String) As Boolean 
    On Error Resume Next 
    If Len(sNumber) < 8 Then Exit Function 
    IsCodeValid = (Right(sNumber, 1) = CheckDigit(Left(sNumber, Len(sNumber) - 1))) 
    If Err.Number <> 0 Then Debug.Print Now, sNumber, Err.Number, Err.Description 
End Function 

Function CheckDigit(ByVal gtin As String) As String 
'general purpose check digit calculator 
'given all figures except last one, calculate check digit as used for GTIN-8, GTIN-12, EAN13, EDI GLN, etc... 
'parameter: number as string, WITHOUT the last digit 
'   works with string length up to 254 char 
'returns: the last digit 
'author: Patrick Honorez - www.idevlop.com 
'notes:  provided without any warranties 
'   Copyleft as long as you keep this header intact 
'help for algorithm can be found here: 
'   http://www.gs1.org/barcodes/support/check_digit_calculator#how 

    Dim m() As String, lSum As Long, i As Integer 
    Dim chk As Integer, large As Long, mult As Byte 
    'store string into an array 
    m = Split(StrConv(gtin, vbUnicode), Chr(0)) 
    mult = 3 'multiplier initial value is 3 
    'calc right to left to start with 3 as multiplier 
    For i = UBound(m) - 1 To 0 Step -1 'ignore last value of array: it's always = to chr(0) 
     lSum = lSum + Val(m(i)) * mult 
     If mult = 3 Then mult = 1 Else mult = 3 'swap multiplier value between 3 and 1 
    Next i 
    'find difference between lSum and the 10 that's equal or greater 
    large = (lSum \ 10) * 10 
    If large < lSum Then large = large + 10 
    chk = large - lSum 
    CheckDigit = CStr(chk) 
End Function 
Смежные вопросы