Para verificar la entrada de datos de un código de barras con el formato EAN13 podemos utilizar la siguiente función:

Function DCEAN(numero As String) As String
‘Funcion de cálculo del DC de un código EAN 13
On Error GoTo ctrlerrorEan
Dim a As Integer
Dim strNum(12) As Integer
Dim resultado As Integer
Dim decena As Integer
Dim digito As Integer
If Len(numero) < 12 Then
DCEAN = numero
Exit Function
End If
If Len(numero) > 13 Then
DCEAN = numero
MsgBox “Número de longitud superior a norma” & vbCrLf & “EAN-13″, vbInformation, “EAN-13″
Exit Function
End If
If Len(numero) = 13 Then


‘Se debería comprobar que el digito de la derecha es el correcto EAN-13
DCEAN = numero
Exit Function
End If

‘Números pares de la cadena por 3
For a = 1 To 12 Step 2
strNum(a) = CInt(Mid(numero, 12 – a, 1))
strNum(a) = strNum(a) * 1
Next a

‘Números impares de la cadena por 1
For a = 0 To 11 Step 2
strNum(a) = CInt(Mid(numero, 12 – a, 1))
strNum(a) = strNum(a) * 3
Next a

‘Sumar todos los números
For a = 0 To 11
resultado = resultado + strNum(a)
Next a
If resultado = (Int(resultado / 10) * 10) Then
decena = (Int(resultado / 10) * 10)
Else
decena = (Int(resultado / 10) * 10) + 10
End If
digito = decena – resultado
DCEAN = numero & CStr(digito)
Exit Function
ctrlerrorEan:
MsgBox “Error Nº ” & Err.Number & vbCrLf & “Descripción: ” & Err.Description, vbInformation, “EAN-13″
Resume Next
End Function

Fuente: Foro de Access y VBA

Otra función para el mismo propósito:

Public Function DCEAN13(strCodigo As String) As Boolean
Dim i as long, bytTotal As Byte, bytDC As Byte
On Error GoTo DCEAN13_TratamientoErrores
If Len(strCodigo) <> 13 Then MsgBox “El código ” & DCEAN13 & ” no es correcto”, vbOKOnly + vbCritical, “ATENCION”
End If

‘El dígito de control, que va en decimo tercera posición, se calcula acumulando el producto de los digitos pares de los doce primeros carácteres por 3 y por 1 los impares, redondeando el resultado a la decena mas alta y por ultimo calculando la diferencia entre ellos.

For i = 1 To 12
Select Case i Mod 2
Case 0
bytTotal = bytTotal + Mid(strCodigo, i, 1) * 3
Case 1
bytTotal = bytTotal + Mid(strCodigo, i, 1)
End Select
Next i
BytDC = RedondearADecenaSuperior(bytTotal) – bytTotal
If bytDC <> Right(strCodigo, 1) then
Msgbox “El código ” & DCEAN13 & ” no es correcto”, vbOKOnly + vbCritical, “ATENCION”

DCEAN13=False
Else
DCEAN13=True
End If
DCEAN13_Salir:
On Error GoTo 0
Exit Function
DCEAN13_TratamientoErrores:
Msgbox “Error ” & Err.Number & ” en proc.: DCEAN13 de Módulo: Módulo 3 (” & Err.Description & “)”
GoTo DCEAN13_Salir
End Function

Con la siguiente función redondea el valor pasado como parámetro a la decena superior

Public Function RedondearADecenaSuperior (BVal bytNumero As Byte) As Byte
Dim lngCociente as Long
On Error GoTo RedondearADecenaSuperior_TratamientoErrores
lngCociente = bytNumero / 10
If lngCociente – bytNumero / 10 <> 10 then
lngCociente = lngCociente + 1
End If
RedondearADecenaSuperior = lngCociente * 10
RedondearADecenaSuperior_Salir:
On Error GoTo 0
Exit Function
RedondearADecenaSuperior_TratamientoErrores:
Msgbox “Error ” & Err.Numer & ” en proc.: RedondearADecenaSuperior de Móculo: Módulo3 (” & Err.Descrption & “)”
GoTo RedondearADecenaSuperior_Salir
Exit Function

Fuente: Foro de Access y VBA 

One Response to “Dígito de control de un EAN13”

  1. julisho Says:

    La segunda funcion no es correcta. Los numeros de las posiciones impares son los que deben multiplicarse por 3, y los numeros de las posiciones pares, por 1.


Leave a Reply