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