XL 2010 VBA bloque les 2 "flèches" Annuler et Rétablir

lvsagi

XLDnaute Nouveau
Bonjour (et Bonne année !)
Je débute en VBA. En réalisant une macro (cases à cocher pour simplifier une saisie), je me suis aperçu qu'elle désactive de la feuille Excel les 2 fonctions "Annuler" et "Rétablir". J'ai compris que l'exécution du code VBA n'est pas annulable, d'où cette conséquence. Mais existe-t'il un moyen dans ce cas de limiter l'application du code à une seule partie de la feuille (une colonne par exemple), de façon à maintenir les 2 fonctions "magiques" sur le reste de la feuille ?

Merci pour votre aide.

Laurent
 

cp4

XLDnaute Barbatruc
Bonjour @lvsagi , Le forum,

Annuler et rétablir réagissent à une action depuis excel pas de VBA. Cependant, tu pouvais fermer le fichier sans enregistrer les modifications. Mais ce ne sont que les dernières modifications avant enregistrement automatique qui sont prises en compte.
Sans fichier difficile de te répondre.

Bonne journée.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
L'annulabilité des opérations précédentes est perdue de toute façon, mais il est possible, à la fin d'une procédure d'instruire Excel d'une autre, spécialement étudiée pour inverser ses effets. https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.onundo
Mais il faut se charger de noter soit même toute information permettant de le faire, dans une Collection VBA par exemple..
Mais c'est peu utilisé car souvent compliqué, ce pourquoi Excel ne s'en charge pas.
 
Dernière édition:

lvsagi

XLDnaute Nouveau
Merci pour vos réponses ultra-rapides !
Le mieux est peut-être que je partage le fichier... La macro permet de saisir en colonne F un ou plusieurs actes juridiques par des cases à cocher. Mon objectif est de ne pas se priver des 2 fonctions annuler et rétablir, donc je pensais qu'il existait peut-être une façon d'indiquer que le champ d'exécution de la macro était seulement la colonne F.
En tant que néophyte VBA mais utilisateur Excel de longue date, il me parait impossible de se passer de ces 2 fonctions.

Merci encore pour votre aide

Laurent
 

Pièces jointes

  • Actes v2.1.xlsm
    214.7 KB · Affichages: 7

Dranreb

XLDnaute Barbatruc
Un exemple, dans un module standard :
VB:
Option Explicit
Private ClnUndo As New Collection
Public Property Let ChgSvg(ByVal Rng As Range, ByVal Value)
   ClnUndo.Add Item:=Array(Rng, Rng.Value)
   Rng.Value = Value
   Application.OnUndo Text:="Rétab " & Rng.Address(False, False), Procedure:="'" & ThisWorkbook.Name & "'!Rétablir"
   End Property
Public Sub Rétablir()
   Dim TRngVal(), Pos As Integer
   Pos = ClnUndo.Count: TRngVal = ClnUndo(Pos): ClnUndo.Remove Pos
   TRngVal(0).Value = TRngVal(1)
   If Pos = 1 Then Exit Sub
   Pos = Pos - 1: TRngVal = ClnUndo(Pos - 1)
   Application.OnUndo "Rétab " & TRngVal(0).Address(False, False), "Rétablir"
   End Sub
Sub Test()
   ChgSvg(ActiveCell) = "Toto"
   End Sub
 

Dranreb

XLDnaute Barbatruc
Il n'existe aucun moyen de restaurer toute la liste des actions annulables, toute commande Excel depuis VBA la détruit irrémédiablement. Mais on peut garder trace de toutes les modifications pour les y resservir une par une.
Dans Feuil2 :
VB:
Option Explicit
Private ChangéParListBox As Boolean
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If ChangéParListBox Then EnregistreUndo
   NoterCible Target
   If Target.Column = 6 And Not IsEmpty(Cells(Target.Row, 1).Value) Then
      With Me.ListBox1
         .Top = Target.Top
         .Left = Target(1, 2).Left
         .List = Worksheets("Tables").Range("ListeDM1").Value
         .Height = 13.5 * .ListCount
         .Visible = True
         End With
      ChangéParListBox = False
   Else
      Me.ListBox1.Visible = False
      End If
   RemettreOnUndo
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   EnregistreUndo
   ChangéParListBox = False
   RemettreOnUndo
   End Sub
Private Sub ListBox1_Change()
   Dim sTemp As String, LLBx As Integer
   For LLBx = 0 To Me.ListBox1.ListCount - 1
      If Me.ListBox1.Selected(LLBx) Then
         If sTemp <> "" Then
            sTemp = sTemp & " - " & Me.ListBox1.List(LLBx)
         Else
            sTemp = Me.ListBox1.List(LLBx)
            End If
         End If
      Next LLBx
   Application.EnableEvents = False
   ActiveCell.Value = sTemp
   Application.EnableEvents = True
   ChangéParListBox = True
   RemettreOnUndo
   End Sub
Dans un module standard :
VB:
Option Explicit
Private ClnUndo As New Collection, RngCible As Range, AncValCible
Public Sub NoterCible(ByVal Target As Range)
   Set RngCible = Target: AncValCible = Target.Value
   End Sub
Public Sub EnregistreUndo()
   If RngCible Is Nothing Then Exit Sub
   ClnUndo.Add Item:=Array(RngCible, AncValCible)
   Set RngCible = Nothing: AncValCible = Null
   End Sub
Public Sub Rétablir()
   Dim Pos As Integer, TRngVal()
   Pos = ClnUndo.Count: If Pos = 0 Then Exit Sub
   TRngVal = ClnUndo(Pos): ClnUndo.Remove Pos
   Application.EnableEvents = False
   TRngVal(0).Value = TRngVal(1)
   Application.EnableEvents = True
   Application.OnTime Now, "RemettreOnUndo"
   End Sub
Public Sub RemettreOnUndo()
   Dim Pos As Integer, TRngVal()
   Pos = ClnUndo.Count: If Pos = 0 Then Exit Sub
   TRngVal = ClnUndo(Pos)
   Application.OnUndo "Rétab " & TRngVal(0).Address(False, False), "Rétablir"
   End Sub
 
Dernière édition:

lvsagi

XLDnaute Nouveau
Merci beaucoup Dranreb
Je vais tester ça mais je crains que ça soit difficile à admettre pour les utilisateurs que je cible. Une bête manipulation hasardeuse (effacement, saisie erronée,...) n'est plus annulable, ça rend le travail sur la feuille très périlleux.

Encore merci pour votre assistance à un néophyte !
Laurent
 

patricktoulon

XLDnaute Barbatruc
bonsoir
il m'est venu une idée complètement folle
si ça se limite qu'a une cellule a la fois
on peu filouter excel et au lieu de mettre une valeur dans une cellule par VBA
du style
[A1]="toto"
on fait croire a ce couillon d'excel que c'est toi qui tape "toto" dans la cellule
Sub test()
[A1].Select
CreateObject("Wscript.shell").SendKeys ("toto")
End Sub


regarde ta flèche undo après ça
 

lvsagi

XLDnaute Nouveau
Le filoutage est top ! Les flèches Annuler et Rétablir fonctionnent toujours même après exécution du code !
Maintenant je vais essayer de modifier mon VBA pour saisir non pas un texte fixe, mais le résultat des cases à cocher.
Compte tenu de mon niveau ça risque de m'emmener au siècle prochain. Je m'y attelle, mais je prends volontiers toute suggestion...

Laurent
 

Statistiques des forums

Discussions
311 720
Messages
2 081 909
Membres
101 836
dernier inscrit
karmon