Condividi:        

Creare una Funzione Undo Redo

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

Creare una Funzione Undo Redo

Postdi A.Maurizio » 06/11/16 13:18

Ciao a Tutti Finalmente posso di nuovo dialogare con voi .
Vi scrivo in quanto vorrei risolvere questo problema che all'apparenza mi sembrava facile va vedo che con il VBA non e cosi.
Dunque il problema e questo : Su di un Foglio di Excel io ho inserito Due Pulsanti e li ho chiamati "Cmd_Redo " e "Cmd_Undo"
Ahora ciò che vorrei fare io sarebbe quello che tutte le colte che scrivo un Qualche cosa (Numeri o Lettere) in una determinata cella del mio foglio di lavoro .
E premo uno dei due tasti essi si comportino esattamente come se si premessero gli stessi tasti di una qualsiasi applicazione di scrittura come ad esempio WordPad - Word - lo stesso Excel ecc...!
Io non vi nego che avevo provato con :
Codice: Seleziona tutto
Sub Redo ()
    With Application
        .EnableEvents = False
        .Undo
        .EnableEvents = True
    End With
 


Oppure :
Codice: Seleziona tutto
Application. Undo


Ma niente da fare continua sempre a darmi errore alla voce (UnDo / Redo)
riuscireste voi a darmi una mano in tal senso Grazie sin da ora di tutto cuore Saluti da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Sponsor
 

Re: Creare una Funzione Undo Redo

Postdi alfrimpa » 06/11/16 13:34

Ciao A.Maurizio

Tieni presente che, come dice la stessa Microsoft:

"Clearing the undo stack is an unfortunate side effect of running VBA code"

Non è possibile fare un Undo/Redo dopo l'esecuzione di una macro.
Alfredo

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

Re: Creare una Funzione Undo Redo

Postdi A.Maurizio » 08/11/16 12:12

Ciao Afrimpa come stai !
Ascolta secondo te : come e possibile creare allora queste due funzioni in alternativa alla macro.
Intendo dire : Se io Posizioni due Tasti su di un Foglio di Excel , E poi Scrivo un qualche cosa all'interno di una cella del Tipo ad Esempio :" Pippo " e poi premo il Tasto (Unredo) che sé non sbaglio significa torna in dietro .
Poi sempre sulla stessa cella scrivo il nome "Anthony" che tra l'altro prendo questo spunto per salutare.
E poi premo l'altro tasto con la funzione Redo.
Non pensi che si possa creare una routine che crei questo effetto.
D'altronde dico questo in quanto usando il VB 6.0 di queste cose gli anni che furono , ne ho fatte di tutti i colori , e solo usando il VBA che mi è Impossibile procedere, in quanto io non ne conosco il codice , tutto qui.
Detto questo sé tu per ipotesi volessi creare un qualche cosa del genere per tua iniziativa come riusciresti a risolvere questo problema.
Grazie sin da ora per tutto l'aiuto che vorrai offrirmi in merito , Sinceri saluti a tutti voi da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Re: Creare una Funzione Undo Redo

Postdi alfrimpa » 08/11/16 14:06

Ciao A.Maurizio

Secondo me la cosa è molto difficile (se non impossibile) da fare.

Questo perché dovresti tenere traccia di tutte le operazioni che fai per poi successivamente annullarle con l'operazione contraria di ciascuna.

Finchè si tratta di una semplice scrittura l'operazione contraria è la cancellazione passi; ma già se vuoi ripristinato un valore cancellato per errore la vedo assai complicata.

In definitiva non saprei proprio come aiutarti.
Alfredo

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

Re: Creare una Funzione Undo Redo

Postdi patel » 08/11/16 16:04

nel modulo standard
Codice: Seleziona tutto
Public oldval, oldaddr, valredo
Sub xUndo()
valredo = Range(oldaddr).Value
Range(oldaddr) = oldval
End Sub
Sub xRedo()
Range(oldaddr) = valredo
End Sub

in quello del foglio
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
  newval = Target.Value
  Application.EnableEvents = False
  Application.Undo 'the previous value is re-established.
  oldval = Target.Value
  oldaddr = Target.Address
  Target.Value = newval
  Application.EnableEvents = True
End Sub
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: Creare una Funzione Undo Redo

Postdi Marius44 » 08/11/16 19:56

Ciao Maurizio
Ciao Alfredo
Ciao Andrea

@patel
Ottimo lavoro!
Occorre aggiungere che il codice è valido per quanto avvenuto fino al clic su Enter. Cioè viene annullata o ripristinata l'ultima operazione eseguita.

Ciao a tutti,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Creare una Funzione Undo Redo

Postdi patel » 09/11/16 08:34

grazie Marius, se hai idee per migliorarlo son bene accette
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: Creare una Funzione Undo Redo

Postdi A.Maurizio » 09/11/16 17:38

Ciao Marius44 ascolta ho eseguito in tutto e per tutto i tuoi suggerimenti , Però a me continua a darmi errore alla voce :
newval = Target.Value

Tanto e Vero che mi ripete che tale Formula e : "Sub ho Function non Definita"
Forse e perché tu usi un Sistema operativo a 64 bit anziché a 32 Bit come il mio ?
Ho Provato anche ad Inserire la Prima Voce in : "Public oldval, newval, oldaddr, valredo"
Ma anche cosi continua a darmi errore.
Come Posso Risolvere tutto ciò Grazie comunque per il tuo supporto tecnico.
Sinceri Saluti da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Re: Creare una Funzione Undo Redo

Postdi Marius44 » 09/11/16 18:40

Ciao Maurizio
Guarda che la macro te l'ha suggerita patel. Aggiungo che a me funziona perfettamente.

Posso immaginare che probabilmente tu hai messo all'inizio Option Explicit e ti sei dimenticato di dichiarare le variabili con Dim ... Immagino ancora che patel rivolgendosi ad un esperto come te ha omesso di farlo e di dirtelo.
Prova a dichiarare tutte le variabili oppure (ma non te lo consiglio) togli Option Explicit.

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

Re: Creare una Funzione Undo Redo

Postdi Anthony47 » 09/11/16 23:21

In aggiunta ai suggerimenti di Marius, vedi sopra...

Controlla che la Sub Worksheet_Change l'abbia inserita nel modulo vba del foglio di lavoro: tasto dx sul tab col nome foglio, scegli Visualizza codice; la Sub Worksheet_Change va inserita nel modulo vba che ti compare.

Pero' a me pare che tu stia cercando di sostituire con dei pulsanti i comandi Contr-c e Contr-v, oppure le icone Annulla e Ripeti che sono presenti sulla Barra di accesso rapido; ha senso?

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

Re: Creare una Funzione Undo Redo

Postdi A.Maurizio » 10/11/16 11:49

Ciao e Grazie di tutto cuore per i vostri suggerimenti a tutti voi .
Però e giusto che vi spieghi come ho cercato di seguire i vostri suggerimenti .
Per qui partirò con il dire che : Non ho fatto altro che Copiare ed Incollare questo vostro Suggerimento e inserirlo in modulo 1

Public oldval, oldaddr, valredo
Sub xUndo()
valredo = Range(oldaddr).Value
Range(oldaddr) = oldval
End Sub
Sub xRedo()
Range(oldaddr) = valredo
End Sub

Poi allo stesso modo ho inserito quest'altro nella Procedura di evento del Foglio 1

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
  newval = Target.Value
  Application.EnableEvents = False
  Application.Undo 'the previous value is re-established.
  oldval = Target.Value
  oldaddr = Target.Address
  Target.Value = newval
  Application.EnableEvents = True
End Sub

Anche perché non avrei potuto fare diversamente , trattandosi di un Evento "Change e Target"
Dopo di che ho scritto il nome (Pippo) nella cella "A1" del Foglio1 ; E Successivamente ho fatto click nella Cella "C3"
E a questo punto che mi compare il messaggio di Errore come dicevo anche nel messaggio di Ieri che dice ("Errore di Compilazione - Sub o Function non definita") Il tutto rivolgendosi a questo codice (" newval = Target.Value")
Di più non saprei cosa dirvi , e ne tanto meno come risolvere questo problema.

Però Ieri ho fatto una scoperta che forse potrebbe esservi di Aiuto e è questa :
Se io Scrivo il Nime (Pippo) nella Cella "A1" e Poi Premo la Sequenza di Tasti (Ctrl+Z)
Poi Sempre nella Cella "A1" Scrivo il nome (Giacomo) e premo Nuovamente la Sequenza di tasti (Ctrl+Y)
Posso passare dal Nome "Pippo a Giacomo" alternativamente tutte le volte che voglio.
Per qui detto questo , Non ci sarebbe il modo di Modificare questa mia prova :

Sub Undo()
Application.ScreenUpdating = False
ActiveCell.Select
Application.SendKeys "^Z", True
ActiveCell.Select
End Sub

Che non mi da errore ma non funziona , ma e anche vero che non capisco il perché; Cosi facendo potrei sfruttare due tasti posizionati sul foglio per svolgere tutto ciò no ?
Confido in voi Geni e maestri della Programmazione quella vera.
Saluti Sinceri da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Re: Creare una Funzione Undo Redo

Postdi Anthony47 » 10/11/16 15:17

Anthony ha scritto: Pero' a me pare che tu stia cercando di sostituire con dei pulsanti i comandi Contr-c e Contr-v
Oops... volevo dire Contr-z e Contr-y

Se hai usato esattamente quel nome variabile (newval) allora non capisco perche' sull'istruzione newval = Target.Value ottieni quell'errore.
Comunque prova a dichiarare la variabile newval aggiungendo questa istruzione:
Codice: Seleziona tutto
Public oldval, oldaddr, valredo, newval
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newVal                       '<<< AGGIUNGI
On Error Resume Next
'altre istruzioni


Per l'altra via, tieni presente che Contr-z e Contr-y sono delle abbreviazioni; per avere lo stesso effetto tramite Sendkey devi usare le sequenza complete di comando, che sono (per Excel in Italiano):
Codice: Seleziona tutto
Application.SendKeys "%ma", True       'Annulla
Application.SendKeys "%mr", True        'Ripeti


Quindi:
Codice: Seleziona tutto
Sub Undo2()
Application.SendKeys "%ma", True  'ANNULLA
End Sub

Sub Redo2()
Application.SendKeys "%mr", True  'RIPETI
End Sub

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

Re: Creare una Funzione Undo Redo

Postdi A.Maurizio » 10/11/16 19:31

Grazie a tutti ; Ma Soprattutto un Doppio Grazie anche ad Anthony .
Non solo perché con il tuo suggerimento sulla Dim "newVal" ho funziona benissimo; Ma soprattutto perché non ti avevo ringraziato a dovere per l'altro tuo Intervento che avevi fatto Sull'apertura della Tavolozza dei Colori ; Anche in quel modo e stato un ottimo Suggerimento.
Detto questo : Ma in questo caso non siete obbligati a rispondermi se non lo ritenete giusto , Visto che ho optato per lavorare con il vostro Primo suggerimento e Cioè :

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
  newval = Target.Value
  Application.EnableEvents = False
  Application.Undo 'the previous value is re-established.
  oldval = Target.Value
  oldaddr = Target.Address
  Target.Value = newval
  Application.EnableEvents = True
End Sub

ecc...!
Non ci Sarebbe la Possibilità per entrambi i Tasti posizionati sul Foglio di lavoro , Per riciamare più Volte la stessa funzione.
Mi spiego meglio :
Ora Appurato che tutto funziona a Meraviglia :
Sé io scrivo in una qualsiasi Cella del Foglio 1 il Nome (Maurizio) e poi Il Nome (Enrico) e premo i due tasti "Undo / Redo" esso compiono il loro lavoro , Passando da "Maurizio" ed "Enrico" ma solo una volta.
Per qui la mia domanda e questa : Non ci sarebbe la possibilità che se io scrivessi sempre nella stessa cella (Ugo - Mario - Giacomo - Maurizio) ecc...!
Nel vostro caso Viene preso in Considerazione solo l'ultimo evento scritto , mentre ciò che io Vorrei e che sé premo il tasto (undo) esso potrebbe farmi visualizzare anche tutti gli altri Nominativi Scritti in precedenza e no solo (Maurizio e Giaco) ma anche (Mario e Ugo)
Grazie sin da ora per la vostra pazzienza sinceri saluti da Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39

Re: Creare una Funzione Undo Redo

Postdi Anthony47 » 11/11/16 01:20

Mi prendo la mia piccola parte e dico Prego, il resto mi pare vada a patel che quella soluzione l'ha proposta.
Quell'errore lo vedo ogni tanto comparire quando il nome variabile si confonde con un indirizzo di cella o di colonne (es aaa) o una parola chiave, ma newval non avrebbe dovuto confondersi con nulla...

La soluzione che hai adottato si crea un suo limitato stack di modifiche, quindi piu' di tanto non puo' fare.
Pero' le Undo2 e Redo2 usano lo stack delle modifiche di Excel, quindi gestiscono tutti i cambiamenti ivi memorizzati; forse dovresti fare una prova con quelle macro (non richiedono la WorksheetChange, ma per le prove puoi lasciarla).

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

Re: Creare una Funzione Undo Redo

Postdi patel » 11/11/16 10:43

Infatti la soluzione di Anthony col sendkey è più semplice e sicura ed è proprio quella invocata da Maurizio.
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: Creare una Funzione Undo Redo

Postdi A.Maurizio » 11/11/16 12:21

Grazie infinite per tutto l'aiuto che mi avete offerto , Siete Tutti fantastici Sinceri Saluti da A.Maurizio
A.Maurizio
Utente Senior
 
Post: 116
Iscritto il: 02/08/13 15:39


Torna a Applicazioni Office Windows


Topic correlati a "Creare una Funzione Undo Redo":


Chi c’è in linea

Visitano il forum: Nessuno e 65 ospiti