Condividi:        

[excel]bloccare cella in base a contenuto altra cella

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[excel]bloccare cella in base a contenuto altra cella

Postdi aaa » 04/01/07 12:18

Ciao a tutti,

premettendo che di visual Basic non ci pesco quasi per niente, mi potete suggerire un modo per inibire la compilazione di una o più celle a seconda del contenuto di un'altra casella?
MI spiego meglio, se inserisco nella cella A1 il valore A anzichè il valore B, come posso evitare che vengano compilate - seppur per errore - delle celle che vanno valorizzate solo per A1 uguale a B?
La formattazione condizionale mi aiuta ma lascia le celle valorizzabili.
Chi mi aiuta?
Grazie
Ale
aaa
Utente Junior
 
Post: 22
Iscritto il: 07/07/03 17:07

Sponsor
 

Postdi Caffey » 04/01/07 14:32

Prova con la funzione IF. Dovrebbe essere sufficiente senza scomodare il Visual Basic...
Al di sopra dell'onnipotenza divina, si erge il più alto potere della ragione [L. A. Feuerbach]
Avatar utente
Caffey
Moderatore
 
Post: 605
Iscritto il: 30/12/06 15:33
Località: Umbria

Postdi aaa » 04/01/07 15:26

Sto utilizzando "SE" ma non conosco il comando per inibire il completamento delle celle che non devono essere valorizzate.
La mia necessità è quella di inibire (o eventualmente cancellare, qualora già contente qualcosa) l'utilizzo delle celle che non hanno pertinenza con la scelta nella cella di controllo.
Suggerimenti?
aaa
Utente Junior
 
Post: 22
Iscritto il: 07/07/03 17:07

Postdi Caffey » 04/01/07 16:23

Non è chiarissimo il problema ma se ho capito bene con l'IF è possibile:
la funzione IF ha questa forma:
Codice: Seleziona tutto
=IF(logical_test; [value_if_true]; [value_if_false])


In pratica:
"logical_test" è il test.
"value_if_true" è il valore che la cella deve assumere se il test è vero
"value_if_false" è il valore che la cella deve assumere se il test è falso

Ad esempio: Se vuoi che una cella sia bianca quando il valore della cella A1 è superiore a 120, oppure assuma la stringa CIAO quando A1 è minore di 120 devi scrivere nella cella che vuoi assuma quelle caratteristiche:
Codice: Seleziona tutto
=IF(A1>120;"";"CIAO")
Al di sopra dell'onnipotenza divina, si erge il più alto potere della ragione [L. A. Feuerbach]
Avatar utente
Caffey
Moderatore
 
Post: 605
Iscritto il: 30/12/06 15:33
Località: Umbria

Postdi Anthony47 » 05/01/07 00:06

aaa ha scritto:mi potete suggerire un modo per inibire la compilazione di una o più celle a seconda del contenuto di un'altra casella?

Per "non compilare" intendi che quelle celle devono restare vuote o con il valore preesistente?
Se intendi "vuote" e se, come mi pare, si tratta di celle i cui valori poi utilizzi per altre elaborazione, allora si potrebbe
-usare la formattazione condizionata per dare al font di quelle celle che non dovrebbero essere compilate un colore uguale allo sfondo, tipicamente bianco, per renderlo invisibile.
-nelle celle dove elabori questi valori, usi la funzione SE per decidere (in funzione di quanto scritto in cella A1, come da tuo esempio) se il contenuto della cella deve essere utilizzato o meno.

Altra ipotesi: quando si inserisce un valore nelle caselle chiave (quale A1 nel tuo esempio) con una macro sull' evento Worksheet_Calculate si vanno a proteggerele celle che non devono essere toccate; questo se la richiesta e' di lasciare inalterate quelle celle con i valori preesistenti e quindi la proposta precedente non e' applicabile.

Altra ipotesi: si usa Data ->Convalida, si lascia (sul tab Impostazioni) "Consenti qualsiasi valore" (o una scelta piu' pertinente anche se generica, es Numero intero), e sul Messaggio di input si scrive un messaggio che ricorda quando quella cella deve essere o non essere compilata; e' solo un promemoria, quindi sara' da utilizzare in combinazione con la funzione SE come detto prima.

Ovviamente ci sono anche altre combinazioni se queste che ho citato non sono applicabili; attendiamo tue nuove.

Ciao,
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi aaa » 05/01/07 10:01

Dunque,
ho usato la formattazione condizionale come suggerisci per uniformare il colore del carattere al colore dello sfondo aggiungendo anche un controllo da Convalida per far sì che, a seconda della scelta nella casella di controllo, il contenuto delle celle "scolorite" non venga tenuto in considerazione ai fini del conteggio finale. Ho raggiunto il risultato ma è un palliativo. Questo perchè, se si sbaglia (anche se bisogna essere dei polli) la scelta nella casella di controllo, si avranno ovvie difficoltà nella prosecuzione di una compilazione che invece non dovrebbe avvenire per quella scelta.
Cmq, cerco di risponderti passo passo:

Per "non compilare" intendi che quelle celle devono restare vuote o con il valore preesistente?
R. Devono restare vuote.

[b]Se intendi "vuote" e se, come mi pare, si tratta di celle i cui valori poi utilizzi per altre elaborazione, allora si potrebbe
-usare la formattazione condizionata per dare al font di quelle celle che non dovrebbero essere compilate un colore uguale allo sfondo, tipicamente bianco, per renderlo invisibile.

R. Fatto, ho anche inserito la colorazione della cella in grigio scuro per sottolineare la non compilabilità.
-nelle celle dove elabori questi valori, usi la funzione SE per decidere (in funzione di quanto scritto in cella A1, come da tuo esempio) se il contenuto della cella deve essere utilizzato o meno.
R. Fatto.

Altra ipotesi: si usa Data ->Convalida, si lascia (sul tab Impostazioni) "Consenti qualsiasi valore" (o una scelta piu' pertinente anche se generica, es Numero intero), e sul Messaggio di input si scrive un messaggio che ricorda quando quella cella deve essere o non essere compilata; e' solo un promemoria, quindi sara' da utilizzare in combinazione con la funzione SE come detto prima.
R. Fatto.

Riepilogando:
Cella A1= casella di controllo com menu a tendina. Scelte A o B
Se A1=A allora compilare (possibile renderlo obbligatorio? e come?) B1, C1 e D1.
Se A1=B allora compilare (solo) B1 ed inibire il completamento di C1 e D1 (magari cancellando un contenuto preesistente.
Precisazione: di Macro ci capisco molto poco quindi dovrei essere portato per mano.
Salutoni
aaa
Utente Junior
 
Post: 22
Iscritto il: 07/07/03 17:07

Postdi Caffey » 05/01/07 10:09

Se ho capito bene tu vuoi fare una cosa alquanto complessa. Rendere obblibatoria la compilazione di una casella con Excel non l'ho mai fatto, anche perché non miè mai servito: una casella la compilo perché altrimenti non ritornano i conti o comunque non ha senso quello che scrivi.
Per fare una cosa del genere io andrei più su ACCESS.
Al di sopra dell'onnipotenza divina, si erge il più alto potere della ragione [L. A. Feuerbach]
Avatar utente
Caffey
Moderatore
 
Post: 605
Iscritto il: 30/12/06 15:33
Località: Umbria

Postdi Anthony47 » 05/01/07 15:29

Ciao aaa,
ho capito che hai gestito con la funzione SE l’ utilizzo o meno delle celle B1-C1-D1 a seconda del contenuto di A1, come suggerimento di Caffey del 4-1; bene.
In aggiunta, hai usato la formattazione condizionata per suggerire all’ utente che alcune celle non devono essere compilate e per nascondere alla vista eventuali inputazioni inutili; ho capito che hai anche settato la “convalida”, per cui quando si va su una delle celle in cui mettere o non mettere qualcosa esce un messaggino del tipo “Inputare solo se A1=Xyz”.
Poi pero' dici:
Ho raggiunto il risultato ma è un palliativo. Questo perchè, se si sbaglia (anche se bisogna essere dei polli) la scelta nella casella di controllo, si avranno ovvie difficoltà etc etc

Avendo messo pero’ una convalida sulla casella A1 (da tuo “Riepilogando” capisco che l’ hai fatto, vero?) questo dovrebbe essere impossibile.

Puoi comunque aggiungere altri controlli; ad esempio in una cella libera, ad esempio F1 metti la formula
Codice: Seleziona tutto
=SE(A1="A";"Compilare B1, C1, D1";SE(A1="B";"Compilare B1";"Errata compilazione di A1"))

Questa formula fa comparire i seguenti messaggi:
-se A1 non e’ ne’ A ne’ B: ERRATA COMPILAZIONE di A1
-se A1=A: Compilare B1, C1, D1
-se A1=B: Compilare B1

Con la stessa tecnica puoi far comparire un messaggio di errore nell’ area in cui viene prodotto un output se un input necessario non e’ stato inputato.

Infine, possiamo fare in modo che tutte le volte che compili A1 le celle B1, C1 e D1 siano azzerate, usando le macro. Per questo:
-fai tasto destro sul tab del nome del foglio su cui lavori; scegli “Visualizza codice”.
-ti si apre l’ editor vba, con il frame di dx tutto bianco
-incolla le seguenti istruzioni nel riquadro di dx
Codice: Seleziona tutto
Dim OldA
Private Sub Worksheet_Calculate()
If Range("A1") = OldA Then Exit Sub
Application.EnableEvents = False
Range("B1:D1").ClearContents
OldA = Range("A1").Value
Application.EnableEvents = True
End Sub


(Questo pero’ e’ subordinato all’ applicazione della Convalida sulla cella A1)

Chiudi l’ editor vba da Menu ->File per tornare sul foglio excel e verifica se funziona come detto sopra.

Io sorvolerei sulla richiesta di “inibire il completamento di C1 e D1” (se A1=B), perche’ tanto l’ utilizzo dei valori di queste celle e’ gia’ subordinato al contenuto di A1 (la famosa funzione SE) e poi questi dati sono stati resi invisibili.

Per quanto riguarda l' obbligatorieta' di alcuni input, se l' utente vede il messaggio "Compila questo e compila quello", se eventualmente nell' area di output fai uscire un altro messaggio del tipo "Non hai compilato quello, ERRORE", beh mi pare che il risultato si possa considerare raggiunto.
Volendo puoi addirittura inibire l' output (sempre con la funzione SE) qualora i parametri di ingresso non siano formalmente congrui; se per questo ti serve aiuto, spiega le elaborazioni che fai sui dati introdotti e quale output produci, in modo da poter fare proposte precise.

Ciao,
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi aaa » 05/01/07 17:40

Suggerimenti preziosi sopratutto quello riguardo al vba.

Mi è tornato molto utile.

Una sola domanda: la tua formula mi è tornata utile (ci provavo con il SE inserito in un altra cella ma non ci riuscivo perchè sbagliavo qualcosa) ma, poichè la cella A1 si ripropone in colonna per n volte, per quante valorizzazioni necessitano, è possibile utilizzare il SE su ogni cella della colonna?

Se è complicato non preoccuparti, sei già stato prezioso così.

Grazie di tutto.

Ciao
aaa
Utente Junior
 
Post: 22
Iscritto il: 07/07/03 17:07

Postdi Anthony47 » 06/01/07 00:37

Hummm
è possibile utilizzare il SE su ogni cella della colonna?

Parli della formula SE che fa uscire il messaggio in funzione del contenuto di A1 e che ci sono tante “celle pilota” e non solo A1?
In questo caso puoi copiare la formula che ho proposto per la cella F1 nelle altre celle sottostanti, e i riferimenti saranno cambiati automaticamente: seleziona F1, fai Contr-c per Copiare, seleziona le altre celle da compilare (es F2:F10) e fai Contr-v oppure Enter per incollare la formula. Sara’ opportuno cambiare la formula originale, sostituendo “Compilare B1, C1, D1” con “Compilare Colonne B-C-D”.

Ma se hai “tante” celle pilota, l’ approccio adottato potrebbe essere inadeguato: non ha senso pratico, ad esempio, far uscire tanti messaggi che dicono “Compilare Colonne B-C-D” oppure “Compilare Colonna B” perche’ non catturano l’ attenzione e i messaggi rischiano di confondersi. Bisognerebbe trasformarli in messaggi “di eccezione”, ad esempio usando la formula
Codice: Seleziona tutto
=SE(A1="A";SE(E(B1<>"";C1<>"";D1<>"");"";"Compilare Colonna "&SE(B1="";"B ";"")&SE(C1="";"C ";"")&SE(D1="";"D";""));SE(A1="B";SE(B1="";"Compilare B1";"");"Errata compilazione di A1"))

Questa fa uscire il messaggio di quali celle sono ancora da compilare, ed e’ pronta per essere inserita in F1 (o altra cella libera sulla riga) e da qui copiata verso il basso su altre righe che contengono celle pilota (come detto sopra).

Anche la macro e’ stata scritta per controllare 1 sola cella pilota (A1), quindi per controllarne tante va modificata. Ti propongo questa, che sostituisce in toto quella precedente:
Codice: Seleziona tutto
Private Sub Worksheet_Calculate()
CellePilota = "A1:A10"   '<<< Indicare l' area che contiene celle pilota
WorkCol = "Z1"          '<<< Indicare una colonna libera
Application.EnableEvents = False
NCP = Range(CellePilota).Rows.Count
For I = 0 To NCP - 1
If Range(CellePilota).Range("A1").Offset(I, 0).Value <> Range(WorkCol).Offset(I, 0).Value Then
Range(WorkCol).Offset(I, 0).Value = Range(CellePilota).Range("A1").Offset(I, 0).Value
Range(CellePilota).Range("A1").Offset(I, 0).Range("B1:D1").ClearContents
End If
Next I
Application.EnableEvents = True
End Sub


Immediatamente devi cambiare (se necessario) l’ istruzione WorkCol = "Z1" , sostituendo Z con una qualsiasi colonna libera, che sara’ usata dalla macro per copiare i contenuti delle celle pilota e identificare i cambiamenti; esempio se Z e’ una colonna occupata e si volesse usare la colonna AE, scriverai WorkCol = "AE1"
Analogamente correggi l’ indicazione di quale area contiene celle pilota, modificando l’ istruzione CellePilota = "A1:A10"; ad esempio CellePilota = "A1:A3"
Cosa fa:
scansiona tutte le "celle pilota" dichiarate, e se ne trova una variata cancella le colonne B-C-D di quella riga.

Immagino che (per oggi) possa bastare.

Ciao,
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi cassioli » 10/01/07 14:09

I comandi-base per bloccare celle e fogli:

Codice: Seleziona tutto
Sub blocca()
    ActiveSheet.Unprotect ' toglie protezione foglio
    Range("E1").Select ' seleziona cella
    Selection.Locked = False ' toglie blocco dalla cella
    Selection.Locked = True ' blocca cella
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' blocca foglio
End Sub


--> Una cella puo' essere bloccata solo se la protezione del foglio e' attiva.
Questa macro funziona solo se lanciata di volta in volta. Per fare un controllo automatico ad ogni modifica di una cella, bisogna gestire gli Eventi nel modulo ThisWorkbook... :roll:
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi cassioli » 10/01/07 14:19

Da copiare in ThisWorkbook del tuo foglio:

Codice: Seleziona tutto
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Const COLONNA_CONTROLLANTE = 1
    Const RIGA_CONTROLLANTE = 1
    Const COLONNA_CONTROLLATA = 1
    Const RIGA_CONTROLLATA = 2
    If Target.Column = COLONNA_CONTROLLANTE And Target.Row = RIGA_CONTROLLANTE Then
        If Cells(COLONNA_CONTROLLANTE, RIGA_CONTROLLANTE) = "1" Then
            ActiveSheet.Unprotect ' toglie protezione foglio
            Cells(COLONNA_CONTROLLATA, RIGA_CONTROLLATA).Select ' seleziona cella
            Selection.Locked = False ' toglie blocco della cella
            Cells(COLONNA_CONTROLLATA, RIGA_CONTROLLATA) = "modificabile"
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' blocca foglio
        Else
            ActiveSheet.Unprotect ' toglie protezione foglio
            Cells(COLONNA_CONTROLLATA, RIGA_CONTROLLATA).Select ' seleziona cella
            Selection.Locked = True ' attiva blocco della cella
            Cells(COLONNA_CONTROLLATA, RIGA_CONTROLLATA) = "fissa"
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' blocca foglio
        End If
    End If
End Sub
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi cassioli » 10/01/07 14:35

Magari puo' essere utile cambiare il colore della cella quando è bloccata o sbloccata:
Codice: Seleziona tutto
Selection.Font.ColorIndex = 3
Selection..Interior.ColorIndex = 6
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi aaa » 08/03/07 09:59

fatto
anche i colori li ho modificati ma ho utilizzato la formattazione condizionale
il risultato è lo stesso
grazie 1000
aaa
Utente Junior
 
Post: 22
Iscritto il: 07/07/03 17:07


Torna a Applicazioni Office Windows


Topic correlati a "[excel]bloccare cella in base a contenuto altra cella":


Chi c’è in linea

Visitano il forum: Nessuno e 98 ospiti