Login Registrati
Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #6705 Score: 0 | Risposta

    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 Score: 1 | Risposta

      alfrimpa
      Partecipante
        25 pts

        Le azioni compiute dalle macro non sono annullabili.

        Alfredo

        #6708 Score: 1 | Risposta

        vecchio frac
        Senior Moderator
          245 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
          #6713 Score: 0 | Risposta

          thunder
          Partecipante

            Grazie per lo spunto!

            #6732 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              245 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 Score: 0 | Risposta

              scossa
              Partecipante
                25 pts

                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 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  245 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: