Oui, je viens de regarder. C'est très bien.
J'ai installé la macro pour openoffice. Elle fonctionne aussi pour libreoffice, enfin presque.
D'après ce que j'ai cru comprendre, cette macro analyse la référence fournisseur. Si elle trouve 12 chiffres, elle calcule la clé de contrôle (dernier chiffre à droite de la réf.) et affiche le code barre EAN13 dans la colonne suivante.
Si la macro trouve 13 chiffres, elle analyse les 13 chiffres pour vérifier si la clé est bonne. Si la clé est bonne, elle affiche le code barre EAN13.
Si elle trouve que la clé n'est pas bonne, l'affichage reste vide.
Or quand j'enlève le dernier caractère de droite sur la ref (clé de contrôle), la macro calcule cette clé que je viens d'effacer et me propose la clé de contrôle avec la même valeur, et donc, du coup, elle m'affiche le code barre.
Et donc, pour moi, la clé de contrôle que j'enlève est bonne alors que la macro la considère comme mauvaise.
Voici le code de la macro :
REM ***** BASIC *****
Public Function ean13$(chaine$)
'V 1.0
'Paramètres : une chaine de 12 chiffres
'Retour : * une chaine qui, affichée avec la police EAN13.TTF, donne le code barre
' * une chaine vide si paramètre fourni incorrect
Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean
ean13$ = ""
'Vérifier qu'il y a 12 caractères
If Len(chaine$) = 12 Then
'Et que ce sont bien des chiffres
For i% = 1 To 12
If Asc(Mid$(chaine$, i%, 1)) < 48 Or Asc(Mid$(chaine$, i%, 1)) > 57 Then
i% = 0
Exit For
End If
Next
If i% = 13 Then
'Calcul de la clé de contrôle
For i% = 2 To 12 Step 2
checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
Next
checksum% = checksum% * 3
For i% = 1 To 11 Step 2
checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
Next
chaine$ = chaine$ & (10 - checksum% Mod 10) Mod 10
'Le premier chiffre est pris tel quel, le deuxième vient de la table A
CodeBarre$ = Left$(chaine$, 1) & Chr$(65 + Val(Mid$(chaine$, 2, 1)))
first% = Val(Left$(chaine$, 1))
For i% = 3 To 7
tableA = False
Select Case i%
Case 3
Select Case first%
Case 0 To 3
tableA = True
End Select
Case 4
Select Case first%
Case 0, 4, 7, 8
tableA = True
End Select
Case 5
Select Case first%
Case 0, 1, 4, 5, 9
tableA = True
End Select
Case 6
Select Case first%
Case 0, 2, 5, 6, 7
tableA = True
End Select
Case 7
Select Case first%
Case 0, 3, 6, 8, 9
tableA = True
End Select
End Select
If tableA Then
CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1)))
Else
CodeBarre$ = CodeBarre$ & Chr$(75 + Val(Mid$(chaine$, i%, 1)))
End If
Next
CodeBarre$ = CodeBarre$ & "*" 'Ajout séparateur central
For i% = 8 To 13
CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1)))
Next
CodeBarre$ = CodeBarre$ & "+" 'Ajout de la marque de fin
ean13$ = CodeBarre$
End If
End If
End Function
Merci bien.