Accéder au contenu principal

Check digit et validation de code EAN

J'ai bien souvent cherché ce type de calcul qui s'applique à divers codes. Lassé de ne trouver que du code illisible et limité dans son usage, j'ai décidé d'écrire ma version en partant des explications.


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

Commentaires

Posts les plus consultés de ce blog

Créer des références externes dynamiques en Excel (1)

Dans des formules Excel, on a parfois besoin de se référer a une plage de cellules se trouvant dans un autre document (classeur/workbook).
Exemple: on a un document "portefeuille.xls" qui se réfere au document "tauxChange.xls".
Si le chemin d'acces au document externe change, la référence ne fonctionnera plus.
Pour éviter ce probleme, une solution serait de pouvoir utiliser une référence "relative", qui permettrait, par exemple, de pointer vers le classeur "tauxChange.xls" se trouvant dans le meme dossier que le classeur "portefeuille.xls". Ceci permettrait d'utilliser la paire de fichiers n'importe où, pourvu qu'ils soient tous deux dans le meme dossier.
Mais comment faire ?
Recupérer le chemin du document en cours en C5:
=CELL("filename") permet de retrouver le chemin complet du document ou il est utilisé, et me retournera:
H:\test excel\[portefeuille.xls]Actifs
"Actifs" étant le nom de la feuille ou e…

Champs obligatoires dans un formulaire Access

Comment rendre des champs obligatoires dans un formulaire Access ? La réponse la plus évidente est de modifier le design de la table et d'assigner au paramètre Required la valeur True.
L'ennui de cette méthode est que le message d'erreur d'Access n'est pas très convivial et ne spécifie pas quel champ a déclenché l'erreur.
Plutôt que d'écrire une routine de gestion d'erreur complexe, il y a une solution toute simple:

affecter la valeur Faux à la propriété  Required du champ,Validation Rule: Is Not NullValidation Text: le texte à afficher, ex: "Code Postal obligatoire"..et le tour est joué. Cette astuce vient de l'excellent Allen Browne, dont le site (en anglais) regorge d'informations utiles sur Access.

ps: je n'ai pas sous la main de version française d'Access pour la traduction des propriétés, désolé...