Générateur automatique datamatrix
Bonjour, je suis très novice sur excel. je souhaiterai trouver un moyen de générer des codes datamatrix au format 8x18,sans passer par des sites payants ou avec période d'essai.
Le projet est très simple, dans une colonne (gauche), j'ai une base de donnée (nombre qui s'incrémente de 1 à chaque ligne) et sur la 2e colonne, j'ai le code datamatrix correspondant qui s'affiche en automatique ou via un bouton.
La base de donnée s'incrémente de la façon suivante:
> S000001 (première valeur, S étant un préfixe invariable)
> S000002 (valeur suivante) jusqu'à S999999.
En pj le fichier excel. J'ai crée le code via un générateur web (barcodeocean)
je vous remercie par avance pour l'aide que vous pourrez m'apporter.
JR
Bonjour
Une piste
Pour générer des codes Data Matrix à partir d’un fichier Excel, vous pouvez utiliser les bibliothèques pandas pour manipuler les données Excel et pylibdmtx pour créer les codes Data Matrix. Voici un exemple de code qui lit les références et les codes depuis un fichier Excel et génère des images de codes Data Matrix.
Assurez-vous d’avoir installé les bibliothèques nécessaires :
pip install pandas openpyxl pylibdmtx pillow
Voici un exemple de code :
import pandas as pd
from pylibdmtx import pylibdmtx
from PIL import Image
import os
# Charger le fichier Excel
file_path = 'votre_fichier.xlsx' # Remplacez par le chemin de votre fichier Excel
df = pd.read_excel(file_path)
# Créer un dossier pour enregistrer les codes
output_dir = 'codes_data_matrix'
os.makedirs(output_dir, exist_ok=True)
# Parcourir les lignes du DataFrame
for index, row in df.iterrows():
reference = row['Référence'] # Assurez-vous que le nom de la colonne est correct
code = row['Code'] # Assurez-vous que le nom de la colonne est correct
# Générer le code Data Matrix
data_matrix = pylibdmtx.encode(code)
# Sauvegarder le code sous forme d'image
image = Image.frombytes('RGB', (data_matrix.width, data_matrix.height), data_matrix.pixels)
image_path = os.path.join(output_dir, f'{reference}.png')
image.save(image_path)
print(f"Code Data Matrix pour {reference} enregistré sous '{image_path}'")
print("Tous les codes Data Matrix ont été générés.")
Instructions :
Remplacez 'votre_fichier.xlsx' par le chemin de votre fichier Excel contenant les colonnes avec les références et les codes.
Assurez-vous que les noms des colonnes dans le code ('Référence' et 'Code') correspondent aux noms exacts des colonnes dans votre fichier Excel.
Exécutez le script. Les codes Data Matrix seront générés et sauvegardés dans un dossier nommé codes_data_matrixCrdlt
Bonjour le fil et e Forum, voici ma proposition
Option Explicit
Sub GenererDataMatrix()
'https://forum.excel-pratique.com/excel/generateur-automatique-datamatrix-200579
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim code As String
Dim url As String
Dim pic As Picture
' --- Définir la feuille de calcul active ---
Set ws = ThisWorkbook.Sheets(1)
' --- Trouver la dernière ligne utilisée dans la colonne A ---
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' --- Boucle à travers chaque ligne à partir de A2 ---
For i = 2 To lastRow
' --- Lire le texte/code dans la colonne A ---
code = Trim(ws.Cells(i, "A").Value)
' --- Vérifier que la cellule n'est pas vide ---
If code <> "" Then
' --- Construire l'URL pour générer le DataMatrix rectangulaire ---
' bcid=datamatrixrectangular ? type de code-barres
' scale=2 ? facteur d'agrandissement
url = "https://bwipjs-api.metafloor.com/?bcid=datamatrixrectangular&text=" & _
Application.WorksheetFunction.EncodeURL(code) & _
"&scale=2"
' --- Supprimer toute image existante dans la cellule B de cette ligne ---
For Each pic In ws.Pictures
If Not Intersect(pic.TopLeftCell, ws.Cells(i, "B")) Is Nothing Then
pic.Delete
End If
Next pic
' --- Insérer l'image depuis l'URL ---
Set pic = ws.Pictures.Insert(url)
' --- Positionner l'image avec une petite marge ---
With pic
' +1 points vers le bas (marge en haut)
.Top = ws.Cells(i, "B").Top + 1
' +5 points vers la droite (marge à gauche)
.Left = ws.Cells(i, "B").Left + 5
.Width = 90
.Height = 36
' .Placement = xlMoveAndSize
End With
End If
Next i
' --- Message de confirmation ---
MsgBox "Tous les codes DataMatrix ont été générés avec succès !", vbInformation
End SubBonjour Sequoyah ,
je suis sans voix!!! tout fonctionne à merveille.......un énorme merci pour votre aide!!!
Un excellent dimanche à vous!
cdt
Jérôme Rey
Bonjour,
Suite à la généreuse aide de Sequoyah que je remercie encore, je ne voudrais pas abuser mais j'aimerai aller plus loin dans ma réalisation.
Je joins le fichier avec le modèle d'étiquette finale que je dois réaliser.
Idéalement dans la colonne C, je voudrais faire apparaitre une seule image de l'étiquette qui sera sommairement un rectangle de 40x10, le code de la colonne B parfaitement centré et le code alphanumérique de la colonne A en bas à gauche comme représenté (plus ou moins). Les caractères alphanumériques doivent être de hauteur 2mm. si quelqu'un peut m'aider à ajouter une macro qui ferait le job...
je vous remercie mille fois pour votre aide.
JR
Bonjour le fil et le Forum,
Désolé du retard, comme je travaille à l’étranger je ne peux passer sur le forum que de temps en temps (Le code doit être placé dans un module standard)
Option Explicit
Sub GenererDataMatrix2()
'https://forum.excel-pratique.com/post/repondre/200579
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim code As String, url As String
Dim pic As Picture
Dim rect As Shape, imgCopy As Shape, bg As Shape
Dim circleLeft As Shape, circleRight As Shape
Dim textShape As Shape, grp As Shape
Dim mmToPt As Double
Dim arr() As Variant
Dim sh As Shape
' Conversion mm ? points (1 mm ˜ 2,835 pt)
mmToPt = 2.835
Set ws = ThisWorkbook.Sheets(1)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' --- Nettoyer les colonnes B et C avant de recréer les objets ---
' Supprimer toutes les images (Pictures) dans la colonne B
For Each pic In ws.Pictures
If Not Intersect(pic.TopLeftCell, ws.Range("B2:B" & lastRow)) Is Nothing Then
pic.Delete
End If
Next pic
' Supprimer toutes les formes (Shapes) dans la colonne C
For Each sh In ws.Shapes
If Not sh.TopLeftCell Is Nothing Then
If Not Intersect(sh.TopLeftCell, ws.Range("C2:C" & lastRow)) Is Nothing Then
sh.Delete
End If
End If
Next sh
' --- Boucle sur chaque ligne ---
For i = 2 To lastRow
code = Trim(ws.Cells(i, "A").Value)
If code <> "" Then
' Construire l’URL pour générer le DataMatrix
url = "https://bwipjs-api.metafloor.com/?bcid=datamatrixrectangular&text=" & _
Application.WorksheetFunction.EncodeURL(code) & "&scale=2"
' Insérer l’image dans la colonne B
Set pic = ws.Pictures.Insert(url)
With pic
.Top = ws.Cells(i, "B").Top + 1
.Left = ws.Cells(i, "B").Left + 15
.Width = 90
.Height = 36
End With
' Créer le rectangle arrondi noir dans la colonne C
Set rect = ws.Shapes.AddShape(msoShapeRoundedRectangle, _
ws.Cells(i, "C").Left, ws.Cells(i, "C").Top, _
40 * mmToPt, 10 * mmToPt)
With rect
.Fill.ForeColor.RGB = RGB(0, 0, 0) ' fond noir
.Line.Visible = msoFalse
End With
' Dupliquer l’image de la colonne B
pic.Copy
ws.Paste
Set imgCopy = ws.Shapes(ws.Shapes.Count)
With imgCopy
.LockAspectRatio = msoTrue
.Width = 15 * mmToPt
.Height = 7 * mmToPt
.Left = rect.Left + (rect.Width - .Width) / 2
.Top = rect.Top + (rect.Height - .Height) / 2
End With
' Créer un panneau blanc derrière l’image
Set bg = ws.Shapes.AddShape(msoShapeRectangle, imgCopy.Left, imgCopy.Top, imgCopy.Width, imgCopy.Height)
With bg
.Fill.ForeColor.RGB = RGB(255, 255, 255)
.Line.Visible = msoFalse
.ZOrder msoSendToBack
End With
rect.ZOrder msoSendToBack
imgCopy.ZOrder msoBringToFront
' Ajouter le texte en bas à gauche
Set textShape = ws.Shapes.AddTextbox(msoTextOrientationHorizontal, _
rect.Left + 2, rect.Top + rect.Height - 12, _
rect.Width / 2, 12)
With textShape.TextFrame2
.TextRange.Text = code
.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 255, 255) ' texte blanc
.TextRange.Font.Size = 8
.MarginBottom = 0
.MarginLeft = 0
End With
textShape.Line.Visible = msoFalse
textShape.Fill.Visible = msoFalse
' Ajouter deux cercles blancs centrés, espacés de 29 mm
Dim diametre As Double, distance As Double
Dim centreRett As Double, centreY As Double
Dim centreX_sx As Double, centreX_dx As Double
diametre = 3.1 * mmToPt ' diamètre en points
distance = 29 * mmToPt ' distance entre les centres
centreRett = rect.Left + rect.Width / 2
centreY = rect.Top + rect.Height / 2 - diametre / 2
' Coordonnées X des centres
centreX_sx = centreRett - distance / 2
centreX_dx = centreRett + distance / 2
' Cercle gauche
Set circleLeft = ws.Shapes.AddShape(msoShapeOval, _
centreX_sx - diametre / 2, centreY, diametre, diametre)
circleLeft.Fill.ForeColor.RGB = RGB(255, 255, 255)
circleLeft.Line.Visible = msoFalse
' Cercle droit
Set circleRight = ws.Shapes.AddShape(msoShapeOval, _
centreX_dx - diametre / 2, centreY, diametre, diametre)
circleRight.Fill.ForeColor.RGB = RGB(255, 255, 255)
circleRight.Line.Visible = msoFalse
' Regrouper tous les éléments de cette ligne
arr = Array(rect.Name, bg.Name, imgCopy.Name, textShape.Name, circleLeft.Name, circleRight.Name)
Set grp = ws.Shapes.Range(arr).Group
grp.Name = "Groupe_DM_" & i
End If
Next i
MsgBox "Tous les DataMatrix et leurs étiquettes ont été générés, nettoyés et regroupés avec succès !", vbInformation
End SubCordialement