XL 2016 macro pour rechercher et sauvegarder un champs d'un onglet à l'autre

benjy555

XLDnaute Junior
Bonjour

Pour celles et ceux qui pourront m'aider, un grand MERCI

je tiens a préciser que j'ai publier cette question sur un autre forum mais je n'arrive pas a avoir de solution et c'est vraiment urgent pour moi. Je m'excuse du désagrément.

Voici l'idée et en PJ un fichier exemple :
j'ai dans un onglet 1 , une cellule en G6 ou je rentre un code barre
Sur l'onglet 2 il y a une base de donnée, et en colonne D il y a toute une liste de Code Barre

Le but est que lorsque je rentre un code barre (onglet 1 bis) immédiatement et de façon transparente (en arrière plan) viennent s’inscrire de façon permanente en face de la bonne ligne sur la base de donnée (onglet 2 bis) cellule F8 un "oui" ainsi que la date du jour en H8.

Je précise que les onglet bis ne sont la que pour décomposer le mouvement et que ce soit plus compréhensible
En vrai il n'y a que 2 onglet : un ou on entre les code barre un après l'autre puis le second ou viennent s'enregistrer tous les code barre qu'on aura rentré.

Une subtilité : est il possible en plus de détecter si le code barre qu'on entre n'existe pas dans la liste ? et dans ce cas lancer un message d'erreur puis sauvegarder ce dernier dans un 3 ieme onglet les uns à la suite des autres.


je suis sur excel 2016

merci beaucoup
 

Pièces jointes

  • merci.xlsx
    17.2 KB · Affichages: 20

chris

XLDnaute Barbatruc
Bonjour à tous ;)

J'avais fait donc je poste. Même principe mais au cas où la liste serait longue, j'ai utilisé un tableau statique...

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    If Intersect(Target, [G6]) Is Nothing Or Target.Count > 1 Then Exit Sub
 
    Dim Trouve As Boolean
    Static Etat
    If IsEmpty(Etat) Then
        With Worksheets("2").[a3].CurrentRegion
            Etat = .Offset(1, 0).Resize(.Rows.Count - 1, 7)
        End With
    End If
    For i = 1 To UBound(Etat, 1)
        If Etat(i, 4) = Target Then
            Worksheets("2").Cells(i + 3, 6) = "OUI"
            Worksheets("2").Cells(i + 3, 7) = Date
            Trouve = True
            Exit For
        End If
    Next i
    If Trouve = False Then
        MsgBox "Code Inexistant"
        Worksheets("3").Cells(Worksheets("3").Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) = Target
    End If

End Sub
 

chris

XLDnaute Barbatruc
Re

Cela charge une fois pour toute en mémoire la liste des codes barres de la feuille 2, ce qui accelère le traitement par rapport à une boucle sur la feuille. Si la liste est courte on ne voit pas la différence mais on peut le voir sur une liste longue.

A noter que Pierre Jean, à qui je fais la bise ;) , a oublié de contrôler qu'on saisit bien en G6 et pas ailleurs et moi même oublié le cas d'une suppression
Donc remplacer la ligne de contrôle (ou l'ajouter)
Code:
 If Intersect(Target, [G6]) Is Nothing Or Target.Count > 1 or Target.Value="" Then Exit Sub
 

benjy555

XLDnaute Junior
@chris figurez vous que je m'en suis rendu compte avec mes minces connaissances et j'ai deja fait un mix entre votre proposition et celle de @pierrejean et j'ai donc pu traité le cas du champs laissé à vide suite à une suppression. ce qui est en soit un modif et donc viendrait ecrire dans l'autre onglet avec le champs vide...

En revanche il y une chose que je n'arrive pas à faire : faire en sorte qu'a la fin de chaque coup, une fois le code renseigné le curseur reste toujours sur la cellule G6 dans l'attente direct de la prochaine saisie.

j'ai placé un Range("G6").Select partout mais rien à faire !
 

benjy555

XLDnaute Junior
en effet, c'est maintenant similaire @pierrejean
sauriez vous ou placer le Range("G6").Select dans la version de @chris ?
j'ai pu le mettre dans le cas ou le colis n'est pas reconnu mais dans le cas ou le code est bien reconnu, je passe automatiquement sur la cellule du bas je n'arrive pas à faire en sorte de rester en G6

merci
 

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla