› Excel e gli applicativi Microsoft Office › Cerca verticale di stringhe di testo inesatte
-
AutoreArticoli
-
Buongiorno, esiste un metodo che fa si che se sto cercando un nome che è scritto male all'interno di una tabella, per qualche corrispondenza (ad esempio alcune lettere consecutive all'interno del testo cercato, o altri modi) mi trova lo stesso quell nome?Vi faccio un esempio:In una tabella ho due colonne per semplificare, prima Colonna "NOME", seconda Colonna "ETA'".
Se io cerco con un cerca vertical il nome "facrizio" anzichè "fabrizio" che è presente all'interno della tabella, giustamente la formula mi restituisce errore.
Esiste un modo che, dato che ad esempio quasi tutte le lettere sono simili tranne una (è presente una C anzichè una B), mi trova ugualmente il nome?Grazie in anticipo a chiunque sia in grado di risolvere!
Buona giornataCiaovedi se può esserti utile la macro sottostante (elenca in col.J tutti i nomi che hanno una corrispondenza di lettere pari a -1). Adattala al tuo scopo.Option Explicit Public Sub Simile() Dim ur As Long, k As Long, i As Long, a As Integer, b As Integer, conta As Integer, p As Integer ur = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row For k = 1 To ur a = Len([C2]) b = Len(Cells(k, 1)) For i = 1 To Application.WorksheetFunction.Min(a, b) If Mid([C2], i, 1) = Mid(Cells(k, 1), i, 1) Then conta = conta + 1 End If Next i If conta >= a - 1 Then p = p + 1: Cells(p, 10) = Cells(k, 1) conta = 0 Next k End SubFai sapere. Ciao,
MarioInnanzitutto grazie Marius del codice vba però non riesco proprio a comprenderlo, l'ho provato su un file nuovo ma non capisco il suo funzionamento (e scopo) ma credo che sia colpa mia poichè mi devo essere spiegato male.Dunque immaginiamo che in un foglio ho due colonne come dicevo: colonna A ci sono scritti una serie di nomi.In un altro foglio invece, ricevo dei dati nella quale in una determinata colonna (diciamo colonna B) devo fare il cerca verticale del valore della colonna A all'interno della tabella menzionata all'inizio nel primo foglio.Se ad esempio ricevo in colonna A "Franbesco" ma nella tabella del primo foglio ho "Francesco" e, assumo che sia un errore di scrittura, vorrei che in colonna B mi comparisse "Francesco".Altro esempio: ricevo in colonna A "fra" ma nella tabella del primo foglio ho "Francesco", vorrei che capisse che è Francesco e mi restituisca questo nome.
Oppure: ricevo "Flancescco" (due errori, la L e la C) vorrei che mi restituisse Francesco.
E cosi via... E' possibile? So che probabilmente è molto complicato ma qui ho visto creare formule e/o macro molto complesse quindi... ho fiducia! 🙂Grazie!CiaoEcco cosa succede quando non si allega il proprio file. Fra l'altro nel primo post non avevi detto tutto quello che hai detto adesso.1°) allega un file con le colonne coi nomi ed esplicita in modo chiaro quale deve essere il risultato (scrivilo pure a mano dove vuoi che appaia)2°) devi decidere tu e prima quale vuoi che sia la cosiddetta "corrispondenza": una cosa è fare un confronto fra Marco e Mario, tutt'altra il confronto fra Marco e Marcello.La macro che ti ho inviato ha bisogno di un elenco di nomi in col.A che confronta - lettera per lettera - con un nome scritto nella cella C2 e riporta tutti quei nomi che sono uguali al nome scritto in C2 e quelli che differiscono di 1 lettera.Ciao,MarioCiao Marius, grazie per l'aiuto.
Hai ragione, ti invio subito il file. Grazie per l'interessamento, so che non è per niente facile ma confido nella tua esperienza!Saluti
Allegati:
You must be logged in to view attached files.CiaoSostituisci la macro di prima con questaSub Simil_Due() Dim ur1 As Long, ur2 As Long, k As Long, i As Long, j As Long Dim a As Integer, b As Integer, conta As Integer, p As Integer, aa As String, bb As String ur1 = Sheets("1").Cells(Rows.Count, 1).End(xlUp).Row ur2 = Sheets("DB").Cells(Rows.Count, 2).End(xlUp).Row Range("J:K").ClearContents p = 1 For i = 2 To ur1 aa = Sheets("1").Cells(i, 1).Value a = Len(aa) For j = 2 To ur2 conta = 0 bb = Sheets("DB").Cells(j, 2).Value b = Len(bb) If aa = bb Then p = p + 1 Sheets("1").Cells(p, 10) = Sheets("DB").Cells(j, 2) Sheets("1").Cells(p, 11) = Sheets("DB").Cells(j, 5) aa = "": bb = "" GoTo prox Else For k = 1 To Application.WorksheetFunction.Min(a, b) If Mid(aa, k, 1) = Mid(bb, k, 1) Then conta = conta + 1 If conta >= (Application.WorksheetFunction.Min(a, b)) - 2 Then p = p + 1 Sheets("1").Cells(p, 10) = Sheets("DB").Cells(j, 2) Sheets("1").Cells(p, 11) = Sheets("DB").Cells(j, 5) aa = "": bb = "" GoTo prox End If End If Next k End If Next j prox: Next i End SubHo fatto scrivere i risultati nelle col. J e K. Se va bene sostituisci - nel codice Sheets("1").Cells(p, 10) e nel codice Sheets("1").Cells(p, 11) - il numero 10 con 2 e il numero 11 con 3Fai sapere. Ciao,MarioAllegati:
You must be logged in to view attached files.Grazie Marius! Immaginavo che fosse molto complesso il codice, ma non cosi tanto.. potresti perfavore spiegarlo/commentarlo (almeno le parti piu importanti) per capire i vari passi?Inoltre, è facilmente adattabile a una funzione di questo tipo?: dato che il cerca verticale mi ha restituito un errore, clicco sulla cella dell'errore e faccio partire una macro (la tua ma adattata a tale scopo) dove fa la sostituzione SOLO alla cella selezionata.. Una sorta di controllo manuale ma con un semplice click.Innanzitutto grazie per l'eventuale spiegazione dei passi della macro, la cosa piu importante!
Ciaoti riposto la macro commentata (e con una piccola variante - in questa riga di codice "If conta = (Application.WorksheetFunction.Min(a, b)) - 2 Then" ho tolto il segno di maggiore ">" in quanto inutile)Option Explicit Sub Simil_Due() Dim ur1 As Long, ur2 As Long, k As Long, i As Long, j As Long Dim a As Integer, b As Integer, conta As Integer, p As Integer, aa As String, bb As String 'individua l'ultima riga di Foglio1, col.A e Foglio2, col.B ur1 = Sheets("1").Cells(Rows.Count, 1).End(xlUp).Row ur2 = Sheets("DB").Cells(Rows.Count, 2).End(xlUp).Row 'cancella precedenti in col.J:K Range("J:K").ClearContents p = 1 'imposta la prima riga dove scrivere For i = 2 To ur1 'cicla sui nomi in Foglio1 aa = Sheets("1").Cells(i, 1).Value 'assume il nome della riga a = Len(aa) 'conta lettere For j = 2 To ur2 'cicla sui nomi Foglio2 conta = 0 'azzera il conteggio delle uguaglianze bb = Sheets("DB").Cells(j, 2).Value 'assume nome di Foglio2 b = Len(bb) 'conta.lettere If aa = bb Then 'se i due nomi sono uguali, scrive i risultati e passa al prossimo p = p + 1 Sheets("1").Cells(p, 10) = Sheets("DB").Cells(j, 2) Sheets("1").Cells(p, 11) = Sheets("DB").Cells(j, 5) aa = "": bb = "" GoTo prox Else 'se i due nomi non sono identici For k = 1 To Application.WorksheetFunction.Min(a, b) 'cicla fino alla minore lunghezza dei nomi If Mid(aa, k, 1) = Mid(bb, k, 1) Then 'se le due lettere in esa sono uguali conta = conta + 1 'incrementa il contatore If conta = (Application.WorksheetFunction.Min(a, b)) - 2 Then 'se il contatore è pari al numero di lettere MENO 2 p = p + 1 'scrive i risultati e passa al prossimo Sheets("1").Cells(p, 10) = Sheets("DB").Cells(j, 2) Sheets("1").Cells(p, 11) = Sheets("DB").Cells(j, 5) aa = "": bb = "" GoTo prox End If End If Next k End If Next j prox: Next i End SubPer quanto riguarda la tua ultima richiesta a mio avviso non è possibile. In una cella può starci O una formula O il risultato di una macro. Se il CERCA.VERT non ti dà il risultato voluto, pur potendo fare click sulla cella per azionare la macro questa, una volta lanciata, scriverebbe il risultato nella cella cancellando la formula.
Si può fare se accetti che la macro (come ho fatto io) scriva il risultato in un'altra cella.Ciao,
MarioPS. Se ritieni che la discussione sia stata RISOLTA, vai in basso, seleziona la dicitura esatta e clicca su Aggiorna
-
AutoreArticoli
