validazione fino allultima cella
Hai un problema con Excel? 
di Vecchio Frac data: 09/04/2014 20:34:12
Una soluzione senza scomodare VBA.
Considera foglio1 come depositario del range dinamico che contiene un elenco di voci, chiamiamole CATEGORIA.
Considera foglio2 come foglio di lavoro, in cui alcune celle con convalida pescheranno i dati dal range dinamico definito nel foglio1.
In foglio1, A1 scrivi "CATEGORIA".
In foglio1, da A2 in giù scrivi alcune voci, per esempio "casa", "macchina", "condominio", luce".
Adesso dal menu Inserisci > Nome > Definisci scrivi il nome "categoria" che si riferisce a questa formula:
=SCARTO(foglio1!$A$2;;;CONTA.VALORI(foglio1!$A:$A)-1)
In foglio2 seleziona per esempio A2:A5 e impostane la convalida dati: Dati > Convalida > Consenti: Elenco, Origine: =categoria.
E' tutto qui.
Se selezioni in foglio A2 una cella tra A2 e A5 il menu a discesa ti consente uno dei valori dell'elenco CATEGORIA del foglio1; se aggiungi o togli voci a quell'elenco queste si troveranno automaticamente nella convalida dati senza bisogno di fare nient'altro. Unica raccomandazione è quella di evitare righe vuote nel range "categoria" (la formula andrebbe aggiustata di conseguenza).
di Baoab (utente non iscritto) data: 09/04/2014 21:05:15
ciao e grazie intanto,
il fatto è che a me serviva come codice vba poiché sta dentro una macro e quindi per caso posso provare a trasformare il tuo codice con registra macro per vedere come diventa in vba?
Grazie!!
di Vecchio Frac data: 09/04/2014 21:18:35
Non serve, ragiona su quel parametro:
Formula1:="='work'!$C$2:$c$50"
Devi quindi trovare un modo per estendere il range da C2 a Cqualcosa.
Metodi ce ne sono diversi, prova un po' a studiare come dire a Excel via VBA di recuperare l'ultima riga di una certa colonna (esempi a bizzeffe sparpagliati negli esempi di quasi ogni post che trovi in questi forum).
di Baoab (utente non iscritto) data: 09/04/2014 21:23:53
infatti sto cercando di capire come cambiare quel range, ho fatto prove di tutti i generi ma non riesco a dirgli di prendere dalla cella c2 all'ultima riga
ho provato anche ma non funziona.
formula1:="='work'!" & Range("c2" & lastrow) |
di Vecchio Frac data: 09/04/2014 21:36:36
Uhm,
e "lastrow" da dove salta fuori? Dai che sei quasi sulla strada giusta (devi definire "lastrow" e comunque è tutta una stringa, non mescolare testo e similformula).
di Baoab (utente non iscritto) data: 09/04/2014 21:49:28
ma quindi con il lastrow sono sulla strada giusta oppure devo pensare ad altro?
di Vecchio Frac data: 09/04/2014 21:54:27
Sì, sei sulla strada giusta.
Solo che non esiste una funzione incorporata che restituisce l'ultima riga di un range, devi costruirla tu.
Inoltre ti faccio notare che il parametro Formula1 del metodo Validation dell'oggetto Range (Selection è un tipo speciale di Range) vuole una stringa, non un altro Range.
Spero di non essere riuscito a confonderti :)
di Vecchio Frac data: 09/04/2014 22:02:02
p.s. la convalida viene accettata se i dati risiedono sul foglio della cella che deve contenere la convalida. Quindi "'work'" eccetera non funzionerà.
di Vecchio Frac data: 09/04/2014 22:03:19
Una bella funzione per trovare l'ultima riga valorizzata di un range è la seguente.
Function LastRow(rng As Range) As Long
'Finds the last used row on a worksheet
Dim rngFind As Range
Set rngFind = rng.Find(What:="*", _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
If Not rngFind Is Nothing Then
LastRow = rngFind.Row
Else
LastRow = 0 'rngFind is Nothing when worksheet is blank
End If
End Function
|
di Baoab (utente non iscritto) data: 09/04/2014 22:05:03
mhhh...
vorrei dirti di no..ma so che e' la mia poca esperienza e conoscenza di vba che fa si che non capisca
di Vecchio Frac data: 09/04/2014 22:10:28
Adesso hai tutti gli elementi.
Guarda come diventa la tua convalida in VBA (ricordati di scrivere la Function LastRow in un modulo).
In pratica calcola il numero di riga dell'ultima cella valorizzata della colonna C, e costruisce la stringa che Formula1 provvede a inserire nella cella che deve avere la convalida (Selection).
Questa cella, come detto prima, deve trovarsi nello stesso foglio che contiene l'elenco della colonna C, quindi (presumo) nel foglio che hai chiamato "work".
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$C$2:$c$" & LastRow(range("C:C"))
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With |
di Baoab (utente non iscritto) data: 09/04/2014 22:13:18
ora ci provo e ti faccio sapere, grazie tantissime per adesso!
di Baoab (utente non iscritto) data: 09/04/2014 22:35:35
ho messo cosi ma mi da errore ho mica scritto male qualcosa?
Formula1:="='work'!$C$2:$c$" & LastRow(Range("C:C")) |
di Baoab (utente non iscritto) data: 10/04/2014 10:01:55
mhh io ho messo la function in un modulo da sola.
poi in un altro modulo la macro in cui c'è il codice che richiama la function.
invece la cella in cui ci sara la covalida a elenco si trova in un altro foglio, il foglio7
Quindi dal foglio work dovrebbe prendere dalla cella c2 sino all'ultima cella, e poi nel foglio7 c'e' una cella in cui ci sarà questo elenco(quindi formula1 ecc..)
di Baoab (utente non iscritto) data: 10/04/2014 14:13:34
nulla, provato in più modi ma mi da sempre errore , la macro mi esegue la funzione lastrow poi si blocca e da errore come da codice
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="='work'!$C$2:$C$327" & LastRow(Range("C:C")) |
di Baoab (utente non iscritto) data: 10/04/2014 15:50:02
ho provato a definire la variabile e poi a impostarla nella formula, sembra funzionare, pero' non uso ne la funzione ne altro.. puo' andare bene lo stesso o sto sbagliando qualcosa?.. perché mi sembra strano visto che mi era stato consigliato di usare una funzione..
dim
lastrow = Range("c" & Rows.Count).End(xlUp).Row
Formula1:="='work'!$C$2:$c$" & lastrow |
di Vecchio Frac data: 10/04/2014 21:47:34
Rileggi bene i miei interventi. Soprattutto quello di ieri sera delle 22:10.
E' proprio il riferimento al foglio ("work") che non deve essere specificato.
di Baoab (utente non iscritto) data: 10/04/2014 23:16:27
Però la cella di convalida si trova in un altro foglio , ecco perché lo specificavo.
Per quel che riguarda il mio ultimo post quel codice dichiarando la variabile l'astronomia come long ecc può comunque andare bene?
di Vecchio Frac data: 11/04/2014 13:53:31
Il range della convalida, mi risulta che deve stare sullo stesso foglio.
Dim LastRow As Long
LastRow = Range("c" & Rows.Count).End(xlUp).Row
Il codice è corretto e certo è necessario che sia un Long perchè le righe di Excel vanno oltre la capacità dell'integer (che comprende numeri da -32768 a +32768).
cit. "dichiarando la variabile l'astronomia come long"
---> "LastRow >> l'astronomia", il T9 è una bella cosa ma qualche volta produce risultati bizzarri ^_^
di Baoab (utente non iscritto) data: 11/04/2014 19:39:49
Ohi ohi che figura...ecco cosa vuol dire non rileggere i messaggi scritti col tablet
Cmq lo ho su altro foglio ma sicuramente non mi sono fatto capire io bene. Importante che ora funzioni!
Grazie per l' aiuto piano piano mi ci ha fatto arrivare!
Vuoi Approfondire?