Bloccare modifica celle Excel in base a criteri

Anonimo
2022-10-10T11:14:57+00:00

Salve a tutti,

mi interesserebbe sapere se è possibile bloccare la modifica di una cella in Excel in base al contenuto di altre celle. Nello specifico, voglio bloccare la scrittura di una cella se in un altra è presente un determinato valore.

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
Eleuterio Tedeschi 18,750 Punti di reputazione Moderatore volontario
2022-10-25T09:55:58+00:00

Salve,

si direi che può considerarsi risolta.

Saluti.

Perfetto, ricorda allora di marcare il post per la risoluzione al fine di renderlo visibile a chi legge la discussione.

Grazie.

La risposta è stata utile?

2 persone hanno trovato utile questa risposta.
0 commenti Nessun commento

44 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2022-10-14T11:17:24+00:00

    Ho aggiunto qualche cosina:

    1. fondamentale, la disabilitazione degli eventi, visto che nel codice si sposta il controllo su altre celle, richiami di nuovo l'evento che stai gestendo, causando inefficienze;

    Avevo notato questa cosa, ma non sapevo come impedirla, mi stava facendo impazzire che ogni volta che spostavo ricominciava il ciclo come se fosse in un loop.

    1. nel caso di selezione multipla, che avevi correttamente intercettato, ridimensiona il Target per permettere al codice gli ulteriori controlli;

    Questo da una parte è un problema, perché non so cosa voglia fare l'utente con selezione multipla, magari vuole cambiare il colore di una colonna e non posso impedirlo solo perché nel mezzo c'è una riga "bloccata". Infatti con il tuo suggerimento questa eventualità viene impedita.

    1. mantenendo la tua idea di spostare il controllo attivo su una cella esterna ai perimetri individuati, ora lo sposta sul regime fiscale se non passa il primo controllo, altrimenti sul tipo di invio se è il secondo controllo a non verificarsi;

    In effetti è più intuitivo in questo modo, almeno l'utente capisce meglio il perché del blocco e volendo è già posizionato per eliminarlo.

    If Not Intersect(Target, [CelleProtetteEsterne]) Is Nothing Then

    Ottimo, non sapevo che i "nomi" si potessero richiamare così facilmente. Molto meno incasinato di quello che avevo fatto io.

    VBA non lo usavo da più di 15 anni ma in generale non è che abbia mai programmato più di tanto.

    L'unico problema che resta è quello del punto 2. Devo per forza di cose lasciare selezionare più celle (anche se questo poi consentirebbe l'inserimento dati).

    Non ci sarebbe un modo per stabilire una "convalida dati" via VBA?
    Del tipo: voglio scrivere un valore in una cella dell'intervallo bloccabile, verifico che quella cella che sta cambiando effettivamente sia bloccata dal parametro e dunque impedisco (o cancello) l'inserimento del nuovo valore (lanciando sempre l'avvertimento).

    In questo modo, anche in caso di selezione multipla, se il controllo avviene su ogni cella il cui valore sia stato modificato, le celle "bloccate" reagirebbero azzerando la cella, mentre le altre no.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Eleuterio Tedeschi 18,750 Punti di reputazione Moderatore volontario
    2022-10-13T21:53:54+00:00

    Ho aggiunto qualche cosina:

    1. fondamentale, la disabilitazione degli eventi, visto che nel codice si sposta il controllo su altre celle, richiami di nuovo l'evento che stai gestendo, causando inefficienze;
    2. nel caso di selezione multipla, che avevi correttamente intercettato, ridimensiona il Target per permettere al codice gli ulteriori controlli;
    3. mantenendo la tua idea di spostare il controllo attivo su una cella esterna ai perimetri individuati, ora lo sposta sul regime fiscale se non passa il primo controllo, altrimenti sul tipo di invio se è il secondo controllo a non verificarsi;

    e questo il codice:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    'Dichiarazione delle variabili per il messaggio di avvertimento 
    
    Dim strMsg As String, strTitle As String 
    
    'Inizializzazione delle variabili 
    
    strMsg = "La cella selezionata non prevede l'inserimento dati!" 
    
    strTitle = "Attenzione" 
    
    'Controlla che sia stata selezionata una cella presente nell'intervallo bloccabile più ampio 
    
    If Not Intersect(Target, [CelleProtetteEsterne]) Is Nothing Then 
    
        Application.EnableEvents = False ' disabilita gli eventi 
    
        If Target.Count <> 1 Then 'Controlla che sia stata selezionata solo una cella per non impedire le modifiche di gruppo 
    
            Set Target = Target.Cells(1, 1) ' nel caso usa solo la prima 
    
            Target.Select 
    
        End If 
    
        If Cells(Target.Row, [ControlloRF].Column).Value = [BloccoRF] Then ' se il regime fiscale non consente modifiche ... 
    
            Cells(Target.Row, [ControlloRF].Column).Select ' ... lo seleziona 
    
            MsgBox strMsg & Chr(10) & "Modificare il regime fiscale", vbExclamation, strTitle ' avverte l'utente 
    
        Else 
    
            If Not Intersect(Target, [CelleProtetteInterne]) Is Nothing Then ' altrimenti controlla il perimetro interno 
    
                If Cells(Target.Row, [ControlloTI].Column).Value = [BloccoTI].Value Then ' se il tipo di invio non permette di scrivere ... 
    
                    Cells(Target.Row, [ControlloTI].Column).Select ' ... lo seleziona 
    
                    MsgBox strMsg & Chr(10) & "Modificare il tipo invio", vbExclamation, strTitle ' avverte l'utente 
    
                End If 
    
            End If 
    
        End If 
    
        Application.EnableEvents = True ' riattiva gli eventi 
    
    End If 
    

    End Sub

    Spero ci siano spunti utili,

    ciao.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2022-10-13T15:01:43+00:00

    Allego anche il codice in formato "copiabile"

    'La routine viene eseuita ogni volta che cambia la selezione

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    *'Dichiarazione delle variabili per il messaggio di avvertimento* 
    
    *Dim msgCellaBloccata As String* 
    
    *Dim TitoloCellaBloccata As String* 
    
    *'Inizializzazione delle variabili* 
    
    *msgCellaBloccata = "La cella selezionata non prevede l'inserimento dati!"* 
    
    *TitoloCellaBloccata = "Attenzione"* 
    
    *'Controlla che sia stata selezionata una cella presente nell'intervallo bloccabile più ampio* 
    
    *If Not Intersect(Target, Range("CelleProtetteEsterne")) Is Nothing Then* 
    
        *'Controlla che sia stata selezionata solo una cella per non impedire le modifiche di gruppo* 
    
        *If Target.Cells.Count = 1 Then* 
    
            *'Controlla se la cella selezionata si trovi su un riga in cui la rispettiva colonna "Regime Fiscale" preveda il valore di blocco* 
    
            *If Cells(Target.Row, Range("ControlloRF").Column).Value = Worksheets("Parametri").Range("BloccoRF").Value Then* 
    
                *'Sposta la selezione attuale sulla prima colonna non bloccata a sinistra* 
    
                *Cells(Target.Row, Range("CelleProtetteEsterne").Resize(1, 1).Column - 1).Select* 
    
                *'Mostra il messaggio di avvertimento* 
    
                *MsgBox msgCellaBloccata, vbExclamation, TitoloCellaBloccata* 
    
            *'Controlla che sia stata selezionata una cella presente nell'intervallo bloccabile più interno* 
    
            *ElseIf Not Intersect(Target, Range("CelleProtetteInterne")) Is Nothing Then* 
    
                *'Controlla se la cella selezionata si trovi su un riga in cui la rispettiva colonna "Tipo Invio" preveda il valore di blocco* 
    
                *If Cells(Target.Row, Range("ControlloTI").Column).Value = Worksheets("Parametri").Range("BloccoTI").Value Then* 
    
                    *'Sposta la selezione attuale sulla prima colonna non bloccata a sinistra* 
    
                    *Cells(Target.Row, Range("CelleProtetteInterne").Resize(1, 1).Column - 1).Select* 
    
                    *'Mostra il messaggio di avvertimento* 
    
                    *MsgBox msgCellaBloccata, vbExclamation, TitoloCellaBloccata* 
    
                *End If* 
    
            *End If* 
    
        *End If* 
    
    *End If* 
    

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2022-10-13T14:57:05+00:00

    ![](https://learn-attachment.microsoft.com/api/attachments/348a27d3-c1b6-438a-8519-46c77d0dadff?platform=QnA

    Questo è il codice.
    Ho usato alcuni "Nomi" su Excel per definire degli intervalli o delle celle, in maniera tale che se dovessi variare la tabella (spostare, aggiungere righe o colonne) non dovrei intervenire sul codice, ma al massimo sull'intervallo stabilito nel Nome.

    L'effetto che ho ricreato come si può notare non è proprio bloccante al 100%. Richiederebbe sicuramente qualche misura diversa.

    Ho fatto in modo che se si seleziona una cella grigia (disabilitata), la selezione si sposti in automatico sulla prima cella libera a sinistra, mostrando solo un avviso. Quindi è virtualmente bloccata la modifica.

    Ovviamente ho lasciato libera la selezione multipla per non impedire modifiche tipo: ordinamento delle righe o altre funzioni multiple.
    Questo comporta però anche la cancellazione del contenuto cella, o l'inserimento tramite selezione multipla.

    Ma considerando che il foglio lo uso principalmente io, diciamo che per il momento è una misura accettabile.

    Anche se, ovviamente, l'ideale sarebbe quello di far comparire un avviso (anche senza spostare la selezione) ed impedire l'immissione di dati.
    E, magari, svuotare le celle nel momento in cui le colonne di riferimento si spostino sul parametro bloccante.

    La risposta è stata utile?

    0 commenti Nessun commento