[XL-2003] Macro Rétablir une suppression (lignes, colonnes) dans une feuille

Air1

XLDnaute Nouveau
[VBA] Macro ANNULER une suppression (par macro) de cellules dans une feuille

Bonjour à tous,


Je vous sollicite car j'ai besoin d'une grande aide. En effet, après quelques heures de recherche sur Internet, je n'ai pas encore trouvé de réponses à ma question.


Je souhaite écrire une macro qui annule la suppression de lignes, de colonnes ou de toutes les cellules dans une feuille de calcul. (c'est à dire que la feuille de calcul revienne à l'état d'avant la suppression, avec les mêmes valeurs et la même mise en forme). Excel le fait facilement, donc cela doit être possible à faire. Le problème est que je n'ai pas accès au code Excel...


J'ai donc bien cerné le fonctionnement de l'application Undo (Application.Undo). Mon idée était de déclarer l'ensemble de mes cellules dans une variable, puis, après suppression, de coller les données (correspondant aux cellules avant suppression) de cette variable dans ma feuille de calcul.


Comme d'habitude, j'utilise une variable "Range" :

Code:
Sub UndoSuppression()

Dim RangeSave as Range

Set RangeSave = Cells

End Sub

Mais la variable "RangeSave" s'adapte à la sélection, c'est à dire que quand, par exemple, je supprime 2 lignes, ces 2 lignes ne sont plus présentes dans "RangeSave". Mon objectif est donc de fixer la plage de données dans une variable, celle-ci restant TOUJOURS la même quelque soit les opérations effectuées (suppression de lignes...).


J'avais aussi pensé à boucler sur l'ensemble des cellules, mais cela est bien sûr ultra long, car il faut gérer plus de 15 millions de cellules !!!



Encore une fois, Excel le fait très simplement et rapidement, donc je pense que cela est largement faisable.



Si vous avez des idées ou des solutions, n'hésitez pas à les faire partager, pour faire avancer les autres ainsi que moi-même.



Merci d'avance et bonne journée.
 
Dernière édition:

mromain

XLDnaute Barbatruc
Re : [XL-2003] Macro Rétablir une suppression (lignes, colonnes) dans une feuille

Bonjour Air1,


Je m'étais déjà pris la tête avec un problème similaire. La solution que j'avais prise était de faire un copie de la feuille en début de macro (pour avoir une trace de la feuille en état avant la macro).
cela te permet à tout moment dans ta macro d'accéder à des cellules/colonnes/lignes supprimées).

En attendant d'autres pistes...

a+
 

Air1

XLDnaute Nouveau
Re : [XL-2003] Macro Rétablir une suppression (lignes, colonnes) dans une feuille

Merci pour la réponse rapide.


A force de rechercher, j'ai écris n'importe quoi.
C'est en effet "[XL-2003] Macro ANNULER une suppression (lignes, colonnes)dans une feuille" et non "[XL-2003] Macro RETABLIR une suppression (lignes, colonnes)". Désolé pour cette erreur.


Ensuite, je ne l'avais pas précisé, mais mon but est d'exécuter ma macro "Suppression" sur n'importe quel fichier.


J'avais bien pensé à une idée dans le genre. Je pensais donc par macro à copier ma feuille de calcul active dans mon classeur, et, en cas d'annulation de la suppression, copier-coller les cellules de la feuille copiée dans la feuille d'origine, puis de supprimer la feuille copiée.


Mais si l'utilisateur ne veut pas annuler la suppression, il faudrait supprimer la feuille copiée quand le fichier est quitté. Sachant qu'il y aurait autant de feuilles copiées que de fois ou la macro "Suppression" est appelée, cela pourrait faire un fichier conséquent...


Si vous avez d'autres idées, je suis preneur...
 

Air1

XLDnaute Nouveau
Re : [XL-2003] Macro Rétablir une suppression (lignes, colonnes) dans une feuille

Je viens de résoudre ce problème, de cette façon :


Ce que je cherchais à faire idéalement est trop coûteux en mémoire.


J'ai donc pris la méthode suivante (sauvegarde des valeurs et formules supprimées, puis restitution de celles-ci) proposée par un internaute sur un autre forum, en demandant par "MsgBox" la confirmation à l'utilisateur de sa volonté de supprimer les lignes ou colonnes :

Code:
Dim toto As String, rangesave, lafeuille As Worksheet
 
 Set lafeuille = Sheets("Feuil1")
 With lafeuille
   rangesave = .UsedRange.Value
   RFormule = .UsedRange.Formula
   toto = .UsedRange.Address
   MsgBox toto ' je le laisse pour toi... efface cette instruction ensuite
 
   .Rows("5:15").Delete
   MsgBox "regarde ta feuille"
   Application.ScreenUpdating = False
   .Range(toto).Value = rangesave
   .Range(toto).Formula = RFormule
   Application.ScreenUpdating = True
   MsgBox "regarde ta feuille"
 End With



J'ai aussi géré le fait que la sauvegarde des données prenne trop de place (toutes les cellules de la feuille de calcul pleines) en renvoyant un message d'erreur disant que la restitution des données supprimées est impossible.




Merci néanmoins pour votre aide.
 

Discussions similaires


Haut Bas