| | Post: 7 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 09:50 | |
Unisci testo in cella ma non ripetere (testo.unisci) Salve a tutti.Mi chiedevo se qualcuno di voi sappia come risolvere questo piccolo problema.Ho una cartella con 2 fogli.Dalla convalida dati seleziono un ingrediente dal foglio tabella.Ogni ingrediente ha degli allergeni che riporto accanto a esso.Nel foglio ricetta quando da menu a tendina selezione l'ingrediente mi riporta anche i relativi allergeni.Adesso vorrei che mi desse come risultato tutti gli allergeni contenuti negli ingredienti selezionati ma senza ripetizione.Dei risultati univoci.Ho provato con testo.unisci ma non il risultato che voglio ottenere.
Non ho provato con vba perchè le mie capacità sono a livello base
Grazie [Modificato da ema1990 01/05/2020 09:58] |
|
| | Post: 725 | Registrato il: 15/01/2016
| Città: ROMA | Età: 51 | Utente Senior | 2016 | | OFFLINE |
|
01/05/2020 11:22 | |
Buongiorno
quello che chiedi con le formule è impossibile e dubito fortemente che si possa fare anche col VBA in quanto stai chiedendo di estrarre una lista univoca non di dati contenuti in celle diverse ma delle parole contenute dentro stringhe di testo...
Quindi e parlo di formule (non scrivo codice) una soluzione potrebbe essere modificare il foglio Tabella mettendo ogni allergene in una cella diversa e una volta richiamati questi dati in una tabella di servizio (da nascondere) fare la lista univoca di questi allergeni sempre spalmati su più colonne oppure in una cella unica con TESTO.UNISCI oppure partendo dalle formule che hai in colonna I estrarre le varie parole e poi farne una lista univoca o spalmata su più colonne (scelta consigliata) o con TESTO.UNISCI in singola cella |
| | Post: 7 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 11:37 | |
@DANILOFIORINI grazie per la risposta.Vediamo se in vba si potrebbe fare se qualcuno sa metterci le mani |
| | Post: 726 | Registrato il: 15/01/2016
| Città: ROMA | Età: 51 | Utente Senior | 2016 | | OFFLINE |
|
01/05/2020 11:44 | |
Ciao
solo per curiosità (non conosco il contesto) però perchè trattare i dati in questa maniera andandosi a complicare alla massima potenza il tutto (anche perchè magari si può fare col VBA se poi devi fare qualche manutenzione al codice che eventualmente ti fanno se non si sa dove mettere le mani sarai sempre a dovere chiedere aiuto a qualcuno)
mentre se si gestiscono i dati correttamente cioè una cella un record si riesce ad ottenere con le formule quasi tutto anche perchè e questo è solo un mio pensiero la scelta di mettere dei risultati tutti in singola cella è solo un fatto estetico |
| | Post: 2.751 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 11:59 | |
Ciao
ti faccio un esempio "strettamente legato" (pertanto riferito a quelle sole tre righe) del tuo foglio che stampa in I17 il risultato.
Ovviamente si può rendere dinamico.
saluti
Sub Univoci()
Dim mColl As New Collection
For j = 10 To 12
mstr = mstr & Cells(j, 9) & ","
Next
mstr = Left(mstr, Len(mstr) - 1)
msplit = Split(mstr, ",")
For j = 0 To UBound(msplit)
On Error Resume Next
mColl.Add msplit(j), msplit(j)
On Error GoTo 0
Next j
mstr = ""
For j = 1 To mColl.Count
mstr = mstr & mColl(j) & ","
Next j
mstr = Left(mstr, Len(mstr) - 1)
Range("I17") = mstr
End Sub
[Modificato da dodo47 01/05/2020 12:00] Domenico
Win 10 - Excel 2016 |
| | Post: 8 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 12:03 | |
@DANILOFIORINI
Diciamo che si è pura estetica!!Ti allego un pdf "completo" del lavoro e nella casella allergeni verranno copiati gli allergeni di ciascuno presi da un foglio nascosto! [Modificato da ema1990 01/05/2020 12:06] |
| | Post: 2.752 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 12:12 | |
Ciao
facciamo meglio ed utilizziamo una UDF.
Metti in un modulo:
Function Unisci(rng As Range) As String
Dim mColl As New Collection
For j = 10 To 12
mstr = mstr & Cells(j, 9) & ","
Next
mstr = Left(mstr, Len(mstr) - 1)
msplit = Split(mstr, ",")
For j = 0 To UBound(msplit)
On Error Resume Next
mColl.Add msplit(j), msplit(j)
Next j
mstr = ""
For j = 1 To mColl.Count
mstr = mstr & mColl(j) & ","
Next j
Unisci = Left(mstr, Len(mstr) - 1)
End Function
Poi, dove vuoi il risultato, scrivi:
=unisci(allergeni)
Naturalmente, al posto di allergeni, ci puoi mettere una range qualsiasi (che ovviamente abbia quelle caratteristiche); per esempio:
=unisci(I10:I15)
saluti
[Modificato da dodo47 01/05/2020 12:15] Domenico
Win 10 - Excel 2016 |
| | Post: 9 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 12:16 | |
@dodo47
grazie mille per il codice.Adesso proverò a farlo lavorare in fogli diversi.Allergeni in un foglio e risultato degli univoci in un altro.Grazie |
| | Post: 2.753 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 12:20 | |
occhio che per farlo funzionare su altro foglio bisogna modificare la function
saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 10 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 12:39 | |
@dodo47
alla fine opterò per copiare il risultato"unisci(allergeni)" nella cella della tabella finale di lavoro,meno casini in giro:).
Grazie mille a tutti |
| | Post: 2.754 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 12:42 | |
ciao
non è necessario, come vedi nel foglio Tabella per esempio, in F12 c'è lo stesso risultato, basta una piccola modifica. Vedi allegato
Function Unisci(rng As Range) As String
Dim mColl As New Collection
Set sh = Worksheets(rng.Parent.Name)
For j = 10 To 12
mstr = mstr & sh.Cells(j, 9) & ","
Next
mstr = Left(mstr, Len(mstr) - 1)
msplit = Split(mstr, ",")
For j = 0 To UBound(msplit)
On Error Resume Next
mColl.Add msplit(j), msplit(j)
Next j
mstr = ""
For j = 1 To mColl.Count
mstr = mstr & mColl(j) & ","
Next j
Unisci = Left(mstr, Len(mstr) - 1)
End Function
saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 11 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 14:15 | |
@dodo47
allora ho messo il codice e riadattato alla mia parziale cartella.Nella cartella calcolo ricopia ma non cancella i "doppioni".Penso che il motivo sia che adesso i valori sono tutti in colonna,o sbaglio?
Grazie |
| | Post: 2.756 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 16:10 | |
Ciao
no, il fatto è che hai cambiato il separatore, prima era (,) virgola ora è punto e virgola (;).
Con l'occasione fai una piccola rettifica (ti avevo detto che il codice era "strettamente mirato" al tuo esempio.
Function Unisci(rng As Range) As String
Dim mColl As New Collection
Set sh = Worksheets(rng.Parent.Name)
For j = 2 To rng.Rows.Count
If sh.Cells(j, 1) <> "" Then
mstr = mstr & sh.Cells(j, 1) & ";"
End If
Next
mstr = Left(mstr, Len(mstr) - 1)
msplit = Split(mstr, ";")
For j = 0 To UBound(msplit)
On Error Resume Next
mColl.Add msplit(j), msplit(j)
Next j
mstr = ""
For j = 1 To mColl.Count
mstr = mstr & mColl(j) & ";"
Next j
Unisci = Left(mstr, Len(mstr) - 1)
End Function
Se per caso può capitare che in alcuni fogli il separatore sia "," ed in altri ";" o qualsiasi altro, fammelo sapere che ti faccio inserire oltre il range di calcolo, anche il titpo di separatore.
saluti
[Modificato da dodo47 01/05/2020 16:25] Domenico
Win 10 - Excel 2016 |
| | Post: 12 | Registrato il: 16/04/2020
| Età: 34 | Utente Junior | 2016 | | OFFLINE | |
|
01/05/2020 18:56 | |
@dodo47 grazie mille per la delucidazione. Sei stato gentilissimo.
Saluti |
|
|