XL 2016 Macro copier coller avec ctrl + F en boucle

Antonella-94

XLDnaute Nouveau
Bonjour à tous,

Je suis nouvelle sur le site et je suis contente de rejoindre cette belle communauté :)

Je maitrise les bases n'excel et j'essaye de me familiariser un peu plus aux macros.
Je souhaiterais effectuer une macro qui me permettra de faire un copier coller en fonction d'une recherche prealable d'un fichier à un autre:

Fichier 1 : Où je vais recuperer mes données en fonction de ma recherche ("Par protocole"). j'ai besoin de copier le contenu de la cellule qui se trouve à gauche de mon resultat.
Fichier 2 : où je vais coller mes données en fonction du résultat de ma recherche( "Frais"). j'ai besoin de coller l'élèment copier en bas de la cellule de mon resultat.

Et je souhaiterais que cette macro reitère ces actions jusqu'à ce que dans mon fichier 1 l'ensemble des élèments recherchés aient été copié.

J'ai bien reussi à le faire mais juste pour un seul copié collé. :

Sub test3()
'
' test3 Macro
'
Cells.Find(What:="par protocole", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Range("A59").Select
Selection.Copy
Windows( _
"fichier 2"). _
Activate
Cells.Find(What:="Frais", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Range("G91").Select
ActiveSheet.Paste
End Sub

Je voudrais que ce même code s'applique en continu (jusqu'à que l'ensemble des elements correspondant à ma recherche aient été copié) et sans écraser mon copier coller précédent.

j'espère vraiment avoir été claire dans mes explications...... si quelqu'un pouvait m'aider ce serait super !
 

Roblochon

XLDnaute Accro
Bonjour et bienvenue,

Si vous avez lu la charte avant de poster vous aurez certainement remarqué que vous avez la possibilité de joindre des fichiers exemples.
Essayez de créer deux fichiers de même structure que vos fichier originaux, mais anonymisés et sans données confidentielles dont un avec la macro que vous avez faite.

Indiquez nous sur quelle colonne chercher la dernière ligne de votre 'fichier 1' .

A vous relire
 

Antonella-94

XLDnaute Nouveau
Merci pour votre retour.

En effet cela est plus simple avec les fichiers afin de mieux visualiser.

Dans le fichier 1 je souhaite récuperer les infos que j'ai en colonne A uniquement lorsque j'ai en colonne B "Par protocole".

Ensuite je souhaite coller cela dans mon fichier 2 en colonne G.

Bien evidemment je veux recuperer l'ensemble des infos qui m'interessent et que le copier coller se fasse l'un a la suite de l'autre (sans ecraser le précédent).

Il doit surement y avoir une méthode plus simple qu'un ctrl+F, peut être demandé à la macro de me filtrer ma colonne B dans mon fichier 1... je ne sais pas trop

Je vous remercie par avance de votre aide!
 

Fichiers joints

Roblochon

XLDnaute Accro
Bonjour,

Voici une première proposition aux méthodes classiques et dont le code est commenté. Elle fonctionne sur vos deux fichiers joints dans le message précédent.

Cordialement

P.S. n' oubliez pas de mettre vos macros dans vos prochaines demandes, c'est indicateur de ce que vous avez compris ou pas de vba et cela peut avoir un impact sur la solution à vous proposer.
 

Fichiers joints

Antonella-94

XLDnaute Nouveau
C'est super merci beaucoup. Je penserai à intégrer mes macros dans mes prochaines demandes!
Derniere petite question. j'aimerais ajouter d'autre critères de recherche c'est à dire garder "par protocole" mais pouvoir ajouter un autre critère "par établissement" par exemple.

If c.Value = "par protocole" Then .....

puis-je écrire If c.Value= "par protocole" and "par établissement" then .... ?

ou bien y a t-il une autre façon de l'écrire ?

MERCI BEAUCOUP de votre précieuse aide!
 

Roblochon

XLDnaute Accro
Bonjour,

Dans " If c.Value= "par protocole" and "par établissement" then .... ? " remplacer 'and' (et) par or (ou).
En effet la valeur ne peut être à la fois égale à "par protocole" et à "par établissement" !

Bonne programmation
 

Antonella-94

XLDnaute Nouveau
Nickel, merci beaucoup! j'ai reussi à l'adapter à mes différents fichiers selon le cas de figure.
J'ai parcouru un peu les forums pour trouver le moyen de colorer la case une fois qu'elle a été copié (pour avoir un moyen visuel de savoir ce qui a été copier).

J'ai vu qu'on devait utiliser Selection.Interior.ColorIndex = 4 par exemple mais lorsque je l'intergre dans mon code ça ne fonctionne pas... Ce n'est pas très grave dans ce cas car j'ai toujours un moyen de checker ce qui a été copié mais j'aimerais tout de même comprendre et savoir comment on peut colorer une case juste apres l'avoir copier ?

Encore une fois merci beaucoup, je commence à prendre un réel plaisir à essayer de comprendre et manipuler un peu les macros :)
 

Roblochon

XLDnaute Accro
Bonjour,

Selection.Interior.ColorIndex ne colore que la(les) cellule(s) sélectionnée(s).

Dans la macro 'Transfert' que je vous ai donnée, remplacer la boucle for each...next par celle-ci:
VB:
 '
    '
    ' Parcourir toute les cellules de la colonne retenue plus haut
    For Each c In plg1.Cells()
        'si la cellule en cours de boucle = 'par protocole'
        If c.Value = "par protocole"  or c.Value = "par établissement" Then
            '
            ' mettre la valeur voisine de gauche dans
            ' la prochaine cellule libre de la colonne G de la feuille
            ' Sheet1 du classeur de destination
            With wkDestination.Sheets("Sheet1")
                With .Range("G" & Rows.Count).End(xlUp).Offset(1)
                    .Value = c.Offset(, -1).Value ' valeur de la cellule de gauche
                    .Interior.ColorIndex = 4 'Colorer le fond de la cellule
                End With
            End With
        End If
    Next
Bon dimanche
 

Antonella-94

XLDnaute Nouveau
Bonjour Roblochon,

Super, j'ai bien mes cellules copiées qui sont colorées après le copier coller mais dans mon fichier de destination. J'aurais aimé que la cellule copiée soit colorée dans le fichier initial c'est à dire "this workbook" (où est effectuée la copie). Du coup j'ai mis :

VB:
Parcourir toute les cellules de la colonne retenue plus haut
    For Each c In plg1.Cells()
        'si la cellule en cours de boucle = 'par protocole'
        If c.Value = "par protocole"  or c.Value = "par établissement" Then
            With ThisWorkbook.Sheets("annexe 2_1")
            .Range("A1").CurrentRegion.Interior.ColorIndex = 4 'Colorer le fond de la cellule
          End with 
            ' mettre la valeur voisine de gauche dans
            ' la prochaine cellule libre de la colonne G de la feuille
            ' Sheet1 du classeur de destination
            With wkDestination.Sheets("Sheet1")
                With .Range("G" & Rows.Count).End(xlUp).Offset(1)
                    .Value = c.Offset(, -1).Value ' valeur de la cellule de gauche
                End With
            End With
        End If
    Next

Malheureusement, j'ai du faire une bétise car ça n'a pas fonctionné. Pouvez-vous m'indiquer où se trouve mon erreur ? (je suppose que mon "With que j'ai ajouté n'est pas bien placé ?)

UN GRAND MERCI pour le temps que vous m'accordez et vos explications de code qui me permettent de savoir ce que chaque ligne veut dire.
 

Discussions similaires


Haut Bas