Macro décallage ligne

Bonjour,

Je suis actuellement sur la conception d'un TO DO LIST (début).

Mon classeur possède 2 onglets : "EN COURS" qui sera visible et "SAUVEGARDER" qui sera caché par l'utilisateur.

Je souhaite avoir la possibilité de déplacer une ligne entière présente sur l'onglet (via un bouton) "EN COURS" vers l'onglet "SAUVEGARDER".

La ligne sera alors déplacée de l'onglet "EN COURS" vers l'onglet "SAUVEGARDER".

Puis, je souhaite avoir la possibilité (via un bouton également) de consulter mes lignes sauvegarder via l’apparition d'une fenêtre et avoir la possibilité de la restaurer/déplacée sur l'onglet "EN COURS"

Pouvez-vous m'aider ?

Merci !

capture

Bonjour,

Trois code par rapport à tes boutons. explications dans le code et fais attention aux noms des deux feuilles qui sont différents de ta copie d'écran donc, adaptes. Fait des tests sur une copie de ton fichier afin de voir le fonctionnement sans risque de perdre des données :

Sub Sauvegarder()

    Dim Plage As Range
    Dim Lig As Long

    'défini la plage sur la ligne de la ou les cellules sélectionnée (la cellule en haut à gauche étant la cellule de référence de la sélection)
    With Worksheets("EN COURS"): Set Plage = .Range(.Cells(ActiveCell.Row, 1), .Cells(ActiveCell.Row, .Columns.Count).End(xlToLeft)): End With

    'recherche la première ligne vide pouvant recevoir les valeurs
    With Worksheets("SAUVEGARDER")

        Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Range(.Cells(Lig, 1), .Cells(Lig, Plage.Columns.Count)).Value = Plage.Value

        'si le numéro de la ligne doit être mémorisé avec les valeurs, ôter l'apostrophe de la ligne ci-dessous
        '.Cells(Lig, Plage.Columns.Count + 1).Value = Plage.Row

    End With

End Sub

Sub Supprimer()

    Dim Plage As Range
    Dim Lig As Long

    'défini la plage...
    With Worksheets("EN COURS"): Set Plage = .Range(.Cells(ActiveCell.Row, 1), .Cells(ActiveCell.Row, .Columns.Count).End(xlToLeft)): End With

    'affiche une boite de message pour confirmation de suppression
    If MsgBox("Voulez-vous vraiment supprimer les valeurs de la plage '" & _
              Plage.Address(0, 0) & "' située sur la ligne '" & Plage.Row & "' ?", vbQuestion + vbYesNo) = vbNo Then Exit Sub

    With Worksheets("SAUVEGARDER")

        Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1

        'malgré la suppression, les valeurs sont tout de même sauvegardées puis la ligne est mise en rouge
        'et le numéro de ligne mémorisé pour une éventuelle restauration dans la même ligne mais pas forcément
        'au même endroit si des suppressions ont eue lieu au dessus
        .Range(.Cells(Lig, 1), .Cells(Lig, Plage.Columns.Count)).Value = Plage.Value
        .Range(.Cells(Lig, 1), .Cells(Lig, Plage.Columns.Count)).Interior.ColorIndex = 3

        .Cells(Lig, Plage.Columns.Count + 1).Value = Plage.Row

    End With

    'suppression
    Plage.EntireRow.Delete xlShiftUp

End Sub

Sub Restaurer()

    Dim Plage As Range
    Dim Lig As Long

    'défini la plage sur la ligne de la ou les cellules sélectionnée (la cellule en haut à gauche étant la cellule de référence de la sélection)
    With Worksheets("SAUVEGARDER"): Set Plage = .Range(.Cells(ActiveCell.Row, 1), .Cells(ActiveCell.Row, .Columns.Count).End(xlToLeft)): End With

    'récupère le numéro de ligne situé dans la dernière colonne puis insère la ligne et inscrit les valeurs sans le numéro de ligne
    With Worksheets("EN COURS")

        Lig = Plage(1, Plage.Columns.Count).Value
        .Cells(Lig, 1).EntireRow.Insert
        .Range(.Cells(Lig, 1), .Cells(Lig, Plage.Columns.Count - 1)).Value = Plage.Value

    End With

    'et supprime les valeurs restaurées dans la feuille "SAUVEGARDER"
    Plage.EntireRow.Delete xlShiftUp

End Sub

Merci beaucoup pour votre retour rapide ! Je test dans la journée puis je vous fais un feedback

J'ai testé.

Cela marche très bien et du premier coup ! Merci

Cependant, concernant le bouton restaurer. Je suis obligé d'être sur la feuille "SAUVEGARDER" pour pouvoir restaurer. Hors, cette feuille ne sera pas visible par l’utilisateur.

Est il possible depuis l'onglet "EN COURS" de cliquer sur le bouton "RESTAURER" et voir apparait une petite fenêtre avec les éléments sauvegardés et pouvoir choisir depuis cette fenêtre quel élément on souhaite restaurer ?

17to-do-list-2.xlsm (376.18 Ko)

Bonjour,

Il y a une multitude de façons de récupérer les valeurs à restaurer, un InputBox() (exemple ci-dessous), une ListBox sur un UserForm, un affichage de la feuille "Sauvegarde" en mode protégé par un mot de passe puis re cachée après le choix, etc...

Ici, le code attaché au bouton "Restaurer" avec un simple InputBox() demandant le numéro de la ligne à restaurer mais ce n'est pas trop parlant pour l'utilisateur sinon, comme indiqué plus haut une ListBox dans un UserForm affichant les valeurs de la feuille "Sauvegarde" afin que l'utilisateur puisse choisir en toute sécurité les valeurs à restaurer, de même que l'affichage de cette dernière si bien sûr, il a le droit de la visionner :

Private Sub CommandButton3_Click()

    Dim Plage As Range
    Dim Lig As Long
    Dim LigRest

    'demande le numéro de la ligne à restaurer mais ce n'est pas très parlant pour l'utilisateur !!!
    LigRest = InputBox("Quel numéro de ligne souhaitez vous restaurer ?", "Restaurer", 2)

    If LigRest = "" Then MsgBox "Abandon !": Exit Sub

    'défini la plage sur la ligne de la ou les cellules sélectionnée (la cellule en haut à gauche étant la cellule de référence de la sélection)
    With Worksheets("Sauvegarde"): Set Plage = .Range(.Cells(CLng(LigRest), 1), .Cells(CLng(LigRest), .Columns.Count).End(xlToLeft)): End With

    'récupère le numéro de ligne situé dans la dernière colonne puis insère la ligne et inscrit les valeurs sans le numéro de ligne
    With Worksheets("En cours")

        Lig = Plage(1, Plage.Columns.Count).Value
        .Cells(Lig, 1).EntireRow.Insert
        .Range(.Cells(Lig, 1), .Cells(Lig, Plage.Columns.Count - 1)).Value = Plage.Value

    End With

    'et supprime les valeurs restaurées dans la feuille "SAUVEGARDE"
    Plage.EntireRow.Delete xlShiftUp

End Sub
Rechercher des sujets similaires à "macro decallage ligne"