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:
=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:
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:
=ExtractUsingRegex(A10;"01(\d{14})")
Résultat : 0100883873867792
OK
2) (11) Date de fabrication
Formule:
=ExtractUsingRegex(A10;"11(\d{6})")
Résultat : 11220927
OK
3) (17) Date d'expiration
Formule:
=ExtractUsingRegex(A10;"17(\d{6})")
Résultat : 17230927
OK
4) (10) Numéro de lot/lot
Formule:
=ExtractUsingRegex(A10;"10([^\u001D]{1,20})")
Résultat: 1008838738677921122092
Pas OK la formule attaque le début du code barre
J'ai essayé avec:
=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
Partager