Login Registrati
Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #6705 Risposta
    thunder
    thunder
    Partecipante

      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 

      #6707 Risposta
      alfrimpa
      alfrimpa
      Partecipante
        2 pts

        Le azioni compiute dalle macro non sono annullabili.

        Alfredo

        thunder
        #6708 Risposta

        vecchio frac
        Moderatore
          15 pts

          Potresti salvare prima dell'operazione di riordinamento e, se ti accorgi che qualcosa non è andato per il verso giusto, chiudere senza salvare e riaprire subito il file.

          fn = ThisWorkbook.path & "\" & ThisWorkbook.Name
          ThisWorkbook.Close False
          Workbooks.Open fn
          thunder
          #6713 Risposta
          thunder
          thunder
          Partecipante

            Grazie per lo spunto!

            #6732 Risposta

            vecchio frac
            Moderatore
              15 pts

              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 🙂

              #6736 Risposta
              scossa
              scossa
              Partecipante
                1 pt

                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
                

                 

                #6739 Risposta

                vecchio frac
                Moderatore
                  15 pts

                  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 🙂

                Login Registrati
                Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
                Rispondi a: Undo in macro
                Gli allegati sono permessi solo ad utenti REGISTRATI
                Le tue informazioni:



                albatros54
                albatros54 - 442 risposte

                vecchio frac - 351 risposte

                patel
                patel - 257 risposte

                Marius44
                Marius44 - 256 risposte

                Luca73
                Luca73 - 180 risposte