Discussione:
Elenco di convalida dati da colonna con contenuto univoco
(troppo vecchio per rispondere)
Pico1965
2017-12-14 10:33:57 UTC
Permalink
Rieccomi con un altro quesito:
In colonna A
Nero
Rosso
verde
rosso
ecc ecc
Nella cella b1 vorrei mettere una convalida dati da elenco che leggendo nella colonna A mi riporti i solo valori univoci.

Il goal sarebbe quindi che nella tendina apparissero solamente:
Nero
Rosso
Verde

Grazie sempre per l'aiuto
casanmaner
2017-12-14 12:43:30 UTC
Permalink
Post by Pico1965
In colonna A
Nero
Rosso
verde
rosso
ecc ecc
Nella cella b1 vorrei mettere una convalida dati da elenco che leggendo nella colonna A mi riporti i solo valori univoci.
Nero
Rosso
Verde
Grazie sempre per l'aiuto
Qui ci vorrebbe l'internto del mago delle formule Paoloard.
Ma credo che occorra appoggiarsi ad una colonna d'appoggio per creare un elenco, ordinato o meno, univoco per poi far puntare la convalida, magari in maniera "dinamica", a quella colonna.
Qui trovi degli esempi di formule per restiture elenchi univoci
https://sites.google.com/site/e90e50fx/home/restituire-elenco-univoco-ordinato-o-non-ordinato
x***@gmail.com
2017-12-15 10:06:10 UTC
Permalink
Post by casanmaner
Post by Pico1965
In colonna A
Nero
Rosso
verde
rosso
ecc ecc
Nella cella b1 vorrei mettere una convalida dati da elenco che leggendo nella colonna A mi riporti i solo valori univoci.
Nero
Rosso
Verde
Grazie sempre per l'aiuto
Qui ci vorrebbe l'internto del mago delle formule Paoloard.
Ma credo che occorra appoggiarsi ad una colonna d'appoggio per creare un elenco, ordinato o meno, univoco per poi far puntare la convalida, magari in maniera "dinamica", a quella colonna.
Qui trovi degli esempi di formule per restiture elenchi univoci
https://sites.google.com/site/e90e50fx/home/restituire-elenco-univoco-ordinato-o-non-ordinato
Sono d'accordo con te. Senza colonna d'appoggio dove estrarre i dati univoci non credo sia possibile. Salvo utilizzare una macro ma, in questo caso, l'esperto sei tu.
ciao paoloard
casanmaner
2017-12-15 10:30:30 UTC
Permalink
Post by x***@gmail.com
Post by casanmaner
Post by Pico1965
In colonna A
Nero
Rosso
verde
rosso
ecc ecc
Nella cella b1 vorrei mettere una convalida dati da elenco che leggendo nella colonna A mi riporti i solo valori univoci.
Nero
Rosso
Verde
Grazie sempre per l'aiuto
Qui ci vorrebbe l'internto del mago delle formule Paoloard.
Ma credo che occorra appoggiarsi ad una colonna d'appoggio per creare un elenco, ordinato o meno, univoco per poi far puntare la convalida, magari in maniera "dinamica", a quella colonna.
Qui trovi degli esempi di formule per restiture elenchi univoci
https://sites.google.com/site/e90e50fx/home/restituire-elenco-univoco-ordinato-o-non-ordinato
Sono d'accordo con te. Senza colonna d'appoggio dove estrarre i dati univoci non credo sia possibile. Salvo utilizzare una macro ma, in questo caso, l'esperto sei tu.
ciao paoloard
Per quello che so io, anche creando una funzione che restituisca direttamente una matrice di valori, poi la convalida non restituirebbe l'elenco.
Alla fine occorrerebbe sempre riportare in un intervallo di celle la matrice di valori e far puntare la convalida a quell'intervallo.
x***@gmail.com
2017-12-15 15:40:16 UTC
Permalink
Il giorno venerdì 15 dicembre 2017 11:30:32 UTC+1, casanmaner ha scritto:
...> Per quello che so io, anche creando una funzione che restituisca direttamente una matrice di valori, poi la convalida non restituirebbe l'elenco.
Post by casanmaner
Alla fine occorrerebbe sempre riportare in un intervallo di celle la matrice di valori e far puntare la convalida a quell'intervallo.
Quindi, soluzione, colonna d'appoggio.
Ciao paoloard
casanmaner
2017-12-15 17:35:06 UTC
Permalink
Post by x***@gmail.com
...> Per quello che so io, anche creando una funzione che restituisca direttamente una matrice di valori, poi la convalida non restituirebbe l'elenco.
Post by casanmaner
Alla fine occorrerebbe sempre riportare in un intervallo di celle la matrice di valori e far puntare la convalida a quell'intervallo.
Quindi, soluzione, colonna d'appoggio.
Ciao paoloard
Se proprio si volesse utilizzare il VBA, e anche qualcosa in più rispetto al solo VBA, si potrebbe pensare ad una funzione che restituisca, in base alla posizione, la lista ordinata, guadagnando tempo in termini di ricalcolo, rispetto anche alla più veloce delle formule "native" di cui agli esempi del link.

Facendo una prova su di una lista di 4.000 righe con presenti 26 valori univoci nel mio pc a ricalcolare le 26 righe, dove ho inserito le formule per ottenere i 26 valori univoci, con la fuzione "vba" e con le formule native, c'è una differenza di circa 20" a favore di quella vba.

Se volete provate questo file dove nel modulo1 è presente una funzione ListaUnicaOrdinata e una routine dove, alternativamente, provare il ricalcolo, dopo che il calcolo è ipostato su manuale, delle celle dove ho inserito le funzione vba e le funzioni native.

'---
Function ListaUnicaOrdinata(IntervalloCelle As Range, Posizione As Long) As Variant
Dim i As Variant
Dim arr As Variant
Dim iCount As Long
Dim oSortedArrayList As Object
Set oSortedArrayList = CreateObject("System.Collections.ArrayList")
arr = IntervalloCelle.Value
With oSortedArrayList
For Each i In arr
If i <> vbNullString Then
If Not .contains(i) Then .Add CStr(i)
End If
Next
.Sort
arr = .ToArray
iCount = .Count
End With
If Posizione > iCount Then
ListaUnicaOrdinata = vbNullString
Else
ListaUnicaOrdinata = arr(Posizione - 1)
End If
End Function
casanmaner
2017-12-16 13:56:51 UTC
Permalink
Post by x***@gmail.com
...> Per quello che so io, anche creando una funzione che restituisca direttamente una matrice di valori, poi la convalida non restituirebbe l'elenco.
Post by casanmaner
Alla fine occorrerebbe sempre riportare in un intervallo di celle la matrice di valori e far puntare la convalida a quell'intervallo.
Quindi, soluzione, colonna d'appoggio.
Ciao paoloard
Se proprio non si volesse la colonna d'appoggio si potrebbe inserire, tramite VBA, l'elenco delle voci (es. verde;giallo;rosso) all'interno del campo origine dell'elenco.
Occorrerebbe sfruttare l'evento worksheetchange in modo che nel caso vengano inserite nuove voci, venga creata una nuova lista di voci uniche e riscrivendo la convalida di quella cella o intervallo di celle.
casanmaner
2017-12-17 14:04:42 UTC
Permalink
Post by casanmaner
Post by x***@gmail.com
...> Per quello che so io, anche creando una funzione che restituisca direttamente una matrice di valori, poi la convalida non restituirebbe l'elenco.
Post by casanmaner
Alla fine occorrerebbe sempre riportare in un intervallo di celle la matrice di valori e far puntare la convalida a quell'intervallo.
Quindi, soluzione, colonna d'appoggio.
Ciao paoloard
Se proprio non si volesse la colonna d'appoggio si potrebbe inserire, tramite VBA, l'elenco delle voci (es. verde;giallo;rosso) all'interno del campo origine dell'elenco.
Occorrerebbe sfruttare l'evento worksheetchange in modo che nel caso vengano inserite nuove voci, venga creata una nuova lista di voci uniche e riscrivendo la convalida di quella cella o intervallo di celle.
Propongo un esempio di quello che intendevo.
Nel modulo VBA del Foglio1:
'---
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo VbaError
With Target.Cells(1, 1)
If .Column = 1 And .Row >= 2 Then
Call ImpostaConvalide
End If
End With
ResumeVbaError:
Application.EnableEvents = True
Exit Sub
VbaError:
MsgBox "Errore " & Err.Number & vbCrLf & _
Err.Description, vbCritical, "VBA Error"
Resume ResumeVbaError
End Sub
'---

Nel modulo standard Modulo2:
'---
Option Explicit

Sub ImpostaConvalide()
Dim Twb As Workbook
Const sWsOrigineDati As String = "Foglio1"
Const sFrngOD As String = "A1"
Const sWsConvalide As String = "Foglio1"
Const sRngConvalide As String = "C2"
Dim rngOD As Range
Dim arrListaUnica As Variant
Dim strListaUnica As String
Dim rngConvalide As Range
Set Twb = ThisWorkbook
With Twb
With .Worksheets(sWsOrigineDati)
Set rngOD = GetRange(.Range(sFrngOD), True)
End With
End With
If Not rngOD Is Nothing Then
arrListaUnica = ListaUnicaOrdinataArray(rngOD)
strListaUnica = Join(arrListaUnica, ",")
End If
With Twb
With .Worksheets(sWsConvalide)
Set rngConvalide = .Range(sRngConvalide)
With rngConvalide
With .Validation
.Delete
If strListaUnica <> "" Then
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=strListaUnica
Else
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=" "
End If
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = "Voce non amessa!"
.InputMessage = ""
.ErrorMessage = "Inserire una voce dall'elenco a discesa presente nella cella!"
.ShowInput = False
.ShowError = True
End With
End With
End With
End With
End Sub

Function ListaUnicaOrdinataArray(IntervalloCelle As Range) As Variant
Dim i As Variant
Dim arr1 As Variant
Dim arr2() As Variant
Dim NumRow As Long
Dim oSortedArrayList As Object
Dim str As String
arr1 = IntervalloCelle.Value
NumRow = IntervalloCelle.Rows.Count
ReDim arr2(1 To NumRow)
Set oSortedArrayList = CreateObject("System.Collections.ArrayList")
If NumRow = 1 Then
arr2(1) = arr1
Else
For i = 1 To NumRow
arr2(i) = arr1(i, 1)
Next i
End If
With oSortedArrayList
For Each i In arr2
If i <> vbNullString Then
str = i
If Not .contains(str) Then .Add str
End If
Next
.Sort
ListaUnicaOrdinataArray = .ToArray
End With
End Function

'========================
Function GetRange(PrimaCellaDati As Range, _
Optional bRigaIntestazioni As Boolean = True, _
Optional bColonnaIntestazioni As Boolean = False, _
Optional sPassword As String = "") As Range
'funzione che imposta un intervallo di celle in base alla
'prima cella dell'intervallo passata nell'argomento "PrimaCellaDati"
'bRigaIntestazioni se True, valore predefinito, imposta la prima riga
'come intestazioni di colonna e assume come intervallo dati i dati a
'partire dalla riga successiva
'bColonnaIntestazioni se True, valore predifinito False, imposta la prima
'colonna come intestazioni di riga e assucem come intervanno dati i dati a
'partire dalla colonna successiva
'se il foglio è protetto da una pw inserire come argomento sPassword la
'la passoword di protezione del foglio
Dim Ws As Worksheet
Dim bProtected As Boolean
Dim OffsetRiga As Long, OffsetColonna As Long
Dim ResizeRighe As Long, ResizeColonne As Long
Set Ws = PrimaCellaDati.Parent
With Ws
bProtected = .ProtectContents
If bProtected Then .Unprotect Password:=sPassword
End With
With PrimaCellaDati
If bRigaIntestazioni Then OffsetRiga = 1
If bColonnaIntestazioni Then OffsetColonna = 1
With .CurrentRegion
ResizeRighe = .CurrentRegion.Rows.Count - OffsetRiga
ResizeColonne = .CurrentRegion.Columns.Count - OffsetColonna
End With
On Error Resume Next
Set GetRange = .Resize(ResizeRighe, ResizeColonne).Offset(OffsetRiga, OffsetColonna)
On Error GoTo 0
End With
If bProtected Then Ws.Protect Password:=sPassword ', UserInterfaceOnly:=False
End Function
'---

In Foglio1 se si aggiunge o elimina una voce sotto l'intestazione "Elenco Voci" la convalida presente in C1 viene aggiornata.
Nel caso non ci fossero voci la convalida conterrà uno "spazio" non consentendo l'inserimento di alcun valore fino a che non venga inserito un valore in colonna 1 andandosi a popolare l'elenco della convalida.
Questo il file di esempio:
https://www.dropbox.com/s/fd80kd3rqfi7qgu/Elenco%20di%20convalida%20dati%20da%20colonna%20con%20contenuto%20univoco.xlsm?dl=0
casanmaner
2017-12-17 14:10:46 UTC
Permalink
Questa parte
---------
'bColonnaIntestazioni se True, valore predifinito False, imposta la prima
'colonna come intestazioni di riga e assucem come intervanno dati i dati a
'partire dalla colonna successiva
---------


la dovrò riscrivere :)
Pico1965
2017-12-19 08:35:07 UTC
Permalink
Post by x***@gmail.com
...> Per quello che so io, anche creando una funzione che restituisca direttamente una matrice di valori, poi la convalida non restituirebbe l'elenco.
Post by casanmaner
Alla fine occorrerebbe sempre riportare in un intervallo di celle la matrice di valori e far puntare la convalida a quell'intervallo.
Quindi, soluzione, colonna d'appoggio.
Ciao paoloard
Grazie ragazzi.
Proverò questa soluzione
Pico1965
2017-12-19 09:59:28 UTC
Permalink
Post by casanmaner
Post by Pico1965
In colonna A
Nero
Rosso
verde
rosso
ecc ecc
Nella cella b1 vorrei mettere una convalida dati da elenco che leggendo nella colonna A mi riporti i solo valori univoci.
Nero
Rosso
Verde
Grazie sempre per l'aiuto
Qui ci vorrebbe l'internto del mago delle formule Paoloard.
Ma credo che occorra appoggiarsi ad una colonna d'appoggio per creare un elenco, ordinato o meno, univoco per poi far puntare la convalida, magari in maniera "dinamica", a quella colonna.
Qui trovi degli esempi di formule per restiture elenchi univoci
https://sites.google.com/site/e90e50fx/home/restituire-elenco-univoco-ordinato-o-non-ordinato
Non so se la pagina che mi hai segnalato sia "tua" o di altra persona.
Ho fatto delle prove ed ho trovato un "problemino"
Ritengo fare cosa utile segnalarla (magari tuo tramite) all'autore.
Ho preso in considerazione solo il caso del testo ordinato.
La mia necessità era quella di dinamicizzare la base dati con la solita formula.
Tutto ha funzionato perfettamente fino a quando mi sono accorto che qualora la base dati sia composta da un solo record, delle tre formule proposte, solamente la terza funziona.
Capisco che è una situazione alquanto residuale ma penso sia utile segnalarla comunque.
Allego esempio.
https://www.dropbox.com/s/49d9xp3m44d7smp/Elenco_univoco_ordinato_e_non_ordinato_.xlsx?dl=0

Grazie sempre dell'attenzione.

Loading...