带校验位公式的VBA(Excel)问题

带校验位公式的VBA(Excel)问题,vba,excel,Vba,Excel,我最近写了这个简短的函数,但在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 remaind

我最近写了这个简短的函数,但在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(oddscont&rements),即使这在逻辑上应该是可行的

感谢您的帮助


编辑::删除和工作完美

你的按位
很奇怪,我想你是说

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

我写过类似的东西。代码如下:

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
函数IsCodeValid(sNumber作为字符串)作为布尔值
出错时继续下一步
如果Len(sNumber)<8,则退出功能
IsCodeValid=(右(sNumber,1)=校验位(左(sNumber,Len(sNumber)-1)))
如果错误号为0,则为Debug.Print Now、sNumber、Err.Number、Err.Description
端函数
函数校验位(ByVal gtin作为字符串)作为字符串
通用校验数字计算器
'给出除最后一个数字外的所有数字,计算用于GTIN-8、GTIN-12、EAN13、EDI GLN等的校验位。'。。。
'参数:数字为字符串,不带最后一位
'适用于字符串长度不超过254个字符的情况
'返回:最后一位数字
作者:帕特里克·霍诺雷斯-www.idevlop.com
“注:不提供任何担保
'Copyleft,只要您保持此标题完整
'有关算法的帮助可在此处找到:
'           http://www.gs1.org/barcodes/support/check_digit_calculator#how
Dim m()为字符串,lSum为长,i为整数
Dim chk为整数,大为长,多为字节
'将字符串存储到数组中
m=拆分(StrConv(gtin,vbUnicode),Chr(0))
mult=3'乘数初始值为3
'从右向左计算,以3作为乘数开始
对于i=UBound(m)-1到0步骤-1'忽略数组的最后一个值:它总是=到chr(0)
lSum=lSum+Val(m(i))*mult
如果mult=3,则mult=1,否则mult=3'在3和1之间交换乘数值
接下来我
'找出lSum和等于或大于10的10之间的差异
大=(lSum\10)*10
如果大
不要认为您需要And,只需使用两行代码即可。