Condividi:        

application undo

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

application undo

Postdi miko » 06/07/17 10:30

buongiorno,
mi è capitato di trovare questo codice funzionante,

Codice: Seleziona tutto
Sub UndoLastAction()

    With Application
        .EnableEvents = False
        .Undo
        .EnableEvents = True
    End With

End Sub


che permette di ripristinare l'ultima modifica effettuata in un foglio a condizione che la modifica non avvenga tramite macro ma agendo con i comandi utente del foglio.
è possibile modificare la macro in modo che il ripristino avvenga anche quando le modifiche si verifichino mediante il vba?
avevo trovato una pagina web, purtroppo non l'ho memorizzata e non riesco più a ritrovarla, ma appena la trovo vi posto il link.
ricordo che era un papiro di codice che richiamava delle dichiarazioni, funzioni ed uso di librerie del tipo user32 o qualcosa di simile, ma che per me di difficile interpretazione.
grazie,saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: application undo

Postdi alfrimpa » 06/07/17 14:52

Ciao miko

Per quanto ne sappia non è possibile ripristinare un'azione dopo l'esecuzione di una macro tant'è che quando si esegue del codice il pulsante Annulla (quello con la freccia che punta a sinistra) è disabilitato.

Non mi risulta vi siano altre strade ma aspettiamo il parere del "Luminare" :) Anthony
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: application undo

Postdi Marius44 » 06/07/17 20:53

Ciao
Non so se può fare al caso tuo ma si potrebbe "cercare di fregare" Excel con una cella d'appoggio.
Per esempio:
Cella A1 di Foglio1 contiene la scritta "Mario" (questa è la scritta che non vogliamo sia cancellata)
In altra cella "nascosta" scriviamo la stessa cosa per esempio in D1 = "Mario"
Quindi utilizzo una Sub per apportare una variazione tramite codice nella cella A1 e l'evento WorkSheet_Change del Foglio interessato.
Questo il codice:
Codice: Seleziona tutto
Sub Prova_Cambio()
    Sheets(1).Cells(1, 1) = "Peppa"
End Sub

Col suddetto codice scrivo un altro nome nella cella A1
Quindi il codice nel Foglio interessato:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Value <> Sheets(1).Cells(1, 4).Value Then
        MsgBox "Azione non consentita", 0, "Errore"
        Application.EnableEvents = False
        Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 4).Value
        Application.EnableEvents = True
    End If
End Sub

Ho inserito il messaggio in modo tale che si noti che nella cella A1 effettivamente ci sta scritto il nuovo nome ma, dato l'OK al messaggio, viene ripristinato il vecchio nome.

Ribadisco: ha ragione Alfredo (che saluto caramente) quando afferma che l'azione di una macro non può essere annullata.
Il mio è solo un artificio che, comunque, ripristina lo stato precedente. Non è testato cosa farebbe con una formula ma, credo, che se nella nella nascosta si scrive la formula questa viene riscritta.
Non è il massimo ma qualcosa la fa!

Fai sapere. Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: application undo

Postdi Anthony47 » 07/07/17 02:29

Per quanto ne so anche io, le modifiche eseguite all'interno di una macro cancellano lo stack delle modifiche quindi il comando Undo e' impossibile da usarsi.
Se pensi che dopo una macro possa essere necessario un "undo" allora ti suggerisco di creare una copia del foglio; poi, se necessario, ne copi il contenuto e lo incolli sul foglio di origine (limitatamente alle aree che ti interessa ripristinare) distruggendo il foglio copia.
Questo in aggiunta al suggerimento di Marius (vedi sopra).

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: application undo

Postdi miko » 10/07/17 18:19

buonasera,
grazie per i vostri contributi e suggerimenti.
ricercando la pagina web che vi scrivevo all'inizio, vi confermo, e non avevo dubbi sulle vostre osservazioni, che avete ragione, non esiste un procedimento diretto per annullare una operazione eseguita tramite macro, ma solo artifici, come avete sottolineato.
uno di questi si trova qui:

http://spreadsheetpage.com/index.php/tip/undoing_a_vba_subroutine/

che usa gli array per memorizzare uno stato del foglio, e ripristinarlo in una fase successiva;
ho testato il codice originale e funziona.
invece la pagina che contiene il codice-papiro che ricercavo si trova qui:

http://www.jkp-ads.com/Articles/UndoWithVBA00.asp

ho scaricato l'esempio che propone e testato, ed anche questo funziona.
date le mie conoscenze molto limitate del vba non posso apprezzare la raffinatezza del codice, ne posso esprimere giudizi;
il primo è per me più comprensibile, come le vostre soluzioni, il secondo lo vedo più complicato per raggiungere lo stesso risultato.
forse qualcuno potrà fornire chiarimenti al codice.
ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: application undo

Postdi miko » 11/07/17 10:49

buongiorno,
la prima sub che vi ho indicato, http://spreadsheetpage.com......, per intenderci quella che usa gli array
permette di ripristinare i valori contenuti nelle celle;
ho provato a modificare il codice per ripristinare il colore delle celle ma ricevo errore;
come si procede in questo caso?
la macro poi esegue un ciclo, è possibile sostituire il ciclo con un codice del tipo:
Array(Range(A1),Range(B1),Range(D1),Range(F1)) ...etc
in modo da considerare celle contigue e non?
grazie, ciao
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: application undo

Postdi Anthony47 » 12/07/17 02:16

Il primo codice dimostra come una macro puo' memorizzare nell'array OldSelection le modifiche apportate a un intervallo di celle in modo che successivamente il contenuto dello stesso array possa essere utilizzato per ripristinare i valori ante modifica. Cioe' la macro che modifica deve memorizzare in un array sequenziale le caratteristiche ante-modifica.
Quali caratteristiche memorizzare sono definite dal tipo di dati SaveRange; quindi se vuoi salvare anche il colore di una cella potresti modificare il type:
Codice: Seleziona tutto
    Type SaveRange
        Val As Variant
        Color As Long        'Per memorizzare il "Color"
        Addr As String
    End Type

Poi ovviamente devi salvare questo nuovo valore prima che venga modificato:
Codice: Seleziona tutto
        OldSelection(I).Addr = CeLL.Address
        OldSelection(I).Val = CeLL.Formula
        OldSelection(I).Color = CeLL.Interior.Color          'Aggiunta

Analogamente quando procedi al ripristino:
Codice: Seleziona tutto
        Range(OldSelection(I).Addr).Formula = OldSelection(I).Val
        Range(OldSelection(I).Addr).Interior.Color = OldSelection(I).Color     'Aggiunta


L'uso dell'array OldSelection per salvare un indirizzo multicella non e' vietato; devi usare la sintassi corretta, es
Codice: Seleziona tutto
        OldSelection(I).Addr = Range("A2, D4").Address
        OldSelection(I).Val = Range("A2, D4").Formula
Tieni presente il comportamento delle istruzioni nel caso che il contenuto delle celle indirizzate separatamente non sia uniforme (guarda l'help on line dell'istruzione).

Il prerequisito di questo metodo e' che la macro che crea le modifiche alimenti il contenuto dell'array dei valori precedenti.
L'esempio pubblicato presuppone che le modifiche siano applicate a un unico intervallo i cui parametri sono salvati all'inizio; nulla vieta che invece l'array dei valori precedenti sia alimentato man mano che le modifiche vengono applicate, ridisegnando la macro modificante perche' possa essere compatibile col meccanismo di salvataggio.

Il secondo codice e' troppo complicato per le mie conoscenze.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: application undo

Postdi alfrimpa » 13/07/17 14:09

Anthony47 ha scritto:
Il secondo codice e' troppo complicato per le mie conoscenze.



Sentire Anthony che dice questo è un evento epocale :D
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli


Torna a Applicazioni Office Windows


Topic correlati a "application undo":


Chi c’è in linea

Visitano il forum: Nessuno e 58 ospiti