convalida dati condizionale



  • convalida dati condizionale
    di lucippo (utente non iscritto) data: 26/04/2013 15:51:35

    Ciao a tutti,
    ho un foglio excel in cui in colonna B ho un elenco convalida dati che fa riferimento ad un nome definito (Tipo) ed in colonna C ho di nuovo un elenco convalida dati che fa riferimento ad un altro nome definito (Lavoro).
    Si possono selezionare in ogni singola cella dal menu a tendina in colonna B, 7 tipi differenti, cosi come si possono selezionare dal menu a tendina nelle celle di colonna C tanti diversi valori.
    C'è solo un caso in cui SE in una qualsiasi cella di colonna B viene selezionato il valore "Nuovo", allora la convalida dati, ed il relativo menu a tendina nella cella di colonna C deve essere rimosso (validation.delete).
    dovrei fare in modo che quando si seleziona "Nuovo" in colonna B, la cella in colonna C non mostri alcun menu a tendina, mentre se viene selezionato qualsiasi altro valore diverso da "Nuovo", venga mostrato il menu a tendina in colonna C.
    Questo deve accadere anche quando una persona sceglie prima "Nuovo"(-->no menu in colonna C) e poi scegli un altro valore (-->menu in colonna C).

    Ho fatto diversi tentativi con inserendo il codice in "worksheet_selectionchange(ByVal target as range) ma non riesco a farlo funzionare come dovrebbe!!



  • di totygno71 (utente non iscritto) data: 27/04/2013 14:58:08

    Ciao Lucippo
    prova il codice sotto... se ho inteso cosa vuoi raggiungere dovrebbe essere giusto!

    ciao!


     
    Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, Range("B:B")) Is Nothing And Target.Value = "Nuovo" Then
       [C:C].Validation.Delete
    Else
    [C:C].Select
    With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Lavoro"
            .IgnoreBlank = True
    
    End With
    End If
    [A1].Select
    
    End Sub
    



  • di lucippo (utente non iscritto) data: 27/04/2013 15:20:18

    Grazie, ma non è esattamente quello che mi serve.
    Il tuo codice cancella la convalida su tutta la colonna C! invece deve cancellare la convalida dati solo nella cella di colonna C che corrisponde alla cella in colonna B che ha il valore=Nuovo.
    Del tipo:
    if cell.value="Nuovo" then cell.offset(0,1).validation.delete
    Else cell.offset(0,1).validation
    Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Lavoro"
    .IgnoreBlank = True
    end if



  • di totygno71 data: 27/04/2013 15:35:04

    Più semplice ancora allora_
    Ciao
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, Range("B:B")) Is Nothing And Target.Value = "Nuovo" Then
       Target.Offset(0, 1).Validation.Delete
    Else
    End If
    
    End Sub
    



  • di lucippo (utente non iscritto) data: 27/04/2013 16:00:58

    facile...eppure non funziona
    non riesco a capire perché con il seguente codice quando seleziono "Nuovo" in cella in colonna B, l'elenco dati appare nella cella in colonna successiva (C)! non dovrebbe! cosa c'è di sbagliato???


     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B:B")) Is Nothing And Target.Value = "Nuovo" Then
       Target.Offset(0, 1).Validation.Delete
    Else
    With Target.Offset(0, 1).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Lavoro"
            .IgnoreBlank = True
    
    End With
    End If
    End Sub



  • di totygno71 data: 27/04/2013 16:04:34

    Non funziona la seconda soluzione proposta da me?



  • di Lucippo (utente non iscritto) data: 27/04/2013 23:32:59

    No,non funziona purtroppo. Prova anche te a copiare il codice qui sopra e fare un test, previa creazione degli elenchi convalida dati ovviamente



  • di Vecchio Frac data: 28/04/2013 09:34:02

    cit. " previa creazione degli elenchi convalida dati"
    ---> Solitamente quando si chiedono esempi con file già fatti è per evitare di costringere chi risponde a un quesito di doversi ricostruire lo scenario, magari sbagliando perchè non corrisponde al progetto iniziale e perdendo quindi tempo prezioso. In molti forum addirittura non si risponde a nessun quesito che obbliga l'interlocutore a doversi riprodurre la situazione del richiedente. Qui siamo più elastici... ma Lucippo, sarebbe gradito che fornissi tu un esempio di file già fatto, sul quale totygno e chiunque altro possa fare delle prove sul campo. Rischi altrimenti di rimanere senza risposta :)





  • di totygno71 data: 28/04/2013 09:35:14

    Ciao
    provata e riprovata
    funziona perfettamente...
    il codice lo devi inserire nel foglio di lavoro che utilizzi (esempio foglio1)

    Ti restituisce un errore o non ottieni il risultato voluto?
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, Range("B:B")) Is Nothing And Target.Value = "Nuovo" Then
       Target.Offset(0, 1).Validation.Delete
    Else
    End If
    
    End Sub



  • di lucippo (utente non iscritto) data: 28/04/2013 15:35:20

    @Vecchio Frac, hai ragione, scusatemi. In allegato il file con in foglio1, il codice

    @totygno71, grazie per il test, ma non riesco proprio a capire come ti possa funzionare
    il mio non funziona, non ottengo il risultato voluto. nel file allegato se seleziono "Nuovo" in colonna B, la lista nella convalida dati nella cella in colonna C appare....invece non dovrebbe apparire quando "Nuovo" è selezionato in una cella di colonna B.
    Aiutooo!! ad ogni modo grazie mille per gli sforzi a trovare una soluzione...o a farmi capire ciò che sbaglio io



  • di lucippo (utente non iscritto) data: 28/04/2013 15:37:59

    nooooooo!!!! eureka!
    ho capito!!!! sbaglio nel mettere "nuovo" invece che "Nuovo"!!!
    ora funziona, avrei dovuto utilizzare UCase()



  • di lucippo (utente non iscritto) data: 28/04/2013 15:39:38

    ho uploadato il file che funziona
    buona domenica a tutti!



  • di totygno71 data: 28/04/2013 16:24:03

    OK
    Alla prossima! ^_^



  • di Vecchio Frac data: 28/04/2013 16:41:37

    cit. "And Target.Value = "Nuovo"
    ---> Sempre meglio prevedere quello che l'utente può selezionare, nel modo preciso.
    Di solito si effettua un confronto con una stringa tutta minuscola per evitare errori di immissione:
    ... And LCase(Target) = "nuovo"
    Questo farà funzionare il codice anche se scrivi "NUOVO" o "NUovo".