IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro ANNULER une suppression (par macro) dans une feuille [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut Macro ANNULER une suppression (par macro) 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    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.

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Salut
    Je vois 2 solution possible a ton problème

    -La 1er, tu fais une copie de ta feuille que tu gardes caché dans ton classeur, ainsi tu n'aura qu'a supprimer celle ou tu as les modifs que tu ne souhaites pas conserver et ensuite tu affiche ta feuille sauvegardée que tu renommes, avec un application.screenupdating a true se serait totalement transparent pour l'utilisateur?

    -2eme solution, qui répond a une de tes question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Tab_Sauve As Variant
    'Pour sauver tes valeur
    Tab_Sauve = .UsedRange.Value
     
     
    [...] 'le reste de ton code
     
    'Pour tout remettre
    With LaFeuilleSurLaquelleTuTravailles
        .Range("A1", .Cells(UBound(Tab_Sauve, 2), UBound(Tab_Sauve, 1))).Value = Tab_Sauve
    End With
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut
    Merci Qwazerty pour ta réponse.


    D'autres personnes avaient eu ta 1ère idée sur d'autres forums (sauvegarde de la feuille ou du fichier).


    En fait, cela est difficilement applicable, puisque mon but est que ma macro de suppression ne s'applique pas à un fichier unique, mais à N fichiers, comme peuvent le faire ASAP ou PUP (si tu connais).


    Concernant ta 2ème solution, c'est dans cette direction que je dois aller.
    Voici un bout de code un peu similaire au tien. C'est à dire qu'après suppression, la macro replace les valeurs et formules d'avant suppression.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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

    1) Si la sélection est trop importante (environ plus de 7 500 000 cellules, soit 30 000 lignes et 256 colonnes), il y a un manque de mémoire. Saurais-tu comment résoudre ce problème ? Si non, ce n'est pas grave, car dans la pratique c'est rare d'avoir une telle sélection.


    2) Après restitution après suppression des valeurs et formules, je cherche à restituer les formats de cellules : saurais-tu comment faire ?



    Voilà, merci d'avance pour ta réponse et bonne journée.

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Salut
    Ça ne va pas être simple de conserver les formats

    En fait, cela est difficilement applicable, puisque mon but est que ma macro de suppression ne s'applique pas à un fichier unique, mais à N fichiers, comme peuvent le faire ASAP ou PUP (si tu connais).
    Je connais SAP (malheureusement) mais pas ASAP ou PUP, mais par contre la solution de faire une copie intégral du sheet serait bien universelle a n'importe quelle classeur. Les avantage sont nombreux, plus de limitation mémoire, il faut savoir aussi que si une macro autre plante, les variables sont parfois mise a zéro... ça m'est déjà arrivé et dans ce cas tu perds tout...., autre avantage, les mise en forme seront de faite sauvegardée.
    Le faite de changer la propriété visible de ton sheet te permettrait de la cacher au vue de l'utilisateur le temps de l'exécution de ta macro.

    Le fait de créer une sheet invisible et strictement la même chose que de créer une variable mémoire ou tu y stockerais les valeurs et les mises en forme, je ne vois pas pourquoi tu es retissant a utiliser cette méthode.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] mettre une formule dans une cellule par macro
    Par jauffray.delteil dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/11/2021, 14h54
  2. Réponses: 6
    Dernier message: 07/03/2013, 13h43
  3. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  4. Sélectionner une chaine de car. dans une cellule par macro
    Par CyrilAtOffice dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/03/2010, 16h22
  5. Mettre une date par defaut dans une textBox.
    Par yaumme dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/12/2005, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo