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 :

Undo et macro VBA [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Points : 28
    Points
    28
    Par défaut Undo et macro VBA
    Bonjour,

    J'ai cherché à savoir si il était possible d'avoir la fonctionnalité "Undo" après une éxécution d'un macro ?
    Pour le moment je n'ai rien trouver de probant...

    Plus précisement :
    - Est-il possible de de sauvegardé la pile du bouton "Undo"
    - d'éxécuter la macro
    - de recharger la pile pour rendre opérant le bouton "Undo"

    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour,
    Citation Envoyé par Patoche90 Voir le message
    Pour le moment je n'ai rien trouver de probant...
    Bien entendu tu ne peux rien trouver car si tu regardes les spéficités de la fonction dans Aide undo tu aurais eu la réponse
    Cette méthode n'annule que la dernière opération commandée par l'utilisateur avant l'exécution de la macro et doit figurer en première ligne dans la macro. Elle ne peut être utilisée pour annuler des commandes Visual Basic.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    ???

    je pensais plus a quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i As Integer = 1 To xlApp.CommandBars("Standard").Controls("&Undo").Control.ListCount
                    UnDoList(i) = xlApp.CommandBars("Standard").Controls("&Undo").Control.List(i)
                Next

  4. #4
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour,
    Citation Envoyé par Patoche90 Voir le message
    je pensais plus a quelque chose comme cela
    Tu peux imaginer ce que tu veux, comme par exemple décoller avec ta voiture bloquée dans un embouteillage mais tant que cela n'est pas opérationnel cela reste du rêve.

    Undo ne permet que la suppression de la dernière saisie non admise de l'utilisateur et si tu veux rembobiner le déroulement de ta macro il faut le programmer.

  5. #5
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par anasecu Voir le message
    ... Undo ne permet que la suppression de la dernière saisie non admise de l'utilisateur et si tu veux rembobiner le déroulement de ta macro il faut le programmer.
    Je confirme j'ai rien trouvé de mieux que de faire une macro qui fait à l'envers le travail que fait la première macro. Même le [CTRL] + [Z] (le célèbre Control Zut) ne marche pas !
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par anasecu Voir le message
    Bonjour,


    Tu peux imaginer ce que tu veux, comme par exemple décoller avec ta voiture bloquée dans un embouteillage mais tant que cela n'est pas opérationnel cela reste du rêve.

    Undo ne permet que la suppression de la dernière saisie non admise de l'utilisateur et si tu veux rembobiner le déroulement de ta macro il faut le programmer.
    Des voitures qui décollent à la verticale cela existe.... c'est opérationnel mais la législation ne le permet pas....
    Je n'ai jamais dit que je ne voulais pas programmer....
    et enfin mon besoin n'est pas d'utiliser "UNDO" de VBA ( j'ai lu l'aide en ligne avant de poster .... ) mais d'en avoir sa fonctionnalité c'est ce que j'ai écrit dans mon premier post.....

    Cordialement.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Points : 518
    Points
    518
    Par défaut
    Juste pour savoir si j'ai bien compris le problème. Dans l'exécution ça ressemblerait à :

    Exécuter une macro entre le moment où tu cliques sur "Undo" et le moment où "Undo" s'effectue ?

    Quel est le but de ta macro ?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    L'utilisateur travaille normalement dans son fichier, les boutons (Undo et Redo) sont disponibles.
    au moment de faire "Entrée", j'ai une macro qui intervient dans sub worksheet_Change -> met un tag dans une colonne cachée
    et à partir de ce moment les boutons ne sont plus disponibles (j'imagine qur'ils ont été resetté du à l'action de la macro)
    Par contre l'utilisateur souhaiterais revenir en arrière a cause d'une valeur mal renseignée par exemple. (le tag mis dans la colonne cachée peut rester, ce n'est pas grave)

    Donc l'idée est de sauvegarder la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For I = 1 To Application.CommandBars("Standard").Controls("&Undo").Control.ListCount
        UnDoList(I) = Application.CommandBars("Standard").Controls("&Undo").Control.List(I)
    Next
    pour ensuite la recharger au moment de sortir de la macro

    Mais je ne sais pas ce qui est faisable exactement. Et je ne souhaite pas faire une sauvegarde de l'onglet avant la macro, car je souhaite conserver les modifications de l'utilisateurs avant la macro et non pas un état figé...

    J'espére que j'ai bien exprimé mon besoin...

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Points : 518
    Points
    518
    Par défaut
    Donc...

    1) "Entrée"
    2) Exécution de la macro qui cache les boutons Undo et Redo
    3) L'utilisateur veut cliquer sur "Undo" pour modifier des valeurs mais le bouton n'est plus visible

    Un CommandBar.Visible = True ne pourrait-il pas résoudre ton problème ?

    Ou bien je n'ai toujours pas compris ce que tu souhaites faire...

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    stocker la pile "UNDO"
    réaliser une macro
    Recharger la pile "UNDO"

    je vais analyser ça pour savoir si cela correspond :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    '=========================================================================
    ' Module    : clsUndoObject
    ' Company   : JKP Application Development Services (c) 2005
    ' Author    : Jan Karel Pieterse
    ' Created   : 31-8-2005
    ' Purpose   : Class module, Contains each object processed and
    '             handles the exection of the command and the Undo
    ' Copyright : This code is free for you to use for applications
    '             for personal use.
    '             It is not allowed to use this for a commercial program,
    '             unless you have my consent.
    '             If you want to include this code in freeware, make sure you add :
     
    '-------------------------------------------------------------------------
    ' This code originates from    : Jan Karel Pieterse
    ' Company                      : JKP Application Development Services (c) 2005
    '                                jkp-ads.com
    '-------------------------------------------------------------------------
    '=========================================================================
    Option Explicit
     
    Private mUndoObject As Object
    Private msProperty As String
    Private mvNewValue As Variant
    Private mvOldValue As Variant
     
    Public Property Let PropertyToChange(sProperty As String)
        msProperty = sProperty
    End Property
     
    Public Property Get PropertyToChange() As String
        PropertyToChange = msProperty
    End Property
     
    Public Property Set ObjectToChange(oObj As Object)
        Set mUndoObject = oObj
    End Property
     
    Public Property Get ObjectToChange() As Object
        Set ObjectToChange = mUndoObject
    End Property
     
    Public Property Let NewValue(vValue As Variant)
        mvNewValue = vValue
    End Property
     
    Public Property Get NewValue() As Variant
        NewValue = mvNewValue
    End Property
     
    Public Property Let OldValue(vValue As Variant)
        mvOldValue = vValue
    End Property
     
    Public Property Get OldValue() As Variant
        OldValue = mvOldValue
    End Property
     
    Public Function ExecuteCommand() As Boolean
        ExecuteCommand = False
        If mUndoObject Is Nothing Then
        End If
        If mvNewValue = "" Then
        End If
        If msProperty = "" Then
        End If
        If GetOldValue Then
            SetNewValue
            ExecuteCommand = True
        Else
            'Failed to retrieve old value!
        End If
    End Function
     
    Private Function GetOldValue() As Boolean
        Dim oTemp As Object
        Dim lCount As Long
        Dim lProps As Long
        Dim vProps As Variant
        vProps = Split(PropertyToChange, ".")
        lProps = UBound(vProps)
        Set oTemp = ObjectToChange
        For lCount = 0 To lProps - 1
            Set oTemp = CallByName(oTemp, vProps(lCount), VbGet)
        Next
        If TypeOf oTemp Is Range Then
            If LCase(vProps(lProps)) = "value" Then
                vProps(lProps) = "Formula"
            End If
        End If
        OldValue = CallByName(oTemp, vProps(lProps), VbGet)
        If Err.Number = 0 Then
            GetOldValue = True
        Else
            GetOldValue = False
        End If
    End Function
     
    Private Function SetNewValue() As Boolean
        Dim oTemp As Object
        Dim lCount As Long
        Dim lProps As Long
        Dim vProps As Variant
        Dim vResult As Variant
        Err.Clear
        Set oTemp = ObjectToChange
        vProps = Split(PropertyToChange, ".")
        lProps = UBound(vProps)
        For lCount = 0 To lProps - 1
            Set oTemp = CallByName(oTemp, vProps(lCount), VbGet)
        Next
        If TypeOf oTemp Is Range Then
            If LCase(vProps(lProps)) = "value" Then
                vProps(lProps) = "Formula"
            End If
        End If
        vResult = CallByName(oTemp, vProps(lProps), VbLet, NewValue)
        If Err.Number = 0 Then
            SetNewValue = True
        Else
            SetNewValue = False
        End If
    End Function
     
    Public Function UndoChange()
        Dim oTemp As Object
        Dim lCount As Long
        Dim lProps As Long
        Dim vProps As Variant
        Dim vResult As Variant
        Set oTemp = ObjectToChange
        vProps = Split(PropertyToChange, ".")
        lProps = UBound(vProps)
        For lCount = 0 To lProps - 1
            Set oTemp = CallByName(oTemp, vProps(lCount), VbGet)
        Next
        If TypeOf oTemp Is Range Then
            If LCase(vProps(lProps)) = "value" Then
                vProps(lProps) = "Formula"
            End If
        End If
        vResult = CallByName(oTemp, vProps(lProps), VbLet, OldValue)
        If vResult <> "" Then
            UndoChange = True
        Else
            UndoChange = False
        End If
    End Function
     
    '===================================
    ' Module    : clsExecAndUndo
    ' Company   : JKP Application Development Services (c) 2005
    ' Author    : Jan Karel Pieterse
    ' Created   : 31-8-2005
    ' Purpose   : Class module, stores the objects processed and
    '             handles the exection of the commands
    ' Copyright : This code is free for you to use for applications
    '             for personal use.
    '             It is not allowed to use this for a commercial program,
    '             unless you have my consent.
    '             If you want to include this code in freeware, make sure you add :
     
    '-------------------------------------------------------------------------
    ' This code originates from    : Jan Karel Pieterse
    ' Company                      : JKP Application Development Services (c) 2005
    '                                jkp-ads.com
    '-------------------------------------------------------------------------
    '=====================================
    Option Explicit
     
    Private mcolUndoObjects As Collection
    Private mUndoObject As clsUndoObject
     
    Public Function AddAndProcessObject(oObj As Object, sProperty As String, vValue As Variant) As Boolean
        Set mUndoObject = New clsUndoObject
        With mUndoObject
            Set .ObjectToChange = oObj
            .NewValue = vValue
            .PropertyToChange = sProperty
            mcolUndoObjects.Add mUndoObject
            If .ExecuteCommand = True Then
                AddAndProcessObject = True
            Else
                AddAndProcessObject = False
            End If
        End With
    End Function
     
    Private Sub Class_Initialize()
        Set mcolUndoObjects = New Collection
    End Sub
     
    Private Sub Class_Terminate()
        ResetUndo
    End Sub
     
    Public Sub ResetUndo()
        While mcolUndoObjects.Count > 0
            mcolUndoObjects.Remove (1)
        Wend
        Set mUndoObject = Nothing
    End Sub
     
    Public Sub UndoAll()
        Dim lCount As Long
        '    On Error Resume Next
        For lCount = mcolUndoObjects.Count To 1 Step -1
            Set mUndoObject = mcolUndoObjects(lCount)
            mUndoObject.UndoChange
            Set mUndoObject = Nothing
        Next
        ResetUndo
    End Sub
     
    Public Sub UndoLast()
        Dim lCount As Long
        '    On Error Resume Next
        If mcolUndoObjects.Count >= 1 Then
            Set mUndoObject = mcolUndoObjects(mcolUndoObjects.Count)
            mUndoObject.UndoChange
            mcolUndoObjects.Remove mcolUndoObjects.Count
            Set mUndoObject = Nothing
        Else
            ResetUndo
        End If
    End Sub
     
    Public Function UndoCount() As Long
        UndoCount = mcolUndoObjects.Count
    End Function
     
    ' *****************************************
    ' ** Implementation
    ' *****************************************
     
    Option Explicit
     
    Dim mUndoClass As clsExecAndUndo
     
    Sub MakeAChange()
        Dim i As Integer
        If mUndoClass Is Nothing Then
            Set mUndoClass = New clsExecAndUndo
        Else
            'Previous undoset, must be removed
            Set mUndoClass = Nothing
            Set mUndoClass = New clsExecAndUndo
        End If
        For i = 1 To 10
            mUndoClass.AddAndProcessObject ActiveSheet.Cells(i, 1), _
                    "Interior.Colorindex", 15
        Next
        Application.OnUndo "Restore colours A1:A10", "UndoChange"
    End Sub
     
    Sub UndoChange()
        If mUndoClass Is Nothing Then Exit Sub
        mUndoClass.UndoAll
        Set mUndoClass = Nothing
    End Sub
     
    Sub UndoStepwise()
        If mUndoClass Is Nothing Then Exit Sub
        mUndoClass.UndoLast
        If mUndoClass.UndoCount = 0 Then
            MsgBox "Last action undone"
            Set mUndoClass = Nothing
        End If
    End Sub

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,


    Pour annuler une TRANSACTION en cours, il faut sauvegarder toutes les cellules AVANT MODIFICATION et les restituer en cas d'annulation de la transaction.


    Boisgontier

  12. #12
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour à tous, Une variante au système de #BoisgontierJacques. En ce qui me concerne, je ne travaille pratiquement jamais sur ma base de données directement. J'en fait une extraction sur une autre feuille et je travaille sur cette feuille. Je ne transfère donc les données nouvelles que lorsqu'elles sont dument vérifiées. Le bouton "Undo" referait donc une extraction avec une reprise des données du départ.
    Sinon, si vous ne voulez pas reprendre du début, je pense que la proposition d' #Igloobel est ce que vous avez de mieux. Avec une remontée en arrière pas à pas. Mais sans doute très aléatoire et très compliqué suivant le type d'interventions que vous avez effectué.
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Mon problème n'est pas la macro en soit... mais le fait qu’exécuter un macro fait un "reset" de la "pile naturelle" UNDO d'excel et donc un utilisateur n'a plus la possibilité de revenir en arrière si il s'est trompé...

  14. #14
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour à tous,
    Citation Envoyé par Transitoire Voir le message
    Avec une remontée en arrière pas à pas. Mais sans doute très aléatoire et très compliqué
    Cela conduit pratiquement à essayer de remettre l'eau que l'on a laissé couler dans le tuyau sans baisser la pression du réseau : bon courage.

    Citation Envoyé par Patoche90
    exécuter un macro fait un "reset" de la "pile naturelle" UNDO d'excel et donc un utilisateur n'a plus la possibilité de revenir en arrière si il s'est trompé...
    Si Excel a fait un reset c'est bien qu'il a considéré que le retour en arrière était trop aléatoire.
    Non seulement il te faut annuler l'action de la macro mais en plus donner la possibilité de revenir en arrière comme si après un crash tu laissais la possibilité au pilote de redécoller : va falloir du monde pour remettre tous les rivets en place.

    On ne se baigne jamais deux fois dans le même fleuve : Héraclite

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour

    Il est bien et sage que la "pile des undoes" de Excel soit vidée dès lors qu'est exécutée une instruction VBA.
    Les raisons :
    VBA et Excel sont exécutés dans deux fils distincts.
    Excel ignore ce que fait VBA.
    Si Excel ne remettait pas à vide la pile dont il s'agit lors d'exécution d'instructions VBA, il courrait le risque de situations "fatales".
    Imaginons par exemple (et entre autres) ce qui résulterait (sans effacement de la "pile des undoes") de l'enchaînement suivant :
    1) l'utilisateur modifie le contenu de la cellule A1 de la feuille LaFeuille
    2) une instruction VBA détruit la feuille LaFeuille
    3) l'utilisateur clique sur l'icône Undo de Excel !
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  16. #16
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour le fil,
    Citation Envoyé par unparia Voir le message
    Si Excel ne remettait pas à vide la pile dont il s'agit lors d'exécution d'instructions VBA, il courrait le risque de situations "fatales".
    Imaginons par exemple (et entre autres) ce qui résulterait (sans effacement de la "pile des undoes") de l'enchaînement suivant :
    1) l'utilisateur modifie le contenu de la cellule A1 de la feuille LaFeuille
    2) une instruction VBA détruit la feuille LaFeuille
    3) l'utilisateur clique sur l'icône Undo de Excel !
    Dans cet exemple, lorsque ces opérations sont exécutées manuellement, Excel [Édit cf message d'Unparia] vide la pile des Undos supprime les actions concernant cette feuille dans la pile des Undos, il n'y a pas de raison pour que cela ne se produise pas lors de l'exécution de la macro.

    Je ne sais pas quels sont les critères exacts qui provoquent le vidage de la pile, mais ce n'est pas le fait d'exécuter une macro qui vide la pile.
    Par exemple avec la simple macro suivante, la pile n'est pas vidée et les undos continuent à fonctionner après son exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
     Worksheets.Add before:=Worksheets("Feuil1")
    End Sub
    Mais, même si ce n'est pas l'exécution du VBA qui vide la pile, ça conforte le fait qu'Excel fait bien son boulot et donc que :
    Si Excel ne remettait pas à vide la pile [...], il courrait le risque de situations "fatales".
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  17. #17
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour Patrice
    Dans cet exemple, lorsque ces opérations sont exécutées manuellement, Excel vide la pile des Undos
    N'est pas exact. Excel ne vide pas la pile, mais ne fait qu'en supprimer ****** les actions qui concernaient cette feuille. Les autres actions de la pile restent dans la pile.
    Je n'avais donné qu'un exemple, celui d'une suppression de feuille, pour bien "imager" le type de risque. D'autres sont bien plus complexes et générateurs de situations conflictuelles
    Amitiés

    EDIT : ****** je ne saurais à ce propos affirmer qu'il les "supprime" réellement de la pile; car il pourrait tout aussi bien les avoir gardées mais ignorées.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  18. #18
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Je viens de faire le test suivant (à l'intention de l'auteur du -1) pour illustrer totalement ma réponse antérieure :
    1) Tout en manuel
    - sur Feuil1 : "a" en A1, "b" en A2
    - sur feuil2 : "c" en A1
    - destruction de Feuil2
    - la pile des undoes n'est pas vide et un premier undo efface le "b" en A2 et un second undo efface le "a"en A1
    2)
    a) en manuel :
    - sur Feuil1 : "a" en A1, "b" en A2
    - sur feuil2 : "c" en A1
    b) par instruction VBA : destruction de la feuille Feuil2
    - la pile des undoes est dans ce cas totalement vide, contrairement au cas 1)

    EDIT : Ah ... Je vois que Patrice a d'ailleurs édité et corrigé comme il se devait son message antérieur.

    A noter qu'une simple instruction VBA Msgbox "..." viderait également complètement la pile des Undoes
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  19. #19
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut Bizarre bizarre !
    Citation Envoyé par unparia Voir le message
    2)
    a) en manuel :
    - sur Feuil1 : "a" en A1, "b" en A2
    - sur feuil2 : "c" en A1
    b) par instruction VBA : destruction de la feuille Feuil2
    - la pile des undoes est dans ce cas totalement vide, contrairement au cas 1)
    Je viens de faire ce test avec Excel 2003, 2007, 2013 et 2016 (3 PC différents) : chez moi la pile n'est pas totalement vidée : il se passe exactement la même chose que dans le cas 1), seul le Undo concernant la saisie de c sur la feuil2 disparaît, il reste un 1er undo qui efface le b sur la feuille 1 et un second qui efface le a

    Le code utilisé pour supprimer la Feuil2 :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
      Application.DisplayAlerts = False
      Worksheets("Feuil2").Delete
      Application.DisplayAlerts = True
    End Sub
    Lancé directement depuis le VBE (F5)

    EDIT : et bien sûr, chez moi, un simple MsgBox n'efface rien dans la pile des Undoes.
    J'ai toujours constaté ce fonctionnement (depuis xl 2003), c'est pour cela que j'ai réagi à ce post.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  20. #20
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    je ne sais alors que te dire, car ma version est 2007 et que les réactions sont très exactement celles que j'ai exposées

    Edit : voilà (entre autres messages sur la toile) qui montre que ce constat est fait par d'autres :
    https://social.msdn.microsoft.com/Fo...forum=exceldev

    edit 2 :
    ceci explique probablement cela ....
    Lancé directement depuis le VBE (F5)
    refais-le, mais de manière impliquant vba plus sûrement :
    un bouton de commande -->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
     MsgBox "eee"
    End Sub
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme d'enregistrement sur Macro/VBA de Excel
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/11/2005, 18h23
  2. Connaître la taille d'un module avec une macro VBA ou autre
    Par beegees dans le forum Général VBA
    Réponses: 15
    Dernier message: 22/11/2005, 10h47
  3. probleme de selection aleatoire sur excel avec macro vba
    Par guillaume sors dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/10/2005, 11h51
  4. Macro VBA sur Access
    Par beurnoir dans le forum Access
    Réponses: 3
    Dernier message: 12/10/2005, 17h46
  5. [SQL][MACRO VBA]Pb de syntaxe
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/08/2004, 10h11

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