Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Lancer une macro après le scan d'un code barre

teldryn

XLDnaute Nouveau
Bonjour à tous,

Après une semaine de recherche, je ne trouve pas la solution à mon problème...

Voila ce que je veux :

Après chaque jour de travail je dois saisir dans un tableau un numéro de commande, la date du jour ainsi que le nom du livreur. J'ai fais pour cela une macro qui fonctionne comme suis : Ajout de ligne au tableau, copie / colle de la case "Numéro de MET", copie/colle de la case "date de livraison", copie colle de la case "livreur", puis suppression de la case "Numéro de MET".
Je voudrais maintenant automatiser la chose pour pas avoir à cliquer a chaque fois sur le bouton (associé à ma macro).
Je voudrais donc que ma macro se lance quand j'ai scanné mon code barre donc quand ma cellule "Numéro de MET" est remplis.

Je sais que je dois passer via du code VBA, mais je n'arrive pas à trouver comment déclencher les actions cité plus haut.

Merci d'avance pour vos réponses

Damien
 

Pièces jointes

  • Livraison test.xlsm
    33.6 KB · Affichages: 17

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le fichier joint j'ai nommé le tableau "T_Livraisons" ce qui est plus explicite que Tableau1.
J'ai nommé la cellule C4 'SaisieNumMet'
J'ai modifié la formule recherchev de la cellule C18. Le troisième paramètre doit être FAUX pour trouver le nom recherché. Sinon utiliser Index/Equiv.

Dans le module de code de la feuille (click-droit sur son nom de l'onglet puis -> Visualiser le code) j'ai mis ce code dans la procédure évènementielle 'WorkSheet_Change'. Un message prévient l'utilisateur si un des 3 éléments (Num Met, date, livreur) est manquant.

Je n'ai pas de douchette alors j'ai testé manuellement.

VB:
  Dim lr As ListRow
    '
    ' Si plus d'une cellule est changée alors on sort
    If Target.Count > 1 Then Exit Sub
    '
    ' Si la cellule(Target) ayant changé est la cellule de saisie nommée
    If Target.Address = Range("SaisieNumMet").Address Then
        '
        ' Si les deux autres champs ne sont pas vide
        If Not IsEmpty(Target.Offset(2)) And Not IsEmpty(Target.Offset(4)) Then
            '
            ' Alors travailler sur le tableau
            With ListObjects("T_Livraisons")
                '
                ' Récupérer la ligne d'insertion automatique du tableau si elle existe
                ' Sinon la créer
                If .InsertRowRange Is Nothing Then
                    Set lr = .ListRows.Add()
                Else
                    Set lr = .InsertRowRange
                End If
                '
                ' La remplir avec les valeurs des trois cellules idoines
                lr.Range.Value = Array(Target, Target.Offset(2), Target.Offset(4))
                '
                ' Signalé que la ligne a été ajoutée.
                Range("C1") = "Ligne du numéro " & Target & " ajoutée "
            End With
            '
            ' Si élément manquants avertir l'utilisateur
        Else
            MsgBox "Ajout du numéro MET interrompu : Il manque soit la date soir le nom du livreur!", vbExclamation, "Ajout Numéro MET"
        End If
    End If

Cordialement
 

Pièces jointes

  • Livraison test.xlsm
    40.7 KB · Affichages: 10
Dernière édition:

teldryn

XLDnaute Nouveau
Bonjour,

Merci pour ta réponse rapide !

C'est exactement ce que je cherchais. Je l'ai un peu modifier pour qu'il sélectionne la cellule SaisieNumMet automatiquement à la fin du programme. J'ai aussi ajouté une condition pour le troisième "if" pour quil vérifie aussi que la cellule SaisieNumMet contient bien quelquechose (pour pas qu'il insert une ligne vide dans le tableau)

Je vais aussi configurer ma douchette pour qu'elle renvoie la touche "entrée" à la fin du scan. Je ne toucherais donc plus le clavier/souris !

Peux-tu me dire si cela est "bien" codé ou si j'aurai du utiliser d'autres fonction ? Ensuite pourquoi la deuxième ligne ( Dim lr As ListRow ), à quoi sert-elle ?

Encore une fois un grand merci !

Cordialement
Damien

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lr As ListRow
    '
    ' Si plus d'une cellule est changée alors on sort
    If Target.Count > 1 Then Exit Sub
    '
    ' Si la cellule(Target) ayant changé est la cellule de saisie nommée
    If Target.Address = Range("SaisieNumMet").Address Then
        '
        ' Si les deux autres champs ne sont pas vide
        If Not IsEmpty(Target.Offset(2)) And Not IsEmpty(Target.Offset(4)) And Not IsEmpty(Range("SaisieNumMet")) Then
            '
            ' Alors travailler sur le tableau
            With ListObjects("T_Livraisons")
                '
                ' Récupérer la ligne d'insertion automatique du tableau si elle existe
                ' Sinon la créer
                If .InsertRowRange Is Nothing Then
                    Set lr = .ListRows.Add()
                Else
                    Set lr = .InsertRowRange
                End If
                '
                ' La remplir avec les valeurs des trois cellules idoines
                lr.Range.Value = Array(Target, Target.Offset(2), Target.Offset(4))
                '
                ' Signalé que la ligne a été ajoutée.
                Range("F4") = "Ligne du numéro " & Target & " ajoutée "
                '
                ' Je replace le curseur sur la cellule "SaisieNumMet"
                Range("SaisieNumMet").Select
            End With
            '
            ' Si élément manquants avertir l'utilisateur
        Else
            MsgBox "Ajout du numéro MET interrompu : Un des trois champs n'est pas rempli !", vbExclamation, "Ajout Numéro MET"
            Range("SaisieNumMet").Select
        End If
    End If
End Sub
 

Pièces jointes

  • Livraison test.xlsm
    36.1 KB · Affichages: 17

Hasco

XLDnaute Barbatruc
Repose en paix
Re bonjour,

Une proposition pour réduire le test:
VB:
  ' Si les 3 cellules contiennent bien 3 valeurs
  '  Application.CountA = fonction NbVal()
  If Application.CountA(Range("SaisieNumMet,C6,C8")) = 3 Then

Ensuite pour la déclaration de la variable lr as ListRow :

Si vous lisez bien les lignes de codes, vous verrez qu'elle sert à référencer la ligne d'insertion du tableau structuré.

Il est toujours bon de déclarer ses variables en tête de procédure et/ou module (pour les variables utilisées dans tout le module). Votre programme s'en trouvera beaucoup plus lisible, compréhensible le débogage plus efficace et l'intellisens connaissant le type des variables pourra vous proposer la liste de leurs propriétés, méthodes et collections dès que vous taperez le . après le nom :


De plus cela permet au compilateur de connaître le type des variables attendues. Sinon ce type n'est connu qu'au moment de l'execution (plus lent)

Voyez l'aide en ligne sur les objets ListObjects (Tableau structurés) et leurs différentes propriétés, méthodes et collections.

Cordialement
 
Dernière édition:

Discussions similaires

Réponses
6
Affichages
301
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…