Excel e gli applicativi Microsoft Office Cerca verticale di stringhe di testo inesatte

Login Registrati
Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
  • Autore
    Articoli
  • #2219 Score: 0 | Risposta

    Kellington90
      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 giornata
      #2238 Score: 0 | Risposta

      Marius44
      Moderatore
        58 pts
        Ciao
        vedi 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 Sub

        Fai sapere. Ciao,
        Mario

        #2244 Score: 0 | Risposta

        Kellington90
          Innanzitutto 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!
          #2246 Score: 0 | Risposta

          Marius44
          Moderatore
            58 pts
            Ciao
            Ecco 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,
            Mario
            #2301 Score: 0 | Risposta
            Ciao 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.
            #2324 Score: 0 | Risposta

            Marius44
            Moderatore
              58 pts
              Ciao
              Sostituisci la macro di prima con questa
              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
              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 Sub
              Ho 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 3
              Fai sapere. Ciao,
              Mario
              Allegati:
              You must be logged in to view attached files.
              #2326 Score: 0 | Risposta
              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!

              #2329 Score: 0 | Risposta

              Marius44
              Moderatore
                58 pts
                Ciao
                ti 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 Sub
                
                

                Per 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,
                Mario

                PS. Se ritieni che la discussione sia stata RISOLTA, vai in basso, seleziona la dicitura esatta e clicca su Aggiorna

              Login Registrati
              Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
              Rispondi a: Cerca verticale di stringhe di testo inesatte
              Gli allegati sono permessi solo ad utenti REGISTRATI
              Le tue informazioni: