Macro Copier lignes visibles après filtre

Bonjour

Je cherche à copier les lignes des tableaux pour lesquelles le total est supérieur à 0. Les critères de ce filtre se trouve dans onglet analyse. Ces lignes seront rassemblées dans l'onglet analyse.

Je cherche une macro dans laquelle je distingue les sheets, car il se peut que j'en rajoute et que la zone de filtre copié soit en quelque sorte dynamique car il se peut qu'il y ait d'autres articles à l'avenir donc d'autres lignes

MERCI

94commande.xlsm (12.62 Ko)

Bonjour,

proposition à tester

Bonjour,

MERCI game over pour ta réponse, la macro s'applique à tous les onglets, mais il se peut que je rajoute des onglets d'explications dans mon classeur qui ne devront pas être copiés.

Comment précisé dans la macro que cela concerne que l'onglet commande A, B, et C. Je voudrais bien voir ces sheets précisés comme ça je rajouterai d'autres onglets directement dans la macro en utilisant la programmation utilisée.

merci

Il te suffit simplement de modifier la ligne suivante :

If Sh.Name <> "Analyse" Then

Pour toutes les feuilles qui ne devront pas être prises en compte par la macro, tu modifieras le code comme suit :

If Sh.Name <> "Analyse" And Sh.Name <> "nom de la feuille 2" Sh.Name <> "nom de la feuille 3" Then

et tu pourras ainsi continuer à ajouter d'autres feuilles qui seront prises en charge par la macro.

Merci Game Over pour cette solution

Sinon Serait-il possible que tu m'expliques la fonction "IsEmpty" et la partie suivante du programme :

with Sh

derLig = .Range("B" & Rows.Count).End(xlUp).Row

derCol = .Cells(3, Columns.Count).End(xlToLeft).Column

If derLig > 3 Then

For a = 4 To derLig

If .Cells(a, derCol) > 0 Then

.Range(.Cells(a, 2), .Cells(a, derCol)).Copy Destination:=Sheets("Analyse").Range("B" & Rows.Count).End(xlUp).Offset(1, 0)

End If

Next a

End If

End With

Merci beaucoup pour le temps que tu me consacre

If Not IsEmpty(Range("B4")) Then

Si la cellule B4 n'est pas vide, alors...

la suite du code définit la plage des résultats précedents et l'efface avant de recalculer et afficher les nouveaux résultats... c'est la partie de code Reset si tu veux.

'pour chaque feuille
with Sh 'cette commande indique que le calcul ne se fera que pour la feuille traitée... 
'donc même si ta feuille active est la feuille Analyse, cela n'affectera pas la macro
derLig = .Range("B" & Rows.Count).End(xlUp).Row 'cette ligne de code affecte à la variable derLig le No 
'de la dernière ligne non vide de la colonne B 
derCol = .Cells(3, Columns.Count).End(xlToLeft).Column 'No de la dernière colonne non vide de la ligne 3
If derLig > 3 Then 's'il existe d'autres lignes non vides que la ligne 3 (sous entendu pour la colonne B 
'et par extention pour toute la feuille) alors...
For a = 4 To derLig 'de la ligne 4 jusqu'à la dernière ligne non vide
If .Cells(a, derCol) > 0 Then 'si la dernière cellule de la ligne analysée (cellule de la colonne TOTAL) est>0
.Range(.Cells(a, 2), .Cells(a, derCol)).Copy Destination:=Sheets("Analyse").Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
'Alors copie le segment colonne B - colonne TOTAL de cette ligne sur la feuille Analyse, à partir de la 
'cellule suivante vers le bas de la dernière cellule non vide de la colonne B
End If
Next a
End If
End With

Bonjour le forum

Merci Game over pour ces explications mais j'ai un peu de mal avec les formules cells.find

Serait il possible de remplacer les cells.find par des zones; c'est à dire la première ligne et la dernière ligne compris entre deux colonnes.

Merci

tu peux remplacer la ligne contenant Cells.find par la ligne suivante :

lRow = .Cells(Rows.Count, 2).End(xlUp).Row

Cette ligne de commande repère le numéro de la dernière cellule non vide de la colonne 2.

lCol = .Cells(3, Columns.Count).End(xlToLeft).Column

celle la repère la dernière colonne non vide de la ligne 3

du coup cells(lrow,lcol) représente la dernière cellule non vide de ta plage.

tu sélectionnes alors la 1ere cellule non vide de ta plage ("B4") et la dernière cells(lrow,lcol) et tu effaces tout ce qui se trouve entre ces 2 références :

.Range(.Range("B4"), .Cells(lRow, lCol)).ClearContents

j'espère que c'est plus clair ainsi.

Bonjour Game Over

Cette partie du programme concerne t elle uniquement analysis ?

If Not IsEmpty(Range("B4")) Then
    With Sheets("Analyse")
        lRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
        lCol = .Cells(3, Columns.Count).End(xlToLeft).Column
        .Range(.Range("B4"), .Cells(lRow, lCol)).ClearContents
    End With
End If

Enfin comme réajusté la macro si les cellules copié sont des formules (ex: =B4)

Merci


Bonjour

J'essaie de comprendre le fonctionnement de la macro. Pour cela j'ai rajouté des lignes au dessus des tableaux commande mais je bloque pour rajuster la macro.

En PJ ce que je cherche a faire

Cette partie du programme concerne t elle uniquement analysis ?

Les bornes with et end with encadrent des commandes spécifiques, dans ce cas précis, à la feuille "Analyse".

Si, entre temps, tu as renommé ta feuille "Analysis", n'oublie pas de faire les modifications nécessaires dans la macro.

Enfin comme réajusté la macro si les cellules copié sont des formules (ex: =B4)

Ne pas confondre une formule avec une adresse de cellule.

Lorsqu'il est fait référence à B4 dans cette macro, il s'agit de la cellule B4 et non pas de la valeur de B4.

Ci joint la correction de tes modifications

Bonjour

Merci Game over pour tes réponses je comprends mieux avec les tableaux placés plus bas.

Au sujet de la valeur B4 ma question était si au lieu d'avoir une donnée en valeur on aurait une donnée sous forme de formule est ce que la macro va coller la valeur ou la formule ?

MERCI encore

Joungir a écrit :

Au sujet de la valeur B4 ma question était si au lieu d'avoir une donnée en valeur on aurait une donnée sous forme de formule est ce que la macro va coller la valeur ou la formule ?

Cette macro conserve les formules comme tu peux le constater dans la colonne TOTAL de ta feuille Analyse

Bonjour forum, Bonjour Game Over

Merci Game Over pour ce fichier qui m'a permis de bien comprendre les fonctions cells.

Pour encore mieux comprendre, Serait il possible de réadapter cette macro dans le nouveau cas en PJ.

L'objectif est toujours de copier les lignes dont le total est supérieur à 0 mais cette fois ci sans recopier le total (dernière col) ni la première colonne commande (colonne C). Copier uniquement les colonnes D à P

Merci

17commande.xlsm (22.58 Ko)

Voici la dernière modification de la macro.

J'espère que cela te convient car je ne vais pas être en mesure de te proposer une solution pour tous les cas de figures imaginables.

Cordialement.

Bonjour

Merci Game Over cela me convient très bien, à moi de jongler avec les différents cas de figures qui peuvent se présenter

Merci pour ton aide

Bonjour à tous,

Je reviens vers vous une dernière fois car je n'arrive malheureusement pas à rebondir sur une nouvelle version de mon fichier malgré les explications et les adaptations qu'a apporté Game Over.

Mes besoins ont évolué et donc la problématique de mon fichier aussi (Voir PJ) (pour une dernière fois).

Je souhaite copier coller les données des parties jaunes dans la partie verte de l'onglet "Chargement". Toujours avec l'idée de copier que les lignes dont le total est supérieur à 0 et de les coller en valeurs.

Merci

Pour la prochaine fois, je te suggère d'ouvrir un autre fil de discussion, plutôt que de reposter sur un fil que tu as déjà validé.

Vraiment Merci Game Over pour ton aide et ta disponibilité. C'est une merveille ce que tu viens de me faire

Rechercher des sujets similaires à "macro copier lignes visibles filtre"