IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

[EXCEL 2016, RegEX] Décoder code GS1-128


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [EXCEL 2016, RegEX] Décoder code GS1-128
    Bonjour,

    Je cherche à décoder des codes barre au format GS1-128

    Pour résumer:
    Le code scanné via mon lecteur de code barre USB:
    ]C1010088387386779211220927172309271022092721PC23713163

    Le résultat désiré:
    (01)00883873867792(11)220927(17)230927(10)220927(21)PC23713163
    - (01) Identifiant de l'appareil : 00883873867792
    - (11) Date de fabrication : 220927
    - (17) Date d'expiration : 230927
    - (10) Numéro de lot/lot : 220927
    - (21) Numéro de série : PC23713163

    J'ai commencé par supprimer les 3 premiers caractères "Identifiants AIM" qui définissent le type de code barre, mais inutile dans l'identification du produit.

    Identifiants AIM:
    ]C1 = GS1-128
    ]e0 = GS1 DataBar
    ]d2 = GS1 DataMatrix
    ]Q3 = GS1 QR Code
    ]J1 = GS1 DotCode

    Formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(A10; "]C1"; ""); "]e0"; ""); "]d2"; ""); "]Q3"; ""); "]J1"; "")
    Après recherche sur la valeur des "Identificateurs application GS1"

    01 = Numéro d'article (GTIN) = 14 caractères.
    11 = Date de production = 6 caractères.
    17 = Date d'expiration = 6 caractères.
    10 = Le numéro de lot = variable jusqu'à 20 caractères.
    21 = Le numéro de série = variable jusqu'à 20 caractères.

    Pour le découpage du code barre, j'utilise la fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Public Function ExtractUsingRegex(text As String, pattern As String, Optional instance_num As Integer = 0, Optional match_case As Boolean = True) As Variant
        Dim regex As Object
        Dim matches As Object
        Dim matches_index As Integer
        Dim text_matches() As Variant
        On Error GoTo ErrHandl
     
        Set regex = CreateObject("VBScript.RegExp")
     
        regex.pattern = pattern
        regex.Global = True
        regex.MultiLine = True
        regex.IgnoreCase = Not match_case
     
        Set matches = regex.Execute(text)
     
        If matches.Count > 0 Then
            If instance_num = 0 Then
                ReDim text_matches(matches.Count - 1, 0)
                For matches_index = 0 To matches.Count - 1
                    text_matches(matches_index, 0) = matches.Item(matches_index)
                Next matches_index
                ExtractUsingRegex = text_matches
            ElseIf instance_num <= matches.Count Then
                ExtractUsingRegex = matches.Item(instance_num - 1)
            End If
        End If
     
        Exit Function
     
    ErrHandl:
        ExtractUsingRegex = CVErr(xlErrValue)
    End Function
    Le traitement sur les caractères entre parenthèses sera géré après.

    Ce qui donne:
    En A10 : 010088387386779211220927172309271022092721PC23713163


    1) (01) Identifiant de l'appareil
    Formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ExtractUsingRegex(A10;"01(\d{14})")
    Résultat : 0100883873867792
    OK

    2) (11) Date de fabrication
    Formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ExtractUsingRegex(A10;"11(\d{6})")
    Résultat : 11220927
    OK

    3) (17) Date d'expiration
    Formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ExtractUsingRegex(A10;"17(\d{6})")
    Résultat : 17230927
    OK

    4) (10) Numéro de lot/lot
    Formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ExtractUsingRegex(A10;"10([^\u001D]{1,20})")
    Résultat: 1008838738677921122092
    Pas OK la formule attaque le début du code barre
    J'ai essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ExtractUsingRegex(A10;"10([!”%-/0-9:-?A-Z_a-z]{0,20})")
    Même résultat !

    Je bloque donc au (10) Numéro de lot/lot.

    J'espère que vous pourrez m'aider?

    Mon approche n'est peut-être pas la bonne et mes compétences sont limités à l'usage bureautique et macro de base.

    Une source JavaScript qui reprend ce que je cherche à faire peut aider!
    https://github.com/CarlTuji/GS1-128-...oder/tree/main
    Plus précisément:
    https://github.com/CarlTuji/GS1-128-...egs1decoder.js

    Bien cordialement

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 229
    Par défaut
    Hello,
    voici une fonction personnalisée qui capture tous les champs du code barre. Le premier paramètre est la chaîne, le deuxième paramètre est le numéro de l'info demandée (ex 1 pour le code d'identification). Si le code barre n'est pas de type GS1-128 (]C1) ou si le code ne semble pas être bon la fonction renvoie Erreur sinon elle renvoie l'info demandée. L'info demandée ne contient pas le préfixe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Function ExtractInfoGS1_128(Chaine As String, numInfo As Integer) As String
        ' Création de l'objet RegExp
        ExtractInfoGS1_128 = "Erreur"
        Set regEx = CreateObject("VBScript.RegExp")
        regEx.Global = True
        regEx.IgnoreCase = True
        regEx.Pattern = "\]C101(\d{14})11(\d{6})17(\d{6})10(\d+)21(PC\d+)$" ' Expression régulière
        Set matches = regEx.Execute(Chaine)
        If matches.Count = 1 Then
           Debug.Print "Identifiant de l'appareil : ", matches(0).submatches(0)
           Debug.Print "Date de fabrication : ", matches(0).submatches(1)
           Debug.Print "Date d'expiration : ", matches(0).submatches(2)
           Debug.Print "Numéro de lot/lot : ", matches(0).submatches(3)
           Debug.Print "Numéro de série : ", matches(0).submatches(4)
           ExtractInfoGS1_128 = matches(0).submatches(numInfo - 1)
        End If
    End Function
    Code VBA pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub TestRegex()
    Debug.Print ExtractInfoGS1_128("]C1010088387386779211220927172309271022092721PC23713163", 3)
    End Sub
    Les Debug.Print de la fonction sont à mettre en commentaires si la fonction fonctionne correctement

    Ami calmant, J.P

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai trouvé une information qui manquait!

    To be compatible with the GS1 system, a barcode scanner must:

    Emit a AIM symbology identifier modifier indicating that FNC1 is in first position ("GS1 mode"), or provide an equivalent flag for the same.
    Transmit any FNC1 characters, other than the one in first or second character position, as GS characters (ASCII value 29).

    This transmission protocol for FNC1 goes as far back as the first symbology to support GS1 Application Identifier data, Code 128:
    Concernant:
    10 = Le numéro de lot = variable jusqu'à 20 caractères.
    21 = Le numéro de série = variable jusqu'à 20 caractères.

    En scannant le code-barres dans Notepad ++, j'obtiens:

    ]C10100883873867792112207071723070710220707GS21PC22412085

    J'ai donc mon FNC1 = "]C1"
    Et le "GS" de l'Identificateurs d'application (10).

    Si j'ai bien compris.
    (10) Le numéro de lot = "GS" jusqu'au premier 10 vers la gauche.

    10220707GS

    (21) Le numéro de série, n'est pas impacté dans ce cas, car il est le dernier, mais ce n'est pas toujours le cas sur d'autres codes-barres, dans ce cas il aura lui aussi sont "GS".

    J'ai encore besoin de vous pour ce travail?

    Bien cordialement

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 229
    Par défaut
    il est bien gentil NeriXs, si il ne lit pas les réponses ou ne s'y intéresse pas, et si il ne nous donne pas toutes les infos sur ses données d'entrée, comment voulez-vous donc qu'on l'aide (messages: 288 points: 6 c'est louche)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Désolé je n'avais pas connaissance de cet identificateur d'application "caché" qui n'apparait pas sous la suite office, ni même le Bloc-notes au moment où j'ai posté ma demande.
    J'essaie de m'améliorer lors de mes requêtes sur ce forme d'entraide, mais c'est encore loupé cette fois ci!
    Il faut que je pose encore plus les choses avant de me lancer.
    Encore une fois veuillez m'excuser.
    Bien cordialement

Discussions similaires

  1. Réponses: 10
    Dernier message: 04/12/2018, 13h24
  2. [XL-2016] Codes UserForm Excel 2016
    Par bramoset dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/03/2018, 11h05
  3. [CR 8.5] Création d'un code à barres GS1-128
    Par Get29 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 26/08/2015, 14h04
  4. [VB.Net] Créer un code barre 128
    Par olivc dans le forum ASP.NET
    Réponses: 7
    Dernier message: 25/01/2008, 19h52
  5. [VBA Excel] Comment écrire un code dans le ThisWorkBook ?
    Par WebPac dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/05/2005, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo