VBA Blocco celle condizionato
Hai un problema con Excel? 
VBA Blocco celle condizionato
di Steven (utente non iscritto) data: 05/01/2016 18:28:27
Salve a tutti.
Prima di disturbare ci ho provato parecchio, ma senza risultati
Ho un foglio Excel dove si ripetono formule di calcolo con ciclo di 15 righe.
Questo è l'obiettivo:
-Quando il foglio sarà Bloccato con password, se una cella di un ciclo sarà maggiore di 0, altre 4 celle (inizialmente sbloccate per default) dovranno passare alla condizione di Bloccate. Nella pratica, se la cella AC62>0 le celle AA55, AA57, AA59,AA60, AA61 dovranno diventare bloccate, altrimenti sono sbloccate anche a foglio protetto.
Trovata la giusta formula, la ripeterò su ogni ciclo del foglio (ad esempio, la successiva sarà: se AC77>0 le celle AA70, AA72, AA74,AA75, AA76 dovranno diventare bloccate, e via dicendo.
Grazie per ogni suggerimento
di alfrimpa data: 05/01/2016 18:40:56
Ciao Steven
Credo che quello che chiedi non si possa fare con le formule; queste non compiono azioni (e il bloccare una cella è un'azione) bensī restituscono risultati.
Allega un tuo file di esempio che sia strutturalmente uguale a quello reale e spiega sul foglio il risultato che vuoi ottenere.
Alfredo
di Steven (utente non iscritto) data: 05/01/2016 19:57:05
Ciao Alfredo, e grazie.
Sì, effettivamente mi sono espresso male, infatti non mi riferivo a risolvere con formule ma bensì credo in ambiente VBA.
L'operazione è sempre comunque prevista in un foglio da me protetto.
Nell'esempio allegato, come primo step una persona diversa da me decide i valori da inserire nelle caselle verdi e quale Codice (lettera) inserire nella casella gialla, tra quelli disponibili in elenco.
Al secondo ed ultimo step, io inserirò una data nella casella blu corrispondente al Codice scelto dall'altra persona (X nel ciclo 1). Dal momento in cui io inserisco quella data, le caselle verdi e quella gialla devono bloccarsi, impedendo qualsiasi modifica a Foglio protetto.
Tale operazione può essere effettuata può volte nel foglio (Ciclo 2, 3 ecc), e in tempi diversi.
Spero l'esempio sia utile, altrimenti chiedimi pure chiarimenti.
Nel frattempo ti ringrazio molto per l'interessamento.
Steven
di alfrimpa data: 05/01/2016 22:24:19
Ciao Steven
Ora ho solo l'iPad con il quale non posso aprire i file .zip.
Dammi un attimo di tempo (rientro a casa domani sera).
Alfredo
di cromagno data: 06/01/2016 00:32:25
Ciao Steven e ciao Alfredo,
Riporto sotto la macro che serve per bloccare o sbloccare le celle (da inserire in un modulo standard) e ancora più sotto il codice (da mettere nel modulo di classe del Foglio1) che richiama la macro al variare del valore di una delle celle nel range C3:C5.
La password del foglio è 123.
Il range C3:C5 l'ho lasciato senza protezione per una questione di comodità nel fare delle prove.
Ti lascio il file in allegato....
Sub Blocca_Celle()
Dim uRiga As Long, Codici As Range, Cella As Range, CellsToLock As Range
Dim i As Long
Set Codici = Range("B3:B5")
uRiga = Range("D" & Rows.Count).End(xlUp).Row
ActiveSheet.Unprotect (123)
For i = 10 To uRiga Step 15
Set CellsToLock = Range(Cells(i, 2), Cells(i + 6, 5))
If Range("E" & i).Value <> "" Then
For Each Cella In Codici
If Cella.Value = Range("E" & i).Value Then
If Cella.Offset(0, 1).Value <> "" Then
CellsToLock.Locked = True
CellsToLock.FormulaHidden = True
GoTo salto
Else
CellsToLock.Locked = False
CellsToLock.FormulaHidden = False
GoTo salto
End If
End If
Next
End If
salto:
Next i
Set Codici = Nothing
Set CellsToLock = Nothing
ActiveSheet.Protect (123)
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C3:C5")) Is Nothing Then
Call Blocca_Celle
End If
End Sub |
di Steven (utente non iscritto) data: 06/01/2016 13:33:11
Ciao Cromagno.
Ho verificato il file che hai sviluppato, e mi pare adatto alla situazione. Domani provo ad adattarlo al file reale di lavoro poi aggiorno qui l'esito.
C'è un problema, che però avevo già ipotizzato e valutato come risolvere.
Il file reale di lavoro ha circa 300 cicli di 15 righe ciascuno. Una persona, diversa da me, compilerà i campi verdi di (supponiamo) 35 cicli non contigui, ed attribuirà anche il Codice del campo Giallo (supponiamo X). A quel punto io intervengo, inserisco la data che ritengo opportuna nel campo blu relativo al Codice X; da quel momento tutte le celle verdi e gialle dei 35 cicli con Codice X si bloccano, mentre su tutti gli altri cicli ancora aperti è possibile imputare dati. Fantastico!
Se però, dopo il blocco dei primi 35 cicli X, io provo a compilare le celle verdi di un nuovo ciclo (il 36°), ed attribuisco il Codice X, esso non si blocca mai più.
Penso di risolvere il problema con una formula che elimina dal menù a tendina delle celle gialle il Codice 'bloccato' (nell'esempio di prima, il Codice X) , non appena io inserisco la data nella relativa cella blu. A quel punto la scelta è possibile solo per i Codici non ancora bloccati.
Testo il tutto sul file reale e poi aggiorno la discussione.
Nel frattempo ti ringrazio molto e auguro a te e Alfredo una buona Epifania.
di Steven (utente non iscritto) data: 07/01/2016 10:18:19
Buongiorno Cromagno e Alfredo.
Devo ammettere che alla mia preparazione nell'ambiente delle formule non corrisponde altrettanta preparazione nell'ambiente VBA che, a quanto pare, lavora con impostazioni molto diverse.
Avevo caricato un esempio molto similare ma semplificato del mio caso, nella convinzione che adattarlo alle celle del mio file reale di lavoro fosse un pò come adattare formule, ma vedo che la posizione esatta delle celle è strategica nella soluzione di Cromagno.
....è mi trovo in difficoltà nell'adattare la giusta soluzione VBA al file reale.
Mi scuso per la scontatezza, ed allego lo stesso file (Esempio 2) con esatta corrispondenza delle celle come nel mio file reale, se per Cromagno è possibile rettificare la soluzione.
Grazie davvero per la collaborazione.
di cromagno data: 07/01/2016 18:25:15
Ciao Steven,
ti riporto sotto i codici adattati al nuovo file....
Ti lascio anche il nuovo file in allegato ("Blocca celle...Ultimo").
Sub Blocca_Celle()
Dim uRiga As Long, Codici As Range, Cella As Range, CellsToLock As Range
Dim i As Long
Set Codici = Range("Y8:Y43")
uRiga = Range("Y" & Rows.Count).End(xlUp).Row
ActiveSheet.Unprotect (123)
For i = 55 To uRiga Step 15
Set CellsToLock = Range("AA" & i & ":AA" & i + 6)
If Range("AA" & i).Value <> "" Then
For Each Cella In Codici
If Cella.Value = Range("AA" & i).Value Then
If Cella.Offset(0, 7).Value <> "" Then
CellsToLock.Locked = True
CellsToLock.FormulaHidden = True
GoTo salto
Else
CellsToLock.Locked = False
CellsToLock.FormulaHidden = False
GoTo salto
End If
End If
Next
End If
salto:
Next i
Set Codici = Nothing
Set CellsToLock = Nothing
ActiveSheet.Protect (123)
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AF8:AF43")) Is Nothing Then
Call Blocca_Celle
End If
End Sub |
di cromagno data: 07/01/2016 18:27:40
P.S.
Dimenticavo...
Le celle verdi nella colonna M non vengono considerate (quindi non vengono bloccate).
Fammi sapere se bisogna bloccare anche quelle.
di Steven (utente non iscritto) data: 07/01/2016 19:09:17
Ciao Cromagno.
Ottima la soluzione!
Sì, con il blocco anche delle celle verdi presenti in colonna M sarebbe completo e perfetto!
In attesa, ti auguro una buona serata. Grazie!!!
di cromagno data: 07/01/2016 19:16:15
Ciao,
dovrebbe bastare la modifica in questa riga:
Set CellsToLock = Range("AA" & i & ":AA" & i + 6)
in questo modo:
Set CellsToLock = Range("M" & i & ":AA" & i + 8)
Ti riallego il file ("Blocca celle...3rd").
di Steven (utente non iscritto) data: 08/01/2016 15:38:38
Ho copiato il VBA nel file reale di lavoro.
A dir poco .... FENOMENALE!!!
E' la prima volta (... e si vede! Lol) che devo ricorrere al VBA, e devo dire che è davvero soddisfacente.
Un grazie pieno di stima per Cromagno ed anche ad Alfredo per la disponibilità.
Non mancherò di chiedere qualche consiglio in futuro.
Nel frattempo auguro buon lavoro a tutti!
di Bruno (utente non iscritto) data: 11/01/2016 11:15:02
ciao a tutti, sono Bruno
non so se devo aprire una nuova discussione, ma ho aperto l'ultimo file di Cromagno per un caso molto simile ma più semplice
anch io ho dei cicli di celle ripetitivi di 31 celle che iniziano dalla riga 40 anzichè 53. nel file di esempio ...3rd io vorrei soltanto che nel momento in cui la cella gialla è compilata con qualsiasi valore si bloccassero sia la cella gialla che quelle verdi di quel ciclo
posso chiedere un aiuto? grazie per ogni consiglio
Vuoi Approfondire?