Une macro pour remonter une ligne d'un cran vers le haut

Bonjour Forum !

J'aimerais écrire une macro mais je ne sais pas comment m'y prendre.

Je voudrais faire une macro qui déplace une ligne (ou plutôt : toutes les lignes sélectionnées) d'un cran vers le haut (par exemple la ligne 8 prend la place de la ligne 7, l'ancienne ligne 7 devient la ligne 8 ), sans dérégler les formules.

Quelqu'un saurait-il comment faire ça ?

Dernière précision : c'est une macro que je lancerai avec un raccourci clavier.

Merci !!!

PS : ensuite je me débrouillerai pour bidouiller le code pour créer la macro qui déplace une ligne vers le bas

bonsoir,

comme tu l'expliques, je comprends qu'il s'agit d'inverser 2 lignes, peux-tu expliquer comment les formules doivent s'adapter à ce changement ?

peux-tu fournir un exemple avec une situation initiale, un mouvement à opérer et le résultat attendu ?

Merci pour ta réponse.

Plutôt que d'inverser, il s'agit de déplacer d'un cran vers le haut la ou les lignes sélectionnées.

A ta demande, et pour mieux me faire comprendre, je joins un fichier-exemple.

Quant aux formules, la manip ne doit pas changer leur résultat. Les adresses dans les formules doivent se mettre à jour.

Autrement dit, si je devais déplacer "manuellement" les lignes 3 et 4 d'un tableau d'un cran vers le haut, je ferais comme ça :

– insérer 2 lignes vides au-dessus de la ligne 2

– sélectionner les lignes 3 et 4

– cliquer-glisser les lignes 3 et 4 jusqu'à leur nouvel emplacement

– sélectionner et effacer leur ancien emplacement

Les anciennes lignes 3 et 4 sont devenues lignes 2 et 3.

L'ancienne ligne 2 est devenue ligne 4.

Les formules donnent toujours les mêmes résultats.

J'espère avoir mieux exposé ma question.

Merci.

rebonsoir,

voici une macro qui remonte la sélection d'une ligne. comme je n'ai pas d'exemple de tes formules qui doivent donner le même résultat, je ne peux pas garantir que les formules sont adaptées comme tu le souhaites.

Sub monter()
' ll nombre de lignes de la sélection
ll = Selection.Rows.Count
'fl première ligne de la sélection
fl = Selection.Cells(1, 1).Row

' couper la ligne précédant la sélection
Rows(fl - 1).Cut
' insérer la ligne après la sélection et décalant les autres lignes vers le bas
Rows(fl + ll).Insert shift:=xlDown
End Sub

tu trouveras ci-dessous le code pour descendre

Sub descendre()
' ll nombre de lignes de la sélection
ll = Selection.Rows.Count
'fl première ligne de la sélection
fl = Selection.Cells(1, 1).Row

' couper la ligne suivant la sélection
Rows(fl + ll).Cut
' insérer la ligne avant la sélection et décalant les autres lignes vers le bas
Rows(fl).Insert shift:=xlDown
End Sub

Merci beaucoup !

Ça marche parfaitement (y compris pour les formules, que cette fois j'ai insérées dans le fichier joint).

Dernière demande, si ce n'est pas abuser : que les lignes sélectionnées avant de lancer la macro restent sélectionnées.

Ça me permettra de relancer la macro jusqu'à ce que les lignes atteignent leur destination finale.

J'ai essayé en tâtonnant, mais je ne sais pas faire (mon niveau en VBA : débutant moins).

Merci.

bonjour,

modification pour garder la sélection

Sub monter()
' ll nombre de lignes de la sélection
ll = Selection.Rows.Count
'fl première ligne de la sélection
fl = Selection.Cells(1, 1).Row

' couper la ligne précédant la sélection
Rows(fl - 1).Cut
' insérer la ligne après la sélection et décalant les autres lignes vers le bas
Rows(fl + ll).Insert shift:=xlDown
Rows(fl - 1 & ":" & fl + ll - 2).Select
End Sub

et pour descendre

Sub descendre()
' ll nombre de lignes de la sélection
ll = Selection.Rows.Count
'fl première ligne de la sélection
fl = Selection.Cells(1, 1).Row

' couper la ligne suivant la sélection
Rows(fl + ll).Cut
' insérer la ligne avant la sélection et décalant les autres lignes vers le bas
Rows(fl).Insert shift:=xlDown
Rows(fl + 1 & ":" & fl + ll).Select
End Sub

C'est parfait, merci beaucoup !

Histoire d'avoir un peu participé moi aussi et d'en faire profiter ceux que ça pourrait intéresser, voilà la macro pour faire descendre les lignes sélectionnées, en les gardant sélectionner (si on veut relancer la macro) :

Sub descendre()
' ll nombre de lignes de la sélection
ll = Selection.Rows.Count
'fl première ligne de la sélection
fl = Selection.Cells(1, 1).Row

' couper la ligne suivant la sélection
Rows(fl + ll).Cut
' insérer la ligne avant la sélection et décalant les autres lignes vers le bas
Rows(fl).Insert shift:=xlDown

' repositionner la sélection sur les lignes sélectionnées au départ
Rows(fl + 1 & ":" & fl + ll).Select

End Sub

Dernière précision pour ceux que ça intéresse vraiment : ces 2 macros, associés à des raccourcis clavier, sont super pratiques.

Pour ma part, comme j'utilise tous les raccourcis disponibles dans Excel, j'en ai ajouté avec la méthode Onkey (voir aide VBA).

J'ai placé le code suivant dans mon classeur de macros personnelles, dans ThisWorkbook :

Private Sub Workbook_Open()
    Application.OnKey "^%{PGUP}", "PERSO.xls!Monter"
    Application.OnKey "^%{PGDN}", "PERSO.xls!Descendre"
    End Sub

Une fois Excel redémarré,

la macro qui monte les lignes est lancée par la combinaison : CTRL + ALT + la touche PgUp (page précédente)

la macro qui descend les lignes est lancée par la combinaison : CTRL + ALT + la touche PgDn (page suivante)

Bonjour Forum !

Je relance ce post pour essayer d’améliorer encore un peu les 2 macros correspondantes.

Elles fonctionnent parfaitement, sauf en mode filtre.

Quelqu’un pourrait-il m’aider à les faire fonctionner quand un filtre est activé dans la feuille ?

Merci !

Je relance ce post, qui n'a pas abouti...

Rechercher des sujets similaires à "macro remonter ligne cran haut"