Macro - Copier lignes avec(de différents Sheets sur un autre sheet)

Bonjour à tous,

Besoin de votre aide ☹, je suis débutant en VBA (à 48 ans, galère...)

12test-bouton.xlsm (30.26 Ko)

J’ai besoin pour le boulot d’un fichier (voir modèle joint) avec plusieurs feuilles.

Sur les différentes feuilles "Clients1,2,3,4....." : si en colonne H, j’indique ‘’P’’, ‘’MC’’ ou ‘’F’’.

  • Alors copier la ligne entière sur la feuille PROVISION, lorsque je clic sur le bouton ‘’Consolider’’.

J’ai réussi à trouver quelques infos qui n’ont permis d’avoir une ‘’ébauche ‘’ de Macro, mais elle ne fonctionne pas correctement et ne copie que la première ligne trouvée, et uniquement sur la feuille que je déclare ici :

Set C = Worksheets("CLIENT1").Columns(8).Find(MotCle(i), LookIn:=xlValues, lookat:=xlPart)

J’aimerai que la recherche se fasse sur toutes les feuilles et affiche toutes les correspondances.

Le bouton effacer tableau fonctionne , il permet d'effacer toutes les données sur PROVISION.

Merci d'avance à tous pour votre aide et conseils .

Bonjour,

Petite question, une fois la ligne copiée elle est effacée ou non ?

Car sinon à chaque clic cela va te copier les lignes et tu auras des doublons après.

Bonjour tout le monde, une proposition (bouton "Importer" ajouté) :

17test-bouton.xlsm (31.65 Ko)
Option Explicit

Sub Import()
    Dim i As Integer, j As Integer, nL1 As Integer, nL2 As Integer
    Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = Sheets("Provision")
    nL1 = ws1.Cells(Columns.Count, 1).End(xlUp).Row
    If nL1 > 1 Then Range("A2:L" & nL1).Clear

    For i = 2 To Sheets.Count
        Set ws2 = Sheets(i)
        nL2 = ws2.Cells(Columns.Count, 1).End(xlUp).Row
        For j = 2 To nL2
            If UCase(ws2.Cells(j, 8)) = "P" Or UCase(ws2.Cells(j, 8)) = "MC" Or UCase(ws2.Cells(j, 8)) = "F" Then
                nL1 = ws1.Cells(Columns.Count, 1).End(xlUp).Row + 1
                ws2.Range("A" & j & ":L" & j).Copy Destination:=ws1.Range("A" & nL1)
            End If
        Next j
    Next i
End Sub

@ Optimix , ca fonctionne , merci 👍👍 , je vais tester et continuer mon développement , je vais pas encore cloturer le post car j'aurais surement d'autres question si ok pour vous .. ?

Est - il possible d'avoir une explication de la macro , pour moi pourvoir évoluer dans ce monde ;-) ?

Oliblast : non , les lignes doivent rester dans les feuilles client ;-)

@ Optimix: Par contre est -il possible d'ajouter une condition :-( , je devrais aussi pouvoir importer en fonction de la colonne F ( Mois de provision 1,2,3...) ?

Via une case peut être ?

Encore merci pour votre aide !

J'avais trouvé quelque chose mais pour ne pas vous embrouiller je vais laisser juste la solution de Optimix !

Je vous souhaite bon courage dans votre découverte du VBA !

#Oliblast : tu devrais proposer ta solution car elles ont toutes quelque chose d'intéressant à apporter, au niveau des techniques comme des idées.

#hugo_B : il serait souhaitable que ton projet ne soit pas à géométrie variable pour éviter les pertes de temps (pas de développement au compte-gouttes). Si cette modification est facile, pas de problème, dans le cas contraire je n'irai pas au-delà, faute de temps.

Code expliqué :

Option Explicit

Sub Import()
1    Dim i As Integer, j As Integer, nL1 As Integer, nL2 As Integer
2    Dim ws1 As Worksheet, ws2 As Worksheet
3
4    Set ws1 = Sheets("Provision")
5    nL1 = ws1.Cells(Columns.Count, 1).End(xlUp).Row
6    If nL1 > 1 Then Range("A2:L" & nL1).Clear
7
8    For i = 2 To Sheets.Count
9        Set ws2 = Sheets(i)
10       nL2 = ws2.Cells(Columns.Count, 1).End(xlUp).Row
11       For j = 2 To nL2
12            If UCase(ws2.Cells(j, 8)) = "P" Or UCase(ws2.Cells(j, 8)) = "MC" Or UCase(ws2.Cells(j, 8)) = "F" Then
13                nL1 = ws1.Cells(Columns.Count, 1).End(xlUp).Row + 1
14                ws2.Range("A" & j & ":L" & j).Copy Destination:=ws1.Range("A" & nL1)
15            End If
16        Next j
17    Next i
End Sub

Option Explicit : toutes les variables doivent être déclarées
1 - 2 : déclaration des variables
4 : pour alléger le code on affecte la feuille "Provision" à la variable ws1
5 : on vérifie s'il y a déjà des enregistrements. Il y en a si nL1 > 1
6 : s'il y a déjà des enregistrements, on les efface.
8 : On traite toutes les feuilles une à une dans l'ordre à partir de la 2e
9 : pour alléger le code on affecte à la variable ws2 la feuille du client n° i
10 : on calcule la valeur de la dernière cellule non vide de la 1ère colonne ("A") et on l'affecte à la variable nL2
11 - 16 : on scanne la colonne "H" (=8). Ucase() met en majuscule une éventuelle erreur de saisie en minuscules : "mc" donnera "MC".
13 : on calcule la valeur de la 1ère cellule vide de la 1ère colonne ("A") dans la feuille "Provision" (donc du prochain enregistrement)
14 : on recopie la plage "Ai:Li" de la feuille client(i) sur cette ligne de la feuille "Provision".

# Optimix : je comprends tout à fait , merci pour ton temps et ton aide .

Bonjour à tous,

@Optimix : As-tu numéroté manuellement les lignes de ton code ou il existe une façon plus "automatisée" de le faire ? Je suis curieux de connaître ta réponse ! Merci d'avance.

Cdlt,

Rebonjour Hugo,

Moi j'ai un peu de temps donc si jamais expliquez moi ce que vous voulez et je peux regarder.

VOus voulez que si vous cliquez sur un bouton 1 cela vous sorte que les mois de prov 1 ou juste que les mois de prov soient triés dans la feuille provision ?

#Ergotamine
Pour des petites macros de quelques lignes, il vaut mieux le faire à la main. En revanche pour des macros de grande taille on peut automatiser le truc en procédant comme suit : on exporte la macro dans un dossier quelconque. Un fichier Macro1.BAS va être créé (avec le n° de la macro). Mais Excel ajoute dedans des trucs dont on n'a pas besoin. On purge avec la petite macro ci-dessous qui va numéroter les lignes d'instruction et sauvegarder le tout au format .TXT
On peut utiliser la macro telle quelle, car les n° de ligne vont être considérés comme des étiquettes.

12numerotation.xlsm (19.74 Ko)

Merci beaucoup pour ton retour !

J'avoue ne jamais m'être penché sur les exports de macro ! Je mets ce post en favori et y jetterais un coup d'oeil car ça peut être très utile comme tu l'as démontré !

# Oliblast : merci pour votre aide ,j'aimerai que les mois et n° prov. en colonne ''E'' et "F" se trie de A->Z directement , pour l'instant le le fait manuellement après avoir utiliser la "super" macro d'Optimix qui marche parfaitement.

Bonjour,

Regarde cela et redis moi si cela te va.

Petit conseil si tu apprends le VBA, tu peux utiliser l'enregistreur de macro excel, tu trie tes données comme tu veux et après quand tu ouvres ton code, tu as l'action que tu as faite "traduite" en langage macro.

13aide-hugo-b.xlsm (32.90 Ko)
# Oliblast :
Merci pour ton aide . c'est ce qu'il me fallait .

Pour l'enregistreur de Macro :
Je ne sais pas si c'est la bonne technique , mais je fais plusieurs ''petites'' macro et je les rassembles dans une même macro , que j'assigne à un bouton .
Comme ça quand j'appuie sur le bouton les 4 macros se lancent en cascade ...

Exemple de macro faite :
image

Bonjour à tous,

C'est une solution mais difficilement lisible par la suite car il faut sans cesse se réferer à droite à gauche et trouver les liens, j'ai mis plus de 3h a dépatouiller un code réalisé comme ça.

Le plus efficient est de prendre tes bouts des codes, les mettre tous ensemble, l'épurer si tu sais le faire afin de retirer l'inutile et de mettre des commentaires comme tu l'as fait.

Cdlt,

# Ergotamine , je me doute que lorsqu'il faut rechercher une infos ce n'est pas très clair … Mais est-il possible de mettre les différentes macros , les unes à la suite des autres ? (Si je les colles dans la même macro les unes en dessous des autres , j'ai des erreurs ).

Bonjour,

Oui c'est possible, il ne faut conserver qu'un Sub nom_de_la_macro() au début et un End Sub à la fin.

Cdlt,

Rechercher des sujets similaires à "macro copier lignes differents sheets sheet"