Condividi tramite

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,590 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-25T09:23:41+00:00

    Salve,

    si direi che può considerarsi risolta.

    Saluti.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Eleuterio Tedeschi 18,590 Punti di reputazione Moderatore volontario
    2022-10-25T08:43:08+00:00

    Ciao Fiorella,

    immagino tu abbia risolto, se così non fosse dai un riscontro per poter chiudere la discussione,

    grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Eleuterio Tedeschi 18,590 Punti di reputazione Moderatore volontario
    2022-10-18T08:12:57+00:00

    inizialmente non avevo un array. Ma questo non credo comporti vantaggi prestazionali.

    Non è per avere vantaggi prestazionali, ma per razionalizzazione del codice e

    perchè variant anzichè il tipo specifico che allocherebbe meno spazio in memoria?

    altrimenti non lo alloca con Array.

    Effettivamente questa è una grande soluzione, restringo il ciclo for alle sole celle di mio interesse.

    L'unica cosa che non posso evitare sarà sempre il controllo iniziale, ma forse già così si dimezzano i tempi

    Il controllo non lo puoi evitare, ma ritengo che i tempi saranno molto più che dimezzati.

    Qui bisogna vedere quale delle due istruzioni è più veloce, un riposizionamento continuo o una verifica sul count continuo per poi riposizionare solo l'ultima volta. Magari si trova una soluzione più efficiente.

    E chi dice di fare il controllo del Count continuo? Imposta una variabile boolean che valorizzerai all'inizio e poi fai agire il codice di conseguenza, costa meno che spostare continuamente il controllo sulle celle. Se rimani di questa idea, non ho detto che è sbagliata, aggiungi

    Application.ScreenUpdating = False
    

    per poi riattivarlo.

    Ciao.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2022-10-18T07:42:03+00:00

    Visto l'ottimo confronto, facciamo un po' di didattica

    strCheck(0) = "REGIME FISCALE"

    strCheck(1) = "TIPO INVIO"

    Si può evitare caricando l'intero array:

    arrCheck = Array("REGIME FISCALE", "TIPO INVIO")
    

    Si, effettivamente si può inizializzare tutto in riga, è sempre un refuso del fatto che inizialmente non avevo un array. Ma questo non credo comporti vantaggi prestazionali.

    in questo caso arrCheck va dichiarato Variant (vedi il codice) e LBound è 1 non 0.

    Cosa che ho fatto anche per diffRow.

    Questa cosa non l'ho capita invece, perchè variant anzichè il tipo specifico che allocherebbe meno spazio in memoria?

    Verranno confrontate, ma sempre una sola volta, quello che succede in realtà è che il Target che riceve, nel caso di righe o colonne intere, sarà esplorato dal ciclo For Next:

    For Each cellCheck In Target
    

    ma anche questo può essere impedito se dopo il controllo dell'intersezione iniziale riassegni il Target:

    Set Target = Intersect(Target, [CelleProtetteEsterne])
    

    circoscrivendolo alle sole celle di interesse.

    Effettivamente questa è una grande soluzione, restringo il ciclo for alle sole celle di mio interesse.

    L'unica cosa che non posso evitare sarà sempre il controllo iniziale, ma forse già così si dimezzano i tempi (verifico subito)

    Per quanto detto, io eviterei il riposizionamento, es:

    Cells(cellCheck.Row, [ControlloRF].Column).Select '... sposta la selezione su "REGIME FISCALE"
    

    in caso di Target multiplo lo faresti ogni volta, cosciente di questa cosa valuta tu. Puoi mettere ad esempio un controllo sul Count e farlo solo per il primo o l'ultimo.

    Qui bisogna vedere quale delle due istruzioni è più veloce, un riposizionamento continuo o una verifica sul count continuo per poi riposizionare solo l'ultima volta. Magari si trova una soluzione più efficiente.

    EDIT:

    Perfetto!

    Il restringimento del range ha velocizzato il codice, rendendo il tutto istantaneo. Ho creato una seconda variabile minTarget as Range di appoggio per non variare il Target passato nell'evento

    Inoltre ho applicato qualche altro piccolo cambiamento logico che avrebbe potuto dare problemi. Ovvero, non aveva senso innestare i controlli sulle colonne ID e REGIME FISCALE come ELSE di quello principale, questo perchè in caso di inserimento nuova riga, in realtà l'evento toccherebbe tutte le colonne simultaneamente ed io devo verificare cosa comporta per ogni colonna.

    Quindi ho separato le ultime due istruzioni di controllo in verifiche a se stanti.

    La risposta è stata utile?

    0 commenti Nessun commento