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_matrix

Crdlt

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 Sub

Bonjour 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 Sub

Cordialement

Rechercher des sujets similaires à "generateur automatique datamatrix"