créer des codes barre EAN 13 à partir d'une référence à 13 chiffres

Bonjour à tous,

Libreoffice 6.0
Windows 10

Je voudrais créer dans Calc des codes barre EAN 13 à partir des références
EAN à 13 chiffres qui existent sur les tableaux en colonnes.

J'ai essayé 2 solutions :

1) j'ai installé l'extension barcode 1.3.5.0. Malheureusement, j'obtiens un
message d'erreur à l'installation.
Le voici :
"(com.sun.star.uno.RuntimeException) { { Message = "<class
'AttributeError'>: module 'uno_component' has no attribute
'writeRegistryInfo', traceback follows\X000a File \"C:\\Program
Files\\LibreOffice\\program\\pythonloader.py\", line 152, in
writeRegistryInfo\X000a return mod.writeRegistryInfo(
self.ctx.ServiceManager, regKey )\X000a\X000a", Context =
(com.sun.star.uno.XInterface) @0 } }

2) j'ai installé la police EAN13.ttf
Si je sélectionne la police CodeEAN13, j'obtiens tous des codes barres
identiques malgré des références différentes.

Merci d'avance de votre réponse.
Cordialement,

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.

Je complète ma réponse précédente.

Que faudrait-il modifier dans cette macro pour qu'elle fonctionne aussi avec 13 chiffres ?

Merci bien.

Bonjour,

1- Premier élément de réponse pour l'extension, c'est une version Beta, non stable et testée pour Libo 3.5, donc de fin 2012.

On peut donc considérer qu'elle est obsolète et abandonnée (j'ai le même message d'erreur à l'installation).

2- J'ai téléchargé la police EAN13 (en shareware) ici

http://www.eticoncept.com/telechargement-polices-codes-a-barres-windows-fonts/

et ça fonctionne très bien sous Libo Win 8.1 Version: 6.2.6.2 (x64)

Nicolas Paour

Bonjour à tous,

Pour répondre à Nicolas, c'est surtout un problème de macro et non de
police. Je garde néanmoins le lien.

J'ai fait réalisé un copier coller de la macro donnée par le site grandzebu
dans une macro vide de mon classeur.
Ce n'est pas très élégant comme démarche pour créer une nouvelle macro. Et
de plus, c'est peut-être pour cela que la macro ne fonctionne pas très bien
?

Existe-t-il un moyen d'importer une macro qui provient 'un autre classeur ou
est-ce la bonne méthode pour créer une nouvelle macro ?

merci d'avance.

Bonjour,

La solution pourrait être effectivement de supprimer le dernier caractère
de droite (la clé de contrôle).

Je sais qu'il existe une fonction pour extraire les 12 caractères de gauche
de la chaîne des 13 caractères.
En l'ayant extrait dans ce cas (et donc enlevé la clé de contrôle), la macro
fonctionne, elle produit à la fois la clé de contrôle (qui est identique au
caractère de droite enlevé) et le code barres EAN 13.

Question :
Quelle est la fonction qui permet d'extraire les 12 caractères de gauche ?

Merci.

Bonsoir
La fonction "Gauche" ?
Du genre : =GAUCHE(B1;12) ; affichera les 12 caractère de gauche de la cellule B1.

@+
Luc

----- Mail original -----

De: "Mamin Luc" <luc.mamin@helem.fr>
À: users@fr.libreoffice.org
Envoyé: Samedi 21 Septembre 2019 19:13:23
Objet: Re: [fr-users] Re: créer des codes barre EAN 13 à partir d'une référence à 13 chiffres

Bonsoir
La fonction "Gauche" ?
Du genre : =GAUCHE(B1;12) ; affichera les 12 caractère de gauche de
la
cellule B1.

@+
Luc

bonjour,

il suffit de trouver le script en utilisant tr ou
sed and awk sur un fichier texte (csv)

merci pour votre aimable attention

bien à vous
bernard

Merci Luc : ça marche.
J'ai donc les 12 caractères de la ref. EAN sans la clé de contrôle dans une
cellule. J'applique la macro qui va bien puisque avec 12 chiffres, elle
fonctionne correctement.
J'obtiens donc le code barre EAN13 avec sa clé de contrôle.

Par contre, je n'ai pas compris la réponse de Bernard : désolé.

Merci Luc : ça marche.
J'ai donc les 12 caractères de la ref. EAN sans la clé de contrôle dans une
cellule. J'applique la macro qui va bien puisque avec 12 chiffres, elle
fonctionne correctement.
J'obtiens donc le code barre EAN13 avec sa clé de contrôle.

il faudrait ajouter un petit contrôle si la clé correspond bien à celle générée par la macro et ce serait parfait

et en partageant le résultat, ce serait 'plus-que-parfait' !

Par contre, je n'ai pas compris la réponse de Bernard : désolé.

je pense qu'elle était pour un autre fil

Gérard

Bonjour à tous,

Oui, j'allais poser justement la question. Gérard m'a précédé dans la
pensée. :wink:

Oui, effectivement, ce serait bien de vérifier si la clé générée par la
macro est bien identique à celle enlevée au départ. Une solution pour ça ?

Comme dit Gérard, ce serait plus que parfait ! :slight_smile:

Bonjour,
On n'y comprends plus rien:
Quelle est la problématique de départ??
Quelles sont les solutions proposées??
Cordialement.
Anne-Sophie.

----- Mail original -----

Bonsoir à tous,

Voici un petit résumé du fil de discussion :

1) Tout d'abord, j'ai besoin d'un tableau réalisé dans Calc pour produire
des codes barres EAN 13. Les codes barres EAN 13 sont produits à partir des
références EAN 13 issus d'un catalogue fournisseur.
Ce tableau servira à alimenter la base de données EAN 13 d'une caisse
enregistreuse de petit commerce. En scannant le code barres par la vendeuse,
la caisse automatique affichera automatiquement la désignation de l'article,
le prix, la quantité et sans doute d'autres renseignements complémentaires.

J'ai réalisé différents essais avec une extension qui ne correspond pas car
elle renvoie un message d'erreur (en fait, cette extension est devenue
obsolète).
D'où ma demande d'aide sur ce forum.

2) En première réponse : Franck a proposé d'utiliser la macro disponible
pour openoffice sur le site grandzebu :
https://grandzebu.net/informatique/codbar/ean13.htm

3) j'ai donc installé la macro (qui s'appelle essai code ean13.sxc) qui
provient du site grandzebu. Elle ne fonctionne que si on enlève la clé de
contrôle du code EAN13, cad le dernier chiffre à droite.
Petit rappel : la référence EAN13 comporte 13 chiffres. La clé de contrôle
du code EAN13 est le 13ème chiffre (le dernier situé à droite). Tout cela
est bien expliqué sur le lien du site grandzebu pour ceux qui voudraient
plus d'explications. J'avais aussi posé la question : comment importer une
macro dans LO. Entre temps, j'ai trouvé.

4) J'avais posé la question pour savoir si quelqu'un pourrait modifier la
macro pour qu'elle fonctionne aussi avec les 13 chiffres.
N'ayant pas eu de réponse, on (Franck et moi) avons contourné le problème en
enlevant la clé de contrôle pour que la macro puisse produire le code
barres.
D'où ma question : comment extraire la clé de contrôle de la référence EAN13
?

5) j'ai donc utilisé la fonction Gauche proposée par Luc qui permet
d'enlever la clé de contrôle de la référence EAN13. Ensuite, à partir de
cette valeur à 12 chiffres, la macro calcule bien la clé de contrôle et
affiche la code barre correspondant. En enlevant la clé, on obtient la clé
de contrôle calculée par la macro et le code barre associé.

6) Une précaution quand même pour être certain de la véracité des données :
vérifier que la clé de contrôle enlevée de la référence ean13 (avec la
fonction Gauche) avant le lancement de la macro est bien identique à la clé
de contrôle produite par la macro au moment de la création du code barres
ean13.
D'où ma dernière question : comment comparer la clé enlevée et la clé créée
par la macro ?

J'espère que cette synthèse vous conviendra.

j'en profite pour remercier tous ceux qui m'ont déjà répondu. Mon problème
est presque résolu.

Je mets en pièce jointe une petite partie du tableau. Les colonnes C, D et F
seront masquées. tableau_avec_macro_ean13_en_essai.ods
<http://document-foundation-mail-archive.969070.n3.nabble.com/file/t491156/tableau_avec_macro_ean13_en_essai.ods>

Bonsoir,

Parfait!

Si "tout le monde" pouvait:
1- Faire "Répondre à tous";
2- Au final "résumer" sa problématique et les réponses proposées ce serait génial et surtout plus facile pour suivre les fils de discussion.

Merci.

Anne-Sophie.

----- Mail original -----

Bonjour,
la fonction stxt(/codeEAN/;14;1) permet d'extraire le 14ème caractère
(lettre comprise entre a et j) du code généré par la macro.
la fonction TEXTE(CHERCHE(/14èmeCar/;"abcdefghij")-1;"#") donne la somme de
conrôle à comparer au dernier caractère du code initial à 13 chiffres.
je joins le fichier correspondant :
tableau_avec_macro_ean13_avec_test_checksum.ods
<http://document-foundation-mail-archive.969070.n3.nabble.com/file/t485575/tableau_avec_macro_ean13_avec_test_checksum.ods>

Franck

Bonjour,
Pourriez-vous rappeler la problématique de départ et les solutions proposées?
Merci.
Cordialement.
Anne-Sophie.

----- Mail original -----

Bonjour

À propos de ce fil :
- sa problématique est inscrite dans le sujet ;
- tous les messages du fil concernent bien la question de départ, sauf un peut-être (en même temps, j'y ai rien compris) ;
- une réponse a été faite par erreur en privé. Cela a été corrigé par Etienne qui a répondu à la liste ;
- quant Étienne écrit depuis Nabble, il s'appelle "Pingouin du bureau", quand il écrit depuis son Thunderbird, il s'appelle "Etienne", ça m'a troublé moins d'une seconde ;
- certaines réponses sont faites en ne sélectionnant qu'une partie d'un message reçu : je n'aime pas trop, mais cela est courant quand la réponse ne porte que sur un point précis.

Malgré une question initiale qui ne m'intéressait pas à priori, j'ai pu suivre facilement les échanges, d'autant que le message initial ayant été posté depuis la plate-forme nabble, les pieds de message contiennent le lien qui va bien pour y retrouver l'ensemble du fil si on le perd...

@+
Luc

Bonsoir à tous,

merci de ta réponse, Franck.

Pour améliorer encore un peu la lisibilité du tableau des codes barres, s'il
comporte des centaines ou milliers de lignes, serait-il possible d'ajouter
un compteur des cellules qui indiquent une erreur ko ? Je pourrai la mettre
dans une cellule en haut de tableau. Je verrai tout de suite s'il y a une
erreur ou pas.

Le problème, c'est que je ne connais pas vraiment les fonctions à part, la
fonction Somme.

Bonsoir,

Désolée du dérangement!!!

Cordialement.

Anne-Sophie.

----- Mail original -----

Je ne suis pas un spécialiste des tableurs, mais j'ai mis assez souvent le
nez dans l'aide... Perdre du temps à découvrir les fonctions, c'est en
gagner beaucoup !
La fonction NB.SI(/plageOùcompter/;critère) donne le résultat; dans ta
feuille j'ai rajouté en G1 (en haut comme tu le souhaites) la formule
=NB.SI(G2:G10000;"ko"). La formule fonctionne jusqu'à 10 000 lignes.
Pour t'encourager à lire l'aide :wink: j'ai aussi utilisé des formatages
conditionnels qui mettent en évidence les erreurs (en colonne G) ou
l'absence d'erreurs (en ligne1)
J'ai aussi supprimé les lignes vides (une sur deux) qui servaient sans doute
à "espacer"; cela permet de copier les formules en "tirant" le coin de la
cellule vers la cellule adjacente; pour l'espace il vaut mieux jouer sur la
hauteur des lignes.
le résultat dans le fichier joint :
tableau_avec_macro_ean13_avec_test_checksum+compteur.ods
<http://document-foundation-mail-archive.969070.n3.nabble.com/file/t485575/tableau_avec_macro_ean13_avec_test_checksum%2Bcompteur.ods>

Franck