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-17T14:08:55+00:00

    Ci ho lavorato su un altro pò per migliorare qualcosina. In termini di funzionalità adesso fa tutto quello che mi occorre, in termini di performance secondo me si può ottimizzare sicuramente qualcosa.

    Diciamo che per quattro istruzioni in croce il codice è istantaneo, c'è però un caso che causa lentezza, ovvero quando inserisco o elimino una riga dal foglio (per lo meno in mezzo alla tabella).

    Questo perchè purtroppo VBA esegue il codice per ogni singola cella che viene modificata (e un'intera riga è bella lunga). Non ci sarebbe un modo per far scattare il trigger solo per le celle che mi interessano?

    e mai possibile che il metodo "on change" debba coinvolgere l'intero foglio, senza essere limitato alle celle di mio interesse?

    Per quanto non esegua nulla, effettua sempre un controllo per verificare se la cella modificata ricada nell'intervallo e questo è del tutto inutile a mio avviso.

    Poi magari posto il codice completo.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Eleuterio Tedeschi 18,750 Punti di reputazione Moderatore volontario
    2022-10-14T21:29:12+00:00

    Avendo implementato (nel tuo codice) un ciclo FOR EACH che controlla ogni cella della selezione per verificare l'eventuale parametro di blocco, ha senso a questo punto controllare se è stata seleziona solo una cella o meno?

    Colpa della genesi del codice, nella prima stesura avevo lasciato il riposizionamento del cursore sulla cella che impediva la modifica, ma solo per la parte della singola cella, in considerazione del fatto che con selezioni multiple non avrei saputo scegliere dove riposizionarla.

    Poi l'ho tolta anche nella prima parte ed il codice mi è rimasto così, fai però qualche test, rileggendolo mi sembra abbastanza solido da funzionare correttamente utilizzando il solo ciclo For Each.

    Tra l'altro ho preferito usare il comando ClearContents per cancellare la cella, perchè in quell'altro modo è come se inserisse un valore, violando la convalida dati su Excel

    Perfetto, l'aiuto che si riceve in un forum, è anche uno stimolo a miglioramenti e/o modifiche che adattano la soluzione al caso reale, che casomai si evolve nel tempo. È testimonianza in questo thread: se vedi da dove sei partita e dove sei arrivata, mi sembra che un pochino di strada è stata fatta. Rinnovo i miei complimenti allo spirito con cui hai gestito questo problema e l'accortezza nel fare tuoi i nostri consigli,

    ciao.

    P.S. nel mio file avevo rimosso le convalide😏

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2022-10-14T15:30:39+00:00

    Ciao, grazie mille del tuo suggerimento, funziona alla perfezione, l'unico chiarimento lo vorrei sulla questione della selezione SINGOLA o MULTIPLA

    Avendo implementato (nel tuo codice) un ciclo FOR EACH che controlla ogni cella della selezione per verificare l'eventuale parametro di blocco, ha senso a questo punto controllare se è stata seleziona solo una cella o meno?

    Tra l'altro ho preferito usare il comando ClearContents per cancellare la cella, perchè in quell'altro modo è come se inserisse un valore, violando la convalida dati su Excel

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Eleuterio Tedeschi 18,750 Punti di reputazione Moderatore volontario
    2022-10-14T12:22:00+00:00

    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).

    Assolutamente si, ma avevo capito volessi proprio evitare la scrittura (messaggi con Gianfranco (ciao) da cui ho capito non volessi l'avviso, ma il blocco).

    In questo caso sarebbe tutto più semplice, l'evento Change serve a verificare cosa hai scritto nella cella, se non passa la convalida, che praticamente in VBA ormai è scritta per come deve realmente essere, cancella il contenuto e mostra l'avviso e, se vuoi, si sposta anche sulla cella che blocca l'inserimento.

    Ho visto che sei brava, per quello mi sono permesso di darti alcuni consigli e qualche spunto in più, se vuoi provare questo codice:

    Private Sub Worksheet_Change(ByVal Target As Range)

    Dim strMsg As String, strTitle As String, rngCell As Range

    '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 
    
            If Cells(Target.Row, [ControlloRF].Column).Value = [BloccoRF] Then ' se il regime fiscale non consente modifiche ... 
    
                If Not Target.Value = "" Then 
    
                    Target.Value = "" ' ... elimina quanto inserito 
    
                    MsgBox strMsg & Chr(10) & "Modificare il regime fiscale", vbExclamation, strTitle ' avverte l'utente 
    
                End If 
    
            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 ... 
    
                        If Not Target.Value = "" Then 
    
                            Target.Value = "" ' ... elimina quanto inserito 
    
                            MsgBox strMsg & Chr(10) & "Modificare il regime fiscale", vbExclamation, strTitle ' avverte l'utente 
    
                        End If 
    
                    End If 
    
                End If 
    
            End If 
    
        Else 
    
            For Each rngCell In Target 
    
                If Cells(rngCell.Row, [ControlloRF].Column).Value = [BloccoRF] Then ' se il regime fiscale non consente modifiche ... 
    
                    If Not rngCell.Value = "" Then 
    
                        rngCell.Value = "" ' ... elimina quanto inserito 
    
                        MsgBox strMsg & Chr(10) & "Modificare il regime fiscale", vbExclamation, strTitle ' avverte l'utente 
    
                    End If 
    
                Else 
    
                    If Not Intersect(rngCell, [CelleProtetteInterne]) Is Nothing Then ' altrimenti controlla il perimetro interno 
    
                        If Cells(rngCell.Row, [ControlloTI].Column).Value = [BloccoTI].Value Then ' se il tipo di invio non permette di scrivere ... 
    
                            If Not rngCell.Value = "" Then 
    
                                rngCell.Value = "" ' ... elimina quanto inserito 
    
                                MsgBox strMsg & Chr(10) & "Modificare il regime fiscale", vbExclamation, strTitle ' avverte l'utente 
    
                            End If 
    
                        End If 
    
                    End If 
    
                End If 
    
            Next rngCell 
    
        End If 
    
        Application.EnableEvents = True ' riattiva gli eventi 
    
    End If 
    

    End Sub

    Fai sapere,

    ciao.

    La risposta è stata utile?

    0 commenti Nessun commento