Condividi tramite

Excel: valore della cella prima della modifica

Anonimo
2019-05-09T09:29:50+00:00

Buona giornata,

mi sembra che dovrebbe essere possibile (con VBA) conoscere il contenuto di una cella Excel prima di una modifica della stessa (o di una cancellazione del dato stesso).

Ad esempio, la cella A1 contiene "a", cambio il valore inserendo "b", ma vorrei mandare una segnalazione del tipo "Sicuro di cambiare 'a' con 'b'?" … e, naturalmente, se al MsgBox l'utente risponde "No", ripristino il valore iniziale 'a'.

Grazie

Ivo

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2019-05-09T10:43:38+00:00

Ciao Ivo, ciao Franco,

no

ti basta variare il range

If Not Intersect(Target, Range("A1:A100")) Is Nothing Then

in questo caso se scrivi da A1 ad A100 ti verrà il messaggio

per il valore vecchio

viene registrato con questo

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Valvecchio = Target.Value

End Sub

se clicchi su no viene riconfermato

se clicchi su si viene sovrascritto

Con l'utilizzo della procedura Worksheet_Change, al fine di prevenire chiamate ricorsive ripetute alla procedura, e' molto importante disattivare gli eventi prima di effettuare una modifica e riattivare gli eventi successivamente.

Pertanto, forse prova qualcosa del genere:

'=========>>

Option Explicit

'--------->>

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Rng As Range, rCell As Range

    Dim vOld As Variant, vNew As Variant

    Dim Res As VbMsgBoxResult

    Const sIntervallo As String = "A1:A10"   '<<=== Modifica

    Set Rng = Intersect(Target, Me.Range(sIntervallo))

    If Not Rng Is Nothing Then

        If Rng.Cells.Count > 1 Then

            Exit Sub

        End If

        vNew = Rng.Value

        If vNew = vbNullString Then

            vNew = " vuota "

        End If

        On Error GoTo XIT:

        With Application

            .ScreenUpdating = False

            .EnableEvents = False

            .Undo

            vOld = Rng.Value

            If vOld = vbNullString Then

                vOld = " vuota "

            End If

            Res = MsgBox( _

                  Prompt:="Sicuro che vuoi sostituire il valore " _

                          & vOld _

                          & "con il valore " _

                          & vNew, _

                  Buttons:=vbYesNo, _

                  Title:="REPORT")

        End With

        If Res = vbYes Then

            Rng.Value = vNew

        End If

    End If

XIT:     With Application

        .EnableEvents = True

        .ScreenUpdating = True

    End With

End Sub

'<<=========

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-05-09T14:38:02+00:00

    Ringrazio innanzitutto Norman e Franco.

    Mettendo insieme il tutto, ho fatto così:

    1. Memorizzazione del “Valore precedente” e dell’Adress della cella: due Variabili pubbliche, valorizzate con l’evento SelectionChange del singolo foglio

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        ValoreVecchio = Target.Value: sAddrVecchio = Target.Address

    End Sub

    1. una routine “Workbook_SheetChange” come questa:

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

        Dim sDatiOld As String, sAddr As String, i As Byte

        sDatiOld = ValoreVecchio

        sAddr = Target.Address

        If Target.Value <> sDatiOld Then i = MsgBox("Sicuro di modificare i dati ?", vbYesNo + vbDefaultButton1)

        If i = vbNo Then

            Application.EnableEvents = False

            If sAddr = ActiveCell.Address Then ActiveCell.Value = ValoreVecchio

    ' se premo "Enter" ActiveCell.Address è diverso da Target.Address

            Application.EnableEvents = True

        End If

    End Sub

    Ovviamente con il “classico” “If Not Rng Is Nothing Then …” per operare solo su un certo intervallo

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Gianfranco55 25,190 Punti di reputazione Moderatore volontario
    2019-05-09T10:24:02+00:00

    no

    ti basta variare il range

    If Not Intersect(Target, Range("A1:A100")) Is Nothing Then

    in questo caso se scrivi da A1 ad A100 ti verrà il messaggio

    per il valore vecchio

    viene registrato con questo

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Valvecchio = Target.Value

    End Sub

    se clicchi su no viene riconfermato

    se clicchi su si viene sovrascritto

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-05-09T10:00:25+00:00

    Grazie, ma la mia domanda (forse non mi sono espresso bene) è di carattere un po' più generale. Con una cella sola, ok, la tua soluzione è perfetta.

    Ma se io volessi applicarla, ad esempio, ad un'intera colonna, oppure ad un Range, dovrei memorizzare i dati "Valvecchio" in una tabella specifica?

    Non esiste (io non l'ho vista) una proprietà della cella corrente che mi dica il valore contenuto prima della modifica? (una cosa del tipo "ActiveCell.ValPrec" - ovviamente il nome è inventato!) ?

    Grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Gianfranco55 25,190 Punti di reputazione Moderatore volontario
    2019-05-09T09:46:26+00:00

    ciao

    nel foglio che ti interessa

    Dim Valvecchio As Variant

    Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("A1")) Is Nothing Then

            If Target.Value <> Valvecchio Then

                  retval = MsgBox("Stai cambiando valore!", vbOKCancel Or vbQuestion, "Attenzione!")

                  If retval = vbCancel Then

                      Target.Value = Valvecchio

                  Else

                      Valvecchio = Target.Value

                  End If

            End If

            End If

    End Sub

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Valvecchio = Target.Value

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento