Blocco celle condizionale

Anonimo
2011-04-04T12:40:42+00:00

Ciao a tutti, ho un quesito da esporvi. Non sono praticissimo di vba, e non sono riuscito ad adattare il codice che segue fra 3 colonne adiacenti.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    With Target

        If .Address = "$D$2" Then

            If UCase(Me.Range("C2").Value) <> "SI" Then

                MsgBox "Impossibile utilizzare la cella."

                Me.Range("C2").Select

            End If

        End If

    End With

End Sub

Mi spiego meglio... ho tre range A5:A, B5:B e C5:C. In una cella appartenente alla colonna A, ho quattro parametri selezionabili. In funzione della mia scelta, ovvero di una delle mie opzioni possibili nella colonna A, devo bloccare la corrispondente cella adiacente della colonna B e liberare la colonna C, oppure vice versa se seleziono un altro parametro nella colonna A.

Mi spiego nel caso con un esempio:

Nella cella A10 ed ho le seguenti opzioni possibili:

SI

NO

NI

Se seleziono SI, vorrei che la B10 sia bloccata da scrittura e C10 libera per potervi scrivere

Se seleziono NO, vorrei invece che fosse la cella C10 disponibilie per la scrittura, e bloccata la B10.

QUesto va ragionato su tutto un range, e range adiacenti.

Come adatto quel codice alla mia situazione? Grazie per l'aiuto in anticipo.

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

Anonimo
2011-04-07T07:16:54+00:00

Grazie davvero per la spiegazione. Sei stato davvero gentilissimo e chiarissimo.

Per quanto riguarda il convalida dati, purtroppo sono già abbastanza intrecciato con il convalida dati INDIRETTO(), e nonostante i tentativi non ho ancora trovato soluzione valida, perciò volevo procedere con macro o foglio protetto.

Non vorrei approfittare troppo della tua bontà, ma posso chiederti di aggiungere qualcosa alla macro che:

  1. nel caso cambiassi l'opzione SI o NO nella cella di "controllo", mi cancelli il contenuto della cella che poi va ad essere "protetta" ovvero che non solo la blocchi, ma ne cancelli anche il contenuto di quello che vi era scritto dentro eventualmente. Ovviamente la procedura dovrebbe essere reversibile con un ctrl-z (sbaglio o spesso quando si fa girare una macro non è più possibile ritornare indietro, oppure questo non funziona con una private sub?)
  2. Limitare l'intera colonna ad un range che potrebbe essere E5:E.

Grazie tantissimo.

Non ho capito a cosa ti riferirsci con *convalida dati indiretto*.

Prova questo:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range

    Set rng = Me.Range("E5:G10")

    If Target.Cells.Count < 1 Or Not Intersect(Target, rng) Is Nothing Then

     With Target

         Select Case .Column

                 Case 6

                     If UCase(.Offset(0, -1).Value) = "SI" Then

                         .Offset(0, 1).Select

                         '.Value = ""

                     End If

                 Case 7

                     If UCase(.Offset(0, -2).Value) = "NO" Then

                         .Offset(0, -1).Select

                         '.Value = ""

                     End If

                 Case 5

                    If UCase(.Value) = "NO" Then

                        .Offset(0, 1).Value = ""

                    ElseIf UCase(.Value) = "SI" Then

                        .Offset(0, 2).Value = ""

                    End If

             End Select

     End With

    End If

    Set rng = Nothing

End Sub

Qui considero il Range E5:G10. Ci sono due commenti. Prova a toglierli e a vedere quale soluzione preferisci.

Una volta eseguito del codice, non hai la possibilità di *tornare indietro*. Dovresti gestire tu il *prima ed il dopo*. Non è così semplice.

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2011-04-06T20:23:04+00:00

    Grazie davvero per la spiegazione. Sei stato davvero gentilissimo e chiarissimo.

    Per quanto riguarda il convalida dati, purtroppo sono già abbastanza intrecciato con il convalida dati INDIRETTO(), e nonostante i tentativi non ho ancora trovato soluzione valida, perciò volevo procedere con macro o foglio protetto.

    Non vorrei approfittare troppo della tua bontà, ma posso chiederti di aggiungere qualcosa alla macro che:

    1. nel caso cambiassi l'opzione SI o NO nella cella di "controllo", mi cancelli il contenuto della cella che poi va ad essere "protetta" ovvero che non solo la blocchi, ma ne cancelli anche il contenuto di quello che vi era scritto dentro eventualmente. Ovviamente la procedura dovrebbe essere reversibile con un ctrl-z (sbaglio o spesso quando si fa girare una macro non è più possibile ritornare indietro, oppure questo non funziona con una private sub?)
    2. Limitare l'intera colonna ad un range che potrebbe essere E5:E.

    Grazie tantissimo.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2011-04-06T07:34:05+00:00
    1. Come posso adattarla ad atre posizioni? Per adesso tutto ciò mi funziona soltanto nella colonna A, ma se volessi partire dalla colonna E? Non capisco quale/i paratro dovrei andare a modificare per adattarla alla colonna "test"
    2. L'offset .Offset(0, 1).Select ho capito come funziona, ovvero ti reindirizza alla cella con l'offset che gli indichi (riga, colonna), ma la stringa UCase(.Offset(0, -1).Value) non ho proprio capito come funzion. Me la illustresresti brevemente?

    Soluzione foglio protetto

    Nel caso volessi procedere con un foglio protetto (il che mi starebbe anche bene) come faccio a settare delle celle bloccate ma solo a patto che si verifichino determinate condizioni? Ovvero quelle che ti ho detto sopra? Cioè, supponiamo di avere la cella E5 (ovviamente il discorso varrebbe per tutta la colonna E) in cui gli unici parametri settabili siano "SI" o "NO". Come faccio a far capire ad excel che se il valore nella cella E5 è "SI" mi deve impedire di inputare parametri nella cella F5, e se E5="NO" mi deve impedire invece di inputare parametri nella cella G5?

    Grazie mille per la disponibilità.

    Ti commento il codice passo passo:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        With Target

            'se sto modificando più celle esco dalla Sub

            '(questo evita errori se cancelli il

            'contenuto di più celle contemporaneamente)

            If .Cells.Count > 1 Then Exit Sub

            'verifico in quale colonna è la cella che

            'stai modificando

            Select Case .Column

                'se è la colonna 2(la B)

                Case 2

                    'verifico il valore della cella che si trova

                    'sulla stessa riga(0) una colonna a sx(-1),

                    'cioè la A; per evitare errori eventuali dati

                    'da si, Si, sI, SI, tramite UCase(vedi guida del vb)

                    'faccio un confronto fra il contenuto della cella

                    '*trasformato* tutto maiuscolo con la stringa SI

                    If UCase(.Offset(0, -1).Value) = "SI" Then

                        'nel caso il confronto sia positivo

                        'seleziono la cella a dx(in pratica impedisco

                        'di scrivere)

                        .Offset(0, 1).Select

                    End If

                'se invece la colonna è la 3

                Case 3

                    'verifico il valore della cella che si trova

                    'sulla stessa riga(0) due colonne a sx(-2),

                    'cioè la A; per evitare errori eventuali dati

                    'da no, No, nO, NO, tramite UCase(vedi guida del vb)

                    'faccio un confronto fra il contenuto della cella

                    '*trasformato* tutto maiuscolo con la stringa NO

                    If UCase(.Offset(0, -2).Value) = "NO" Then

                        'nel caso il confronto sia positivo

                        'seleziono la cella a sx(in pratica impedisco

                        'di scrivere)

                        .Offset(0, -1).Select

                    End If

                'nel caso tu abbia bisogno si ulteriori condizioni

                Case Else

                    'quello che vuoi tu

            End Select

        End With

     End Sub

    Se le colonne interessate non sono A, B, C ma E, F, G devi solo modificare i riferimenti: 2 con 6 e 3 con 7. Nel caso siano A, F, G oltre a modificare 2 con 6 e 3 con 7 devi anche modificare:

    If UCase(.Offset(0, -1).Value) = "SI" Then

    con

     If UCase(.Offset(0, -5).Value) = "SI" Then

    e

    If UCase(.Offset(0, -2).Value) = "NO" Then

    con

    If UCase(.Offset(0, -6).Value) = "NO" Then

    Se non hai esigenze particolari, inutie complicare le cose aggiungendo la gestione della protezione del foglio.

    Ti ricordo che esiste anche la Convalida dati:  http://office.microsoft.com/it-it/excel-help/applicare-la-convalida-dei-dati-alle-celle-HP010072600.aspx#BM4_7

    Tornando alle colonne A, B, C ad esempio:

    1. Seleziona la colonna B
    2. Scheda Dati
    3. Convalida Dati
    4. In Consenti seleziona Personalizzato
    5. In Formula inserisci:  =SE(A1<>"SI";VERO;FALSO)
    6. Ok
    7. Seleziona la colonna C
    8. Ripeti i punti da 2 a 4
    9. In Formula inserisci: =SE(A1<>"NO";VERO;FALSO)
    10. Seleziona la colonna A
    11. Ripeti i punti 2 e 3
    12. In Consenti seleziona Elenco
    13. In Origine inserisci: SI; NO

    Vedi al link indicato sopra per le altre funzionalità della Convalida dati.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-04-05T21:02:21+00:00

    Grazie per la celere risposta.

    Sto testando la macro da te consigliata ma ho delle domande da fare, ma prima di poterle, ti chiederei un consiglio prima di tutto sul come procedere, ovvero se col foglio protetto o con la macro.

    Soluzione con VBA

    Vorrei applicarla al mio caso reale, ma non capisco alcune cose:

    1. Come posso adattarla ad atre posizioni? Per adesso tutto ciò mi funziona soltanto nella colonna A, ma se volessi partire dalla colonna E? Non capisco quale/i paratro dovrei andare a modificare per adattarla alla colonna "test"
    2. L'offset .Offset(0, 1).Select ho capito come funziona, ovvero ti reindirizza alla cella con l'offset che gli indichi (riga, colonna), ma la stringa UCase(.Offset(0, -1).Value) non ho proprio capito come funzion. Me la illustresresti brevemente?

    Soluzione foglio protetto

    Nel caso volessi procedere con un foglio protetto (il che mi starebbe anche bene) come faccio a settare delle celle bloccate ma solo a patto che si verifichino determinate condizioni? Ovvero quelle che ti ho detto sopra? Cioè, supponiamo di avere la cella E5 (ovviamente il discorso varrebbe per tutta la colonna E) in cui gli unici parametri settabili siano "SI" o "NO". Come faccio a far capire ad excel che se il valore nella cella E5 è "SI" mi deve impedire di inputare parametri nella cella F5, e se E5="NO" mi deve impedire invece di inputare parametri nella cella G5?

    Grazie mille per la disponibilità.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2011-04-04T13:31:20+00:00

    Ciao a tutti, ho un quesito da esporvi. Non sono praticissimo di vba, e non sono riuscito ad adattare il codice che segue fra 3 colonne adiacenti.

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        With Target

            If .Address = "$D$2" Then

                If UCase(Me.Range("C2").Value) <> "SI" Then

                    MsgBox "Impossibile utilizzare la cella."

                    Me.Range("C2").Select

                End If

            End If

        End With

    End Sub

    Mi spiego meglio... ho tre range A5:A, B5:B e C5:C. In una cella appartenente alla colonna A, ho quattro parametri selezionabili. In funzione della mia scelta, ovvero di una delle mie opzioni possibili nella colonna A, devo bloccare la corrispondente cella adiacente della colonna B e liberare la colonna C, oppure vice versa se seleziono un altro parametro nella colonna A.

    Mi spiego nel caso con un esempio:

    Nella cella A10 ed ho le seguenti opzioni possibili:

    SI

    NO

    NI

    Se seleziono SI, vorrei che la B10 sia bloccata da scrittura e C10 libera per potervi scrivere

    Se seleziono NO, vorrei invece che fosse la cella C10 disponibilie per la scrittura, e bloccata la B10.

    QUesto va ragionato su tutto un range, e range adiacenti.

    Come adatto quel codice alla mia situazione? Grazie per l'aiuto in anticipo.

    Per *bloccare* una cella, il foglio deve essere protetto. Una alternativa:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        With Target

            If .Cells.Count > 1 Then Exit Sub

            Select Case .Column

                    Case 2

                        If UCase(.Offset(0, -1).Value) = "SI" Then

                            .Offset(0, 1).Select

                        End If

                    Case 3

                        If UCase(.Offset(0, -2).Value) = "NO" Then

                            .Offset(0, -1).Select

                        End If

                    Case Else

                        'quello che vuoi tu

                End Select

        End With

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento