Copier coller en recherchant une ligne specifique

Tout nouveau sur ce forum de discussion , je vous présente bien le bonjour :slight_smile:

Je ne suis pas très doué avec le langage VBA , en tout cas pas suffisamment pour le besoin que j ai

Je voudrai avoir un code VBA qui me permette de copier /coller par exemple le champs « DATE DE REPONSE FOURNISSEUR » cellule « AB14:AD14 » de la feuille « VISUALISATION NCF » vers la feuille « BASE NC » dans la colonne K ( Date de la réponse de fournisseurs ) , mais dans la bonne ligne c’est a dire la ligne qui a le même numéro de non conformités ( colonne A ) que le numéro de non conformité de la feuille « VISUALISATION NCF » cellule « Q7:T7 »
De plus je voudrai que si la cellule de destination n’ est pas vide, il n’ y ai pas de copiage ( Pas d’écrasement de données )

J’espère avoir été clair dans mes explications :sweat_smile:
J’ai mis mon fichier excel en pièce jointe

j’ai essayé d’ avancer un petit peu :sweat_smile:
Mais cette erreur qui apparait , je ne comprends pas le problème , auriez vous une idée ?

Non-Conformité Fournisseur - Copie.xlsm (60,4 Ko)

En vous remerciant par avance pour l’aide que vous pourrez m’apporter
Cordialement

Bonjour

Cette ligne de code est incorrect compte tenu du contexte de ton fichier sur laquelle elle se réfère :

cur_matricule = ws_origine.Range("Q7:T7")

Elle doit être ainsi :

cur_matricule = ws_origine.Range("Q7")

J’ai testé plus de blocage

Maintenant je ne sais si le traitement engendre le résultat espéré

A toi de voir et me dire

Je viens d’analyser ton code en rapport avec tes explications fournies

Plusieurs anomalies constatées :

cette ligne :

lstrw_destination = ws_destination.cells(Rows.Count, 11).End(xlUp).Row

doit faire référence à la colonne « A » qui porte les « NUMÉRO des non-conformités » et non la colonne « K »

Donc doit être ainsi :

lstrw_destination = ws_destination.cells(Rows.Count, 1).End(xlUp).Row

cette ligne

.cells(k, 11) = ws_origine.Range("AB14:AD14")

Comme pour la toute première que je t’ai citée selon le contexte sur laquelle elle se réfère :

doit être comme ceci

.cells(k, 11) = ws_origine.Range("AB14")

Ainsi le traitement alimente onglet « BASE NC » la colonne « K » de la ligne dont le NUMÉRO des non-conformités correspond à celui de la cellule « Q7 » onglet « VISUALISATION NCF »

J’ai testé avec succès après ces corrections la procédure

Tu peux soit modifier toutes ces lignes citées dans le fichier en ta possession ou récupérer celui-ci ci-joint

Testes et fais moi un retour

Non-Conformité Fournisseur - Copie.xlsm (59,2 Ko)

Bonjour et merci pour tes explications et ta rapidité , j’ai modifié le code comme tu m’as dit et effectivement ça fonctionne nickel

J’aurai juste voulu améliorer un peu ce code mais je ne sais pas trop comment m’y prendre

J’aurai voulu mettre la condition que si la cellule de destination dans BASE DE NC n’est pas vide , ne pas faire le collage ( pas d’écrasement de la cellule )

Aurai tu une idée ?

image

Re bonjour, juste après If cur_matricule = ws_destination.cells(k, 1)
j’ ai voulu mettre une 2ème condition And ws_destination.cells(k, 1) = «  » Then
Afin que si il trouve bien la correspondance entre les 2 matricules et que la cellule de destination est vide → alors il colle la cellule sinon il ne la colle pas

Le code VBA ne me renvoie pas d’erreur mais il ne colle plus du tout la cellule maintenant

Auriez vous une idée ? Faut il mettre une variable ou autre ?

En vous remerciant par avance

Non-Conformité Fournisseur - Copie.xlsm (62,1 Ko)

Merci pour ce retour positif

Tu souhaites que le traitement s’accomplisse avec la condition d’une cellule de destination vide en plus de la correspondance du NUMÉRO des non-conformités avec la cellule « Q7 » de l’onglet « VISUALISATION NCF »

La cellule de destination à compléter est en colonne « K » confère ces lignes de code qui l’alimentent :

With ws_destination
                .cells(k, 11) = ws_origine.Range("AB14")
                
            End With

et plus particulièrement celle-ci :

.cells(k, 11) = ws_origine.Range("AB14")

la cellule cells(k, 11) est alimentée de la donnée ws_origine.Range(« AB14 »)

Donc la cellule qui doit être vide est cells(k, 11)

Or dans la portion de ligne de code que tu rajoutes dans cette dynamique tu fais mention de la cellule :
cells(k, 1) et non cells(k, 11)

Ta partie rajoutée :

And ws_destination.cells(k, 1) = «  »

Dans l’instruction cells(k, 1) k est le numéro de la ligne 1 est celui de la colonne donc cells(k, 1) est la cellule de la colonne « A » (première colonne) de la ligne déterminée par la variable k engendrée par la boucle For Next

Donc la deuxième valeur de l’instruction Cells qui est le numéro de la colonne doit correspondre à la colonne « K » qui est celle alimentée soit 11 (de A à K A à le 1° rang et K à le 11ième rang)

Mets à la place de 1 la valeur 11 dans ta partie rajoutée ici :

And ws_destination.cells(k, 11) = ""

Et le miracle devrait se produire

Fais moi un retour

Effectivement le miracle s’ est produit , Je te remercie beaucoup , en plus de m’aider, tes explications m’éclairent sur mes erreurs.

J’ai une dernière requête ensuite je ne t’embête plus :sweat_smile:

image

Justement je voulais que les cellules ne s’écrasent pas car tout les champs ne se rempliront pas le même jour mais à des dates différentes , donc les cellules vident auraient remplacé les cellules déjà remplies

Comment puis je faire dans ma macro pour traiter les autres cellules de remplissages dans la même macro ?

Est ce que après le Next de la fin , je reprends par le For k=2… en changeant les numéros de colonnes de destinations correspondantes et les cellules d’origine à copier ?

Merci pour ta réponse positive

« Comment puis je faire dans ma macro pour traiter les autres cellules de remplissages dans la même macro ? »
Les conditions restent elles les mêmes ?
Je suppose que pour le NUMÉRO des non-conformités elle sera identique mais quid de la deuxième concernant la cellule vide ?

Merci de me préciser

Oui les conditions restent exactement les mêmes pour toutes les cellules , avec toujours cette subtilité de ne pas écraser les cellules déjà remplies

Petite précision quand je remplirai la cellule " Date 1 récupération produit NC " je devrai remplir en meme temps le « nombre de produit récupérés date 1 »
Je ne sais pas si ça a une importance

Je veux pouvoir cliquer sur 1 seul bouton et que la macro balaie tout les champs de remplissage , en copiant les cellules dont les destinations sont vides , aprés si il me copie un champs de remplissage vide dans une destination vide , ça n’ a aucune impacte

En dernier recours si ce n’est pas possible , je devrai affecter un bouton de validation par champs avec chacun sa propre macro

Donc je te propose plutôt de séparer ces 2 conditions
Celle du NUMÉRO des non-conformités à maintenir seule comme elle était à l’initial :

If cur_matricule = ws_destination.cells(k, 1) Then

Et aprés cette ligne de condition pour chaque cellule à remplir la faire précéder de la deuxième condition concernant chacune d’elles comme ceci :

If ws_destination.cells(k, 11) = "" Then
            'copier coller
            With ws_destination
                .cells(k, 11) = ws_origine.Range("AB14")
                
            End With
        End If

Ce qui donne le code global de la boucle suivant :

For k = 2 To lstrw_destination
        'comparer le matricule
        If cur_matricule = ws_destination.cells(k, 1) Then
        'vérification cellule destination vide
            If ws_destination.cells(k, 11) = "" Then
            'copier coller
            With ws_destination
                .cells(k, 11) = ws_origine.Range("AB14")
                
            End With
            End If
        End If
    Next

En rajoutant une nouvelle cellule correspondant à la donnée DATE DE REMPLACEMENT PRODUIT NC qui doit alimenter la colonne « L » de l’onglet « BASE NC » cela donne cette boucle :

For k = 2 To lstrw_destination
        'comparer le matricule
        If cur_matricule = ws_destination.cells(k, 1) Then
        'première cellule
        'vérification cellule destination vide
            If ws_destination.cells(k, 11) = "" Then
            'copier coller
            With ws_destination
                .cells(k, 11) = ws_origine.Range("AB14")
                
            End With
            End If
            'deuxième cellule
            'vérification cellule destination vide
            If ws_destination.cells(k, 12) = "" Then
            'copier coller
            With ws_destination
                .cells(k, 12) = ws_origine.Range("AB16")
                
            End With
            End If
        End If
    Next

Je te laisse oeuvrer ainsi pour toutes les cellules concernées

Si souci fais moi signe

Ok j’ai compris , tu gardes la constante pour la comparaison de matricule , puis tu met la condition si cellule vide tu colles ,
puis tu rattaques a la 2éme cellule de remplissage avec la condition si cellule vide tu colles et ainsi de suite …

Tes explications sont claires , encore 1 fois un grand merci , je vais tester sur le 2 premiers champs si ça fonctionne , si c’est le cas , ca le sera pour les autres
Je reviens te confirmer le miracle :innocent:

Un grand merci à vous , Ca fonctionne Nickel :partying_face:
Bonne soirée à vous

Je vois que tu as bien compris
N’oublies pas pour chaque cellule à alimenter de bien actualiser le numéro de la colonne de destination concernée et de bien mettre la bonne cellule source
Exemple :

Pour la première cellule
cells(k, 11) = ws_origine.Range(« AB14 »)
Pour la deuxième cellule
cells(k, 12) = ws_origine.Range(« AB16 »)

Idem pour cette ligne de code
Pour la première cellule
If ws_destination.cells(k, 11) = «  » Then
Pour la deuxième cellule
If If ws_destination.cells(k, 12) = «  » Then

J’espère que tu as compris

J’attends de tes nouvelles

Ravi de ce resultat final et surtout que tu l’ai réalisé toi même
Ainsi de te faire participer un apprentissage salutaire
Au plaisir de t’accompagner une prochaine fois

C’est moi qui te remercie pour ton aide , ton temps et ta pédagogie.
Je n’y serai pas arrivé sans toi, et ce fut un plaisir partagé d’apprendre à tes cotés. :wink:

Je te souhaite une bonne soirée et qui sait ? une prochaine fois peux être ( surement :sweat_smile: ) pour un autre projet.

PS : Tout fonctionne Nickel, j’ai ajouté un effacement des champs de saisie à la fin et une sauvegarde du dossier.

Bonjour FFO, je ne pensais pas revenir si vite vers toi , mais j’ai un souci avec une nouvelle Macro alors j’en appelle à tes lumières :sweat_smile:

J’ai fait une macro qui m’actualise le stock des produit NC
Elle fonctionne Nickel , à part pour la colonne des dates , lorsque je lui met le même code que pour les autres colonnes, en l’adaptant a cette colonne et à son emplacement de destination , les valeurs se collent dans une autre colonne alors que les coordonnées sont bonnes ??

Sheets(« BASE NC »).Select
Range(« J2 », Range(« J2 »).End(xlDown)).Select
Range(ActiveCell, ActiveCell.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets(« STOCK NCF »).Select Range(« I12 »).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False


Si tu peux jeter un oeil , ci joint le fichier excel pour toi tester
Non-Conformité Fournisseur Officiel - Copie.xlsm (114,7 Ko)

Je pense qu’il y avait plus simple comme macro , je crois avec une fonction array et les numéros des colonnes qui m’intéressent mais un peu trop complexe pour moi :sweat_smile:

Dans l’attente de ton retour , je te remercie par avance

Bonsoir
Ravi de te tendre la main à nouveau

Effectivement ta procédure serait à reprendre pour simplification
Mais quand on débute il vaut mieux rester avec ce que l’on a élaboré et de l’adapté aux résultats souhaité
C’est ainsi pour ta compréhension plus salutaire

J’ai rajouté les lignes de codes nécessaire à l’intégration des dates en colonne « I » de l’onglet « STOCK NCF » aucune ne concernait celle-ci donc normal que ce résultat soit défaillant :

'Alimentation des dates
    Sheets("BASE NC").Select
    Range("J2", Range("J2").End(xlDown)).Select
    Range(ActiveCell, ActiveCell.End(xlDown)).Select
    Selection.Copy
    Sheets("STOCK NCF").Select
    Range("I12").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Testes ce fichier ainsi adapté et dis moi

Non-Conformité Fournisseur Officiel - Copie.xlsm (114,9 Ko)

Une petite interrogation personnelle, dans le code alimentation des dates, ou dans les codes en générales, les .Select sont ils vraiment nécessaire, ne font-ils pas « clignoter » le fichier, on les trouve toujours en faisant des enregistrements de macro