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 !
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 SubMerci 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 ?
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