Déplacement automatique de ligne (mais pas la ligne entière)

Bonjour à tous,

Je cherche à déplacer automatiquement des lignes dans une autre feuille en fonction d'un critère.

Il faut surement préciser que je suis totalement novice (je ne connaissais pas l'existance de macro il y à quelques jours..). Mais j'ai trouvé un code que j'ai pu légèrement modifier pour l'adapter à mon fichier et cela marche très bien sauf qu'il faudrait que le déplacement de ligne en couper/coller ne se fasse pas sur la ligne entière mais s'arrête à une colonne définie, dans mon cas à la colonne AO (incluse).

Voici le code

Sub MacroAnnulation()
Dim LastLig As Long
Dim cDest As Range

Application.ScreenUpdating = False
With ThisWorkbook
    'cDest: La celllule de destination: première cellule vide de la colonne A de Feuille13
    With .Worksheets("Feuille13")
        Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
    End With
    With .Worksheets("Feuille2")
        'Enlève l'éventuel filtre automatique
        .AutoFilterMode = False
        'LastLig, ligne de la dernière cellule remplie de colonne A de Feuille2
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        'On fait un filtre automatique sur la colonne A de Feuille2 avec comme critère "annulé"
        .Range("A3:A" & LastLig).AutoFilter field:=1, Criteria1:="annulé"
        'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
        If .Range("A3:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            With .Range("A4:A" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                .Copy cDest
                'on supprime toutes les lignes visibles (sauf la ligne des titres)
                .Delete
            End With
        End If
        'on vide notre variable cDest
        Set cDest = Nothing
        'On enlève le filtre automatique
        .AutoFilterMode = False
    End With
End With
End Sub

Pourrez-vous m'aider en m'indiquant quelle ligne du code je dois modifier et comment, pour faire que le couper/coller s'arrête avec la colonne AO ?

Et si à tout hasard vous saviez comment faire pour rendre ce code fonctionnel sur n'importe quelle feuille active plutôt que sur une seule feuille. Ici dans ce code, il est donc défini sur la Feuille2.

Ce serait parfait afin d'utiliser la macro avec des boutons "contrôle de formulaire" sur plusieurs feuilles.

(j'avais pensé à remplacer la ligne "With .Worksheets("Feuille2")" par "With Activesheets" mais cela n'a bien sur pas fonctionné).

Mais au pire, ceci n'est pas vraiment un soucis car je peux très bien faire un code par bouton pour chaque feuille.

Par contre pour le couper/coller je suis vraiment perdu..

Merci d'avance pour votre aide.

Bonsoir,

ActiveSheets ne peut pas fonctionner, car il n'y a jamais qu'une seule feuille active à un moment donné. La propriété qui renvoie la feuille active est : ActiveSheet.

Tu peux aussi éventuellement mettre le nom de feuille en argument de ta Sub et appeler à partir de boutons la procédure avec l'argument indiquant la feuille concernée. Mais si les boutons qui la lancent sont sur la feuille concernée, c'est équivalent. En tout cas une seule macro suffit pour toutes les feuilles, inutile de les multiplier.

Je suppose que tu as bien mesuré toutes les manipulations effectuées... cependant quand tu dis je veux couper jusqu'à AO seulement, cela sous-entend un contenu sur les lignes au-delà de AO. Si donc tu coupes, le contenu des lignes coupées disparaîtra jusqu'en AO. Mais ta macro ne coupe pas, elle supprime les lignes. Il a là des points à préciser.

Cordialement.

Bonsoir et merci pour ton aide

Pour que la macro soit accessible par bouton sur toutes les feuilles via la feuille active, j'aurai dû m'en douter ! Maintenant que tu le dis, l'erreur me paraît évidente...

Par contre, effectivement la macro coupe toute la ligne de la feuille pour la rajouter dans l'autre feuille.

Il faudrait que lorsqu'on appuie sur le bouton, la macro copie les données de la ligne (qui contient le mot "annulé" dans la colonne A) jusqu'à la colonne AO

Pour les coller dans dans la 1ere ligne vide de la dernière feuille ==> En pensant que la 1ere ligne n'est en réalité pas vide car elle contient des données après la colonne AO également.

Puis les supprimes de la 1ere feuille en décalant vers le haut (pour ne pas affecter les données après la colonne AO et ne pas laisser des "blancs").

Et là je serai bien incapable de réaliser cela.

Si quelqu'un à un code qui peut faire l'affaire, même s'il faut un peu l'adapter, je peux toujours chercher des tuto pour m'aider à le faire. Et ce serait déjà super !

Sinon je ne veux pas abuser, mais je joint toujours un fichier exemple sans macro, si jamais..

ps : il y aura une feuille pour chaque mois de l'année, j'en ai supprimé afin d'alléger le fichier.

Et J'utilisais le critère de la cellule en colonne A qui contient le mot "annulé", mais on pourrait aussi utiliser le critère des lignes qui sont en rouge (car lorsqu'il y à le mot annulé dans la colonne A, la ligne se colore en rouge jusqu'à la colonne AO). Je ne sais pas si cela facilite..

Bien à vous

24rc-test.xlsx (42.48 Ko)

Re,

Je pensais que tes lignes se poursuivaient au-delà de AO, mais il n'y a pas continuité, donc en principe aucun souci.

Modication très minime à faire (j'ai aussi enlevé quelques instructions inutiles (la référence au classeur, qui ne s'impose pas, pas d'ambiguïté, et le vidage de variable qui va disparaître en fin d'exécution). Mais macro très bien structurée...

Sub MacroAnnulation()
    Dim LastLig As Long
    Dim cDest As Range
    Application.ScreenUpdating = False
    'cDest: La celllule de destination: première cellule vide de la colonne A de Feuille13
    With Worksheets("Annulations")
        Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
    End With
    With ActiveSheet
        'Enlève l'éventuel filtre automatique
        .AutoFilterMode = False
        'LastLig, ligne de la dernière cellule remplie de colonne A de Feuille2
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        'On fait un filtre automatique sur la colonne A de Feuille2 avec comme critère "annulé"
        .Range("A3:A" & LastLig).AutoFilter field:=1, Criteria1:="annulé"
        'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
        If .Range("A3:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            With .Range("A4:AO" & LastLig).SpecialCells(xlCellTypeVisible)
                'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                .Copy cDest
                'on supprime toutes les lignes visibles (sauf la ligne des titres)
                .Delete xlShiftUp
            End With
        End If
        'On enlève le filtre automatique
        .AutoFilterMode = False
    End With
    Application.ScreenUpdating = True
End Sub

Cordialement


Il me semble avoir vu que tes titres sont en ligne 2 sur le modèle, les donnnées commençant ligne 3.

Si c'est le cas, il te faudra remonter d'un cran : dans la macro c'est 3 et 4...

Merci beaucoup !

Désormais le bouton fonctionne bien sur chaque feuille et le coller de la ligne n'impacte plus les colonnes au delà de la colonne AO.

Mais le copier (ou couper) supprime toujours entièrement la ligne car cela impacte toujours les colonnes au delà de la colonne AO.

On a déjà fait plus de la moitié du chemin..

Mais je ne saurai plus répondre avant quelques heures.. un grand merci pour l'entraide !

Bien à vous

Cela ne devrait pas, c'est cadré sur AO !

Je vais regarder.

Bizarre...

Mais vites fait, attention que si tu travail sur le fichier que j'ai mis en pièce en jointe, utilises ce code ci, car le nom des feuilles est différent que dans le code que j'avais posté dans mon premier message.

        Sub MacroAnnulation()
        Dim LastLig As Long
        Dim cDest As Range
        Application.ScreenUpdating = False
        'cDest: La celllule de destination: première cellule vide de la colonne A de Annulations
       With Worksheets("Annulations")
            Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
        End With
        With ActiveSheet
            'Enlève l'éventuel filtre automatique
           .AutoFilterMode = False
            'LastLig, ligne de la dernière cellule remplie de colonne A de Janvier
           LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
            'On fait un filtre automatique sur la colonne A de Janvier avec comme critère "annulé"
           .Range("A3:A" & LastLig).AutoFilter field:=1, Criteria1:="annulé"
            'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
           If .Range("A3:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                With .Range("A4:AO" & LastLig).SpecialCells(xlCellTypeVisible)
                    'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                   .Copy cDest
                    'on supprime toutes les lignes visibles (sauf la ligne des titres)
                   .Delete xlShiftUp
                End With
            End If
            'On enlève le filtre automatique
           .AutoFilterMode = False
        End With
        Application.ScreenUpdating = True
    End Sub

Vraiment merci

J'ai fait mes essais sur un modèle réduit que j'avais déjà adapté.

Il apparaît qu'en défiltrant avant de supprimer cela règle le problème.

Donc, il suffit que tu déplaces la ligne : .AutoFilterMode = False

entre les lignes .Copy... et .Delete...

Mais attention, il faut le qualificateur d'objet, car tu es dans une instruction With... End With qui réfère à la plage copiée et à détruire. Il faut donc mettre :

ActiveSheet.AutoFilterMode = False

A tester. Honnêtement, j'avais testé d'abord en utilisant une variable plage, et ça fonctionnait (j'avais tout de même défiltrer avant suppression). J'ai essayé par acquit de conscience, pensant qu'en défiltrant cela perturberait la plage discontinue, mais non finalement, la mise en mémoire par With demeure. Donc ce qui se passait plutôt, c'est qu'en supprimant les cellules visibles, Excel ne parvient plus à réajuster les autres, encore non visibles, et s'en tire en supprimant la ligne entière, ce qui aligne toutes les lignes encore masquées.

Cordialement.

Et à+ si difficultés.

Super, ca à l'air de fonctionner parfaitement, génial, merci pour ton aide et ta patience !

Je test cela comme il faut tout à l'heure et je reviens pour dire ce qu'il en est, mais je pense que c'est du tout bon..

Merci

De rien C'est pas tout les jours qu'on supprime des fragments de ligne sur une zone filtrée...

J'ai appris quelque chose...

Re,

Oui c'est vraiment parfait, ca fait le boulot à merveille et c'est très bien !

Un tout grand merci, je suis certain que tu m'as fais gagner beaucoup de temps.. Il ne me reste plus qu'a décortiquer le tout afin de comprendre un peu plus le sujet..

Tiens petite questions au passage, est-il possible de lancer une macro sur une feuille protégée ?

Ici en protégeant une feuille, j'ai remarqué l'option "autoriser les utilisateurs à utiliser le filtre automatique", j'ai donc coché l'option afin d'essayer mais le résultat n'était pas concluant, cela m'a renvoyer à une erreur sur ligne

.Range("A2:A" & LastLig).AutoFilter field:=1, Criteria1:="annulé"

Par curiosité, est-ce qu'il y à facilement moyen de passer au dessus ?

Bien à vous,

Il est possible de la lancer la macro, mais prévoir qu'elle commence par déprotéger, car un certain nombre d'opérations ne seront pas possibles... Déprotéger est simple, reprotéger à la fin un peu moins, il faut reprendre toutes les options de protection retenues. Mais pas de difficultés particulières.

Cordialement.

Ah oui effectivement, j'aurai mieux fais de chercher avant de poser cette question, car dans les premiers liens de notre "ami" Google, j'ai trouvé la solution pour enlever puis remettre la protection en début et en fin de la macro.

C'est tout simple en fait.. 8)

Sub NomDeLaMacro()

ActiveSheet.Unprotect "LeMotDePasse"

On place ici les instructions de la macro

ActiveSheet.Protect "LeMotDePasse", True, True, True

End Sub 

Encore un grand merci à toi, merci pour tout, et bonne continuation !

Rechercher des sujets similaires à "deplacement automatique ligne pas entiere"