Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Concatena testo in base a diversi criteri

Ultimo Aggiornamento: 14/12/2017 13:23
Post: 1
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 09:17

Buongiorno a tutti,
sono nuovo di questo forum spero di apportare il mio contributo anche se piccolo, ora ho bisogno di un vostro aiuto in quanto non riesco a gestire un concatena con più criteri come ho riportato nel file excel in allegato.

Cosa vorrei fare? Concatenare descrizioni uniche (riga CATEGORIA PROVE) che appartengono a valori univoci (riga CONCATENA) con il risultato che viene riportato nella riga RISULTATO CHE VORREI OTTENERE

non so se sono stato chiaro

grazie in anticipo
Post: 2.282
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 09:39

Ciao

la tua versione di Excel riconosce la funzione TESTO.UNISCI?

Faccio un esempio

=testo.unisci("-";1;A1:A10)

restituisce un risultato? Non mi interessa che sia corretto.

Se la formula non restituisce errore, provo ad aggiustarla al tuo caso.

Saluti
[Modificato da (Canapone) 05/12/2017 09:52]

Post: 1
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 10:54

no la funzione testo.unisci non va mi restituisce #NOME?
Post: 2.288
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 11:04

Ciao

uso Excel 2010 per PC: nel file allegato trovi la UDF "provaunione", che dovrebbe simulare TESTO.UNISCI (credo disponibile su Excel 365).

Ho trovato la formula udf in rete: l'ho copiata in un modulo.

Uso questa formula per concatenare sino a 50 stringhe:

=provaunione("-";1;INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);INDICE(RIF.RIGA($1:$50);))))



Ho lasciato la formula attiva solo nella cella D2.

Sotto ho fatto un copia incolla valori

Se servisse: spero di aver capito.
[Modificato da (Canapone) 05/12/2017 11:10]

Post: 2
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 11:21

la formula funziona bene grazie mille....ora devo adattarla al file originario, vedo che hai usato VB, quindi capisco che senza non è possibile ottenere lo stesso risultato.

grazie ancora
Post: 2.290
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 11:26

Ciao

senza la simulazione di TESTO.UNISCI dovrei scrivere una formula che concatena un numero indefinito di correlazioni senza ripetizione

Si può fare, ma non saprei se ne vale la pena: è la stessa formula


esempio per le prime 7 corrispondenze

=SE.ERRORE(INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);1));"")&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);2));"")&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);3));"")&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);4));"")&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);5));"")&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);6));"")&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);7));"")
[Modificato da (Canapone) 05/12/2017 11:30]

Post: 3
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 11:29

no no ma va bene quella che hai postato prima nel file era solo per capire

Ti ringrazio nuovamente
Post: 2.291
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 11:34



Giro un esempio senza UDF: se hai bisogno di un'ottava stringa (vedi l'8 infondo alla stringa) integri la formula con

&SE.ERRORE("-"&INDICE(A$1:A$154;AGGREGA(15;6;RIF.RIGA($1:$154)/(FREQUENZA(CONFRONTA(A$1:A$154;A$1:A$154;0);CONFRONTA(A$1:A$154;A$1:A$154;0)*($B$1:$B$154=B2))>0);8));"")



Saluti


[Modificato da (Canapone) 05/12/2017 11:36]

Post: 4
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 11:49

credo che prenderò in considerazione quella con UDF perchè il numero di stringhe è molto variabile e potrebbe capitare di averne maggiori di 8 (poi la formula diventerebbe troppo lunga)

Post: 2.292
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 12:01

Ciao

nella coda della formula se devi gestire più di 50 stringhe diverse modifica solo il 50 (portalo a 100 per esempio, ma non esagerare) in


....INDICE(RIF.RIGA($1:$50);....


Saluti

Post: 5
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 12:18

credo che 50 sia sufficientemente un numero congruo ma tengo a mente i tuoi preziosissimi consigli e dritte

ti ringrazio tantissimo
[Modificato da geflor 05/12/2017 12:18]
Post: 6
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
05/12/2017 15:11

ho scritto in excel nel mio file originario, che contiene in questo momento colonne da A a BG e 16433 righe, la seguente formula:

=provaunione("-";1;INDICE(BG$1:BG$20000;AGGREGA(15;6;RIF.RIGA($1:$20000)/(FREQUENZA(CONFRONTA(BG$1:BG$20000;BG$1:BG$20000;0);CONFRONTA(BG$1:BG$20000;BG$1:BG$20000;0)*($AS$1:$AS$20000=AS2))>0);INDICE(RIF.RIGA($1:$50);))))


credo che il numero 20000 si troppo grande perchè excel non risponde più hai comandi.

come posso risolvere
Post: 2.293
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 16:34

Ciao

credo ci voglio del codice VBA che gestisca totalmente il concatenamento: in questo caso non sono d'aiuto.

Se mi viene in mente qualcosa di "formulato" la condivido.

Spero qualche amico del Forum arrivi in aiuto.
[Modificato da (Canapone) 05/12/2017 16:35]

Post: 2.294
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
05/12/2017 19:23

Ciao

faccio un altro tentativo.

Se copi le due colonne che devono gestire il concatenamento in un secondo foglio (una accanto all'altra; foglio "tabella") e rimuovi i duplicati, potesti usare nella terza colonna

=provaunione("-";1;INDICE(A$1:A$20000;AGGREGA(15;6;RIF.RIGA($1:$20000)/($B$1:$B$20000=B2);INDICE(RIF.RIGA($1:$50);))))


La formula è molto meno impegnativa per i processori: ho levato l'estrazione degli univoci sotto condizione.

Una volta ottenute le stringhe concatenate nel foglio "tabella", puoi intercettarle nel foglio principale con un INDICE/CONFRONTA

=INDICE(tabella!$C$2:$C$20000;CONFRONTA(A2&B2;INDICE(tabella!$A$2:$A$20000&tabella!$B$2:$B$20000;);0))


Spero si capisca dove sto cercando di andare a parare...

Allego esempio

[Modificato da (Canapone) 05/12/2017 19:26]

Post: 7
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
06/12/2017 16:44

ho provato con la tabella di appoggio, come da tuo gentile ulteriore tentativo, ma nulla di fatto si blocca tutto, e che intorno alla riga 500 si impalla e non restituisce più nulla
Post: 2.295
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
06/12/2017 17:45

Ciao

grazie del riscontro: mi spiace.

Prima di condividere la nuova impostazione ho simulato il funzionamento delle formule su un database di qualche migliaio di righe (codici simulati) su un pc con processore I3.

Non ho avuto problemi, ma evidentemente non sono riuscito a ricreare la complessità del file con il quale stai lavorando.

In passato ho avuto problemi di ricalcolo a causa delle compresenza nel foglio di funzioni volatili (INDIRETTO() o OGGI() solo per fare un paio di esempi) che -letteralmente -mi appestavano il file.

Ho fatto attenzione a non proporle.

Spero qualche amico del Forum intervenga con il VBA ( sono a zero)

Buon lavoro

[Modificato da (Canapone) 06/12/2017 17:46]

Post: 2.296
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
07/12/2017 13:30

Ciao,

trovata altra UDF qui:

https://www.mrexcel.com/forum/excel-questions/977125-using-concatenateif-function-trying-remove-duplicates.html

Ringrazio Mike Erickson.

Fatto prova su 20.000 record: bloccato il computer ( solito pc con processore I3 in ricalcolo per oltre 40 minuti)

Ho ridotto il range di lettura della formula.

Nelle prime 100 righe, formule verdi (vedi allegato)

=CONCATIF(B$2:B$300;B2;A$2:A$300;" - ";VERO)


da riga 101 - sino a riga 19900: queste formule elaborano solo 200 righe (100 sopra la riga della formula e 100 sotto).

Formule arancioni

=CONCATIF(INDICE(B$2:B$20000;RIF.RIGA()-100):INDICE(B$2:B$20000;RIF.RIGA()+100);B101;INDICE(A$2:A$20000;RIF.RIGA()-100):INDICE(A$2:A$20000;RIF.RIGA()+100);" - ";VERO)


i +/-100 creano i range d'elaborazione della formula

19000 in meno di due minuti

Ultime 100 righe formule celesti

=CONCATIF(B$19800:B$20000;B19900;A$19800:A$20000;" - ";VERO)


Allego esempio

Saluti




[Modificato da (Canapone) 07/12/2017 13:41]

Post: 8
Registrato il: 05/12/2017
Città: AVELLINO
Età: 45
Utente Junior
2016
OFFLINE
14/12/2017 11:19

scusami se rispondo solo adesso ma sono stato fuori

ho provato anche con quest'ultima ma nulla di fatto al dire il vero quando scrivo la tua funzione per le righe centrali non funziona proprio

siccome =CONCATIF(B$2:B$300;B2;A$2:A$300;" - ";VERO) se viene usata per tante righe impalla il pc non è possibile scrivere qualcosa che prende 30 righe sopra e 30 sotto un po come è fatta quelle per le righe arancioni che pero non funziona o almeno io non riesco a farla funzionare

Post: 2.299
Registrato il: 27/09/2010
Città: FIRENZE
Età: 61
Utente Veteran
Excel 2010
OFFLINE
14/12/2017 13:23



Ciao

anch'io avrei adattato la formula arancione dalla riga 31 in giù:

=CONCATIF(INDICE(B$2:B$20000;RIF.RIGA()-30):INDICE(B$2:B$20000;RIF.RIGA()+30);B31;INDICE(A$2:A$20000;RIF.RIGA()-30):INDICE(A$2:A$20000;RIF.RIGA()+30);" - ";VERO)


Per ridurre il lavoro, non mi viene in mente altro.


Ho fatto una prova servendomi di INDIRETTO, ma i tempi di elaborazione si sono parecchio allungati

=CONCATIF(INDIRETTO("B"&RIF.RIGA()-30&":"&"B"&RIF.RIGA()+30);B31;INDIRETTO("A"&RIF.RIGA()-30&":"&"A"&RIF.RIGA()+30);" - ";VERO)


Sempre da riga 31.

Saluti
[Modificato da (Canapone) 14/12/2017 13:23]

Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 07:38. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com