检查数字公式的VBA(Excel)问题

时间:2016-01-06 16:14:07

标签: excel vba excel-vba

我最近编写了这个简短的函数,但是在VBA中没什么经验,我没有理解为什么这不起作用。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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