› Excel e gli applicativi Microsoft Office › Undo in macro
-
AutoreArticoli
-
Ciao,
ho inserito questo codice
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Worksheets("Foglio1").Range("A2:I100").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal End Sub
in una cartella excel per poter ordinare un intervallo di celle automaticamente. Il codice funziona correttamente ma il tasto di undo (ctrl + Z) risulta però disabilitato. Esiste un modo per poter utilizzare il codice senza compromettere la funzione di undo?
Grazie in anticipo
Eppure ho in testa una piccola idea (anche se dalle prove non ho ottenuto grandi risultati).
Un contatore tiene il passo delle operazioni che si fanno sul foglio (ad ogni SheetChange aumenta il contatore). Una variabile (privata a livello di modulo) tiene traccia dell'intero range appena fatta la modifica. Quando si preme un pulsante di Annulla creato allo scopo, la routine associata ripesca dalla variabile private descritta i valori del range interessato dalla penultima operazione, ripristinando di fatto il foglio com'era prima dell'ultima modifica.
In teoria funziona, in pratica non ho fatto molti test 🙂
Ciao,
io avevo pensato ad una cosa molto semplice: memorizzare automaticamente in un name (da creare preventivamente, chiamiamolo "shoot") i valori dello specifico range, da ripristinare in modo manuale, quando si vuole, lanciando una sub ad hoc.
Il codice che segue credo chiarisca il tutto:
'nel modulo di classe ThisWorkbook Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = "Foglio1" Then With Sh.Range("A2:I100") If Not Intersect(Target, .Cells) Is Nothing Then ThisWorkbook.Names("shoot").RefersTo = .Value .Sort Key1:=.Range("A2"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal MsgBox "eseguito back-up dati come erano prima dell'ordinamento!" & vbCr & vbCr & "per ripristinare eseguire la sub 'shoot'", vbInformation, "avviso" end if End With End If End Sub 'in un modulo standard Public Sub sUndo() With ThisWorkbook.Worksheets("Foglio1").Range("A2:I100") If MsgBox("ripristino i dati come erano prima dell'ordinamento" & vbCr & "e di tutte le successive variazioni?", vbYesNo, "Conferma") = vbYes Then Application.EnableEvents = False .Value = [shoot] Application.EnableEvents = True End If End With End Sub
Oh bè già già, immagino che io volessi fare il passo più lungo della gamba e pensare a un sistema di undo multiplo, tipo un "Annulla le ultime dieci azioni" 😀
Con la mia proposta si può dimensionare opportunamente la variabile a una matrice di dieci spazi e ripristinare lo scenario fino alla decima modifica 🙂
-
AutoreArticoli