VBA Blocco celle condizionato



  • 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