Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Trovare una corrispondenza parziale di testo in excel

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Trovare una corrispondenza parziale di testo in excel

Postdi libraio » 20/03/21 20:11

S.o. Windows7 + Excel2003

Ciao a tutti,
devo confrontare due colonne di editori (formato testo) per trovare le corrispondenze anche in presenza di nominativi diversi (Feltrinelli/Feltrinelli Editore, Rizzoli/Rizzoli Libri, ecc). L'elenco di riferimento corretto è in colonna 'A'.
Esempio:
A'n'= Feltrinelli Editore, C2= Feltrinelli
A'n'= Mondadori, C3=Mondadori
La formula:
= CERCA.VERT(C2 & "*";$A$2:$D$5000;1;FALSO)
applicata in colonna 'D', mi restituisce correttamente:
D2=Feltrinelli Editore
D3=Mondadori
e nel caso di mancata corrispondenza il fastidioso #N/D...

Il problema sorge nel caso in cui l'editore in colonna 'C' abbia un testo composito rispetto al potenziale corrispondente in colonna 'A'.
Esempio
A'n'= Feltrinelli, C2 Feltrinelli Editore.
La formula non riscontra la corrispondenza.
E' possibile ampliare la ricerca anche a quest'ultima condizione?
Io non ci sono riuscito...
Non ho ancora affrontato la soluzione del "problema" #N/D, perchè, nel frattempo, mi si è presentata la limitazione appena esposta.
Confido nel vostro prezioso aiuto...
Grazie
libraio
Utente Senior
 
Post: 316
Iscritto il: 04/01/10 20:31

Sponsor
 

Re: Trovare una corrispondenza parziale di testo in excel

Postdi D@nilo » 20/03/21 20:21

ciao
allega un file con unpò di dati significativi dei casi che si possono trovare e il risultato da ottenere scritto a mano
Avatar utente
D@nilo
Utente Junior
 
Post: 36
Iscritto il: 12/05/18 13:15
Località: ROMA

Re: Trovare una corrispondenza parziale di testo in excel

Postdi libraio » 20/03/21 21:13

Allego link file d'esempio

https://we.tl/t-xTl0hlxOGa

Grazie
libraio
Utente Senior
 
Post: 316
Iscritto il: 04/01/10 20:31

Re: Trovare una corrispondenza parziale di testo in excel

Postdi D@nilo » 20/03/21 22:34

Ciao
certo che lavorare con le formule con la versione del 2003 non semplifica....comunque con questi dati diventa molto complicato quindi utilizzo un foglio di servizio (Foglio1) dove creo una tabella di 100 colonne per 100 righe (da ampliare o ridurre al bisogno) in A2 del Foglio 1 da trascinare a destra fino a CV2

Codice: Seleziona tutto
=INDIRETTO(INDIRIZZO(RIF.COLONNA(A$1)+1;1;;;"Editori"))&""


in A3 da attivare con i tasti CTRL+SHIFT+ENTER e trascinare a destra fino a CV3 e poi in basso

Codice: Seleziona tutto
=SE(VAL.ERRORE(SE(A$2="";"";INDICE(Editori!$C$2:$C$101;PICCOLO(SE(VAL.NUMERO(TROVA(A$2;Editori!$C$2:$C$101));RIF.RIGA($2:$101)-1);RIF.RIGA($A1)))));"";SE(A$2="";"";INDICE(Editori!$C$2:$C$101;PICCOLO(SE(VAL.NUMERO(TROVA(A$2;Editori!$C$2:$C$101));RIF.RIGA($2:$101)-1);RIF.RIGA($A1)))))


in D2 del foglio Editori da attivare matriciale e poi trascinare in basso


Codice: Seleziona tutto
=SE(C2="";"";SE(VAL.ERRORE(SE(VAL.ERRORE(CERCA.VERT($C2&"*";$A$2:$C$101;1;0));INDICE(Foglio1!$A$2:$CV$2;PICCOLO(SE(Foglio1!$A$3:$CV$102=$C2;RIF.COLONNA($A:$CV));1));CERCA.VERT($C2&"*";$A$2:$C$101;1;0)));"";SE(VAL.ERRORE(CERCA.VERT($C2&"*";$A$2:$C$101;1;0));INDICE(Foglio1!$A$2:$CV$2;PICCOLO(SE(Foglio1!$A$3:$CV$102=$C2;RIF.COLONNA($A:$CV));1));CERCA.VERT($C2&"*";$A$2:$C$101;1;0))))


file da scaricare

https://www.dropbox.com/scl/fi/118dd7l8 ... 8clbnbu73a
Avatar utente
D@nilo
Utente Junior
 
Post: 36
Iscritto il: 12/05/18 13:15
Località: ROMA

Re: Trovare una corrispondenza parziale di testo in excel

Postdi libraio » 22/03/21 14:03

Ti ringrazio per la soluzione.
Purtroppo i nominativi editori da analizzare sono circa 2000 ed Excel 2003 consente un massimo di 256 colonne!
Continuerò a lavorarci... anche se dubito in una soluzione che non sia la verifica "manuale".
Grazie ancora, terrò la tua proposta paer altre esigenze
libraio
Utente Senior
 
Post: 316
Iscritto il: 04/01/10 20:31

Re: Trovare una corrispondenza parziale di testo in excel

Postdi Anthony47 » 22/03/21 16:06

Io sinceramente non ho capito il problema che si vuole risolvere... se lo spieghi con parole diverse, utilizzando il contenuto di colonne A e C del file che avevi condiviso, magari provo con una macro.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17873
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Trovare una corrispondenza parziale di testo in excel

Postdi libraio » 22/03/21 18:54

Ciao Anthony,
cerco di esporre meglio la mia necessità.
Ho un elenco di oltre 2000 nominativi di Editori.
In colonna 'A' inserisco l'elenco di base per il confronto.
In colonna 'C' inserisco gli editori da confrontare, il cui nominativo può variare rispetto all'elenco base in colonna 'A'
In colonna 'D' applico la funzione
=SE(VAL.NON.DISP(CERCA.VERT(C2&"*";$A$2:$D$4998;1;FALSO)); "";(CERCA.VERT(C2&"*";$A$2:$D$4998;1;FALSO)))
che mi restituisce le corrispondenze (ho modificato la funzione per eliminare il risultati #N/D9.
Il risultato della formula è corretto quando
1 - i termini nelle due colonne sono uguali (es. A=FELTRINELLI - C=FELTRINELLI)
2 - la colonna C contiene parte del termine in colonna a (es. A=FELTRINELLI EDITORE - C=FELTRINELLI)

Ma la funzione non rileva il caso in cui la colonna A contenga solo parte del nominativo in colonna C (A=FELTRINELLI - C=FELTRINELLI EDITORE)
Io avrei la necessità di rilevare anche quest'ultimo caso.

Unisco un nuovo foglio di esempio; ho cercato di "migliorare" le annotazioni a margine
https://we.tl/t-0JszyzBEmV

Grazie
libraio
Utente Senior
 
Post: 316
Iscritto il: 04/01/10 20:31

Re: Trovare una corrispondenza parziale di testo in excel

Postdi Anthony47 » 23/03/21 15:31

Allora, questa macro confronta l'elenco di col C con l'anagrafica di col A e segnala per ogni riga la "mia" migliore corrispondenza, con il relativo "peso"
Codice: Seleziona tutto
Sub BestGuess()
Dim splArr(), wArr, sSh As Worksheet, toSplit As String
Dim I As Long, J As Long, mySplit, splInd As Long
Dim LastR As Long, ElencoA As String, ElencoB As String
Dim K As Long, L As Long, myMatch
Dim cPeso As Single, tPeso As Single, maxI As Long, maxPeso As Single
Dim lMc As Long, lWc As Long
'
ElencoA = "A2"          '<<< L'inizio dell'elenco "giusto"
ElencoB = "C2"          '<<< L'inizio dell'elenco da confrontare
colp = "F"              '<<< La colonna per inserire il "peso"
colg = "G"              '<<< La colonna per inserire la "migliore ipotesi"
'
remov = Array(",", "'", "&", "-")
pesi = Array("EDITORE", 0.6, "LA", 0.1, "LE", 0.1, "I", 0.1, "GLI", 0.1, "L", 0.1, "E", 0.1)
'
Set sSh = ThisWorkbook.Sheets("Editori")
LastR = sSh.Range(ElencoA).Offset(10000, 0).End(xlUp).Row
wArr = sSh.Range(ElencoA).Resize(LastR - 1, 1).Value
ReDim splArr(1 To UBound(wArr), 1 To 6)
For I = 1 To UBound(wArr)
    toSplit = UCase(wArr(I, 1) & " #")
    For J = 0 To UBound(remov)
        toSplit = Replace(toSplit, remov(J), " ", , , vbTextCompare)
    Next J
    mySplit = Split(toSplit, " ", , vbTextCompare)
    If UBound(mySplit) > 0 Then
        splInd = 1
        For J = 0 To UBound(mySplit)
            If Len(mySplit(J)) > 0 Then
                splArr(I, splInd) = mySplit(J)
                splInd = splInd + 1
                If splInd > 6 Then Exit For
            End If
        Next J
    End If
Next I
LastR = sSh.Range(ElencoB).Offset(10000, 0).End(xlUp).Row
'
For I = 1 To LastR - 1
    maxPeso = 0
    toSplit = UCase(sSh.Range(ElencoB).Cells(I, 1))
    For J = 0 To UBound(remov)
        toSplit = Replace(toSplit, remov(J), " ", , , vbTextCompare)
    Next J
    mySplit = Split(Application.WorksheetFunction.Trim(toSplit), " ", , vbTextCompare)
    For J = 1 To UBound(splArr)
    aaaa = wArr(J, 1)
        tPeso = 0: lMc = 0: lWc = 0
        For K = 1 To UBound(splArr, 2)
        bbbb = splArr(J, K)
        If Len(splArr(J, K)) < 1 Then Exit For
            lWc = lWc + 1
            For L = 0 To UBound(mySplit)
                If splArr(J, K) = mySplit(L) Then
                    lMc = lMc + 1
                    myMatch = Application.Match(mySplit(L), pesi, False)
                    If IsError(myMatch) Then
                        cPeso = 1 * Len(mySplit(L))
                    Else
                        cPeso = pesi(myMatch) * Len(mySplit(L))
                    End If
                    tPeso = tPeso + cPeso
                End If
            Next L
        Next K
        If lWc > 1 Then
        If lMc > UBound(mySplit) Then addp = 10 Else addp = 0
            If (tPeso * lMc / (lWc - 1)) + addp > maxPeso And lWc > 1 Then
                maxPeso = tPeso * lMc / (lWc - 1) + addp
'                If lMc >= UBound(mySplit) Then maxPeso = maxPeso + 10
                maxI = J
            End If
        End If
    Next J
    If maxPeso > 0 Then
        sSh.Cells(I + Range(ElencoB).Row - 1, "G").Value = Range(ElencoA).Cells(maxI, 1)
        sSh.Cells(I + Range(ElencoB).Row - 1, "F").Value = maxPeso
    Else
        sSh.Cells(I + Range(ElencoB).Row - 1, "F").Value = 0
        sSh.Cells(I + Range(ElencoB).Row - 1, "G").ClearContents
    End If
Next I
End Sub

Le righe iniziali marcate <<< vanno personalizzate come da commento; il codice va inserito in un modulo stanndard del tuo progetto vba.
La macro indica su 2 colonne adiacente all'elenco che si vuole confrontare la "migliore stima" e il relativo "peso".
Piu' e' basso il peso e minore sono le probabilita' che la stima sia corretta.

Completata la macro, sara' necessario filtrare l'elenco per i pesi inferiori a 10 e cancellare le stime inappropriate; basta una parola in comune per accumulare qualche punticino di probabilita'.

Di piu' non mi viene in mente nulla alla nostra portata

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17873
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Trovare una corrispondenza parziale di testo in excel

Postdi libraio » 23/03/21 19:03

Non so come tu abbia fatto!!!
Con un minimo di attenzione posso ottenere il risultato che speravo (insperato)
Che dire? M'inchino...
Grazie Anthony
libraio
Utente Senior
 
Post: 316
Iscritto il: 04/01/10 20:31

Re: Trovare una corrispondenza parziale di testo in excel

Postdi Anthony47 » 23/03/21 22:26

Bene!

Solo una raccomandazione: invece di filtrare l'elenco per i pesi bassi, potrebbe essere utile ordinare la tabella in ordine crescente di Peso; in questo caso ricordati di selezionare e ordinare a partire dall'elenco di colonna C, altrimenti la tabella viene scombussolata (le righe ordinate non sono piu' nella corretta relazione con la colonna C)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17873
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Trovare una corrispondenza parziale di testo in excel":


Chi c’è in linea

Visitano il forum: Nessuno e 56 ospiti