Utilizzo VBA al posto della funzione CERCA.VERT ()

Anonimo
2011-07-02T09:56:44+00:00
Il file ANAGRAFICHE.xls è un file esterno alla tabella di ricerca sottostante.
ESTRAZIONE DA FILE ANAGRAFICHE.XLS
es:IN B2 c'è la funzione  =cerca.vert(A2;'C:\Desktop\EROGAZIONI 2011[ANAGRAFICHE.xls)Foglio1!'$A2:E100;1) e così ho esteso anche nelle altre celle la formula.
A B C D E
1 cognome e nome Nato Comune Esenz.Pat. Esenz. IC
2 GATTI ROBERTO 12/05/1965 MILANO SI 00/01/1900 tab. attiva
3 RAGGIO MARIO 13/06/2000 ROMA 00/01/1900 SI con funz. Cerca.vert
4 VERDI GIACOMO 25/04/1984 MILANO 00/01/1900 SI
5 ROSSI UGO 03/02/1950 MILANO 00/01/1900 SI
SU FOGLIO XLS ESTERNO DI NOME :ANAGRAFICHE.XLS
A B C D E
1 cognome e nome Nato Comune Esenz.Pat. Esenz. IC
2 GATTI ROBERTO 12/05/1965 MILANO SI tab.esterna
3 RAGGIO MARIA 13/06/2000 ROMA SI
4 ROSSI MARIO 25/04/1984 TORINO SI SI
5 ROSSI UGO 03/02/1950 MILANO SI
Purtroppo con la funzione cerca.vert(), con cognome e nome simile ma non uguale (vedi Raggio Mario oppure Verdi Giacomo
che non esiste nella tabella esterna "ANAGRAFICHE" , mi tira fuori la data più vicina, invece che dirmi che tale anagrafica non è presente.
Pertanto la tabella di estrazione da un file esterno, non è affidabile e non mi permette di accorgermi dell'errore
Si può fare in VBA Excel 2003 un codice che sostituisca la funzione cerca e quando non trova il nominativo
in luogo del dato più prossimo mi scriva in cella( "Manca anagrafica") ?<br><br><br>Se invece con la correzione della formula CERCA,VERT() si può risolvere il problema, ben venga.<br><br><br>Ho letto un quesito simile, ho cercato di adattarlo ma non ho capito perchè non mi funziona.
Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2011-07-15T07:43:18+00:00

Accidenti, oggi ho scoperto che anche le lettere minuscole accentate si possono rendere accentate in maiuscolo senza utilizzare l'apostrofo(apice).

Pensa che non so come si ottiene da tastiera la lettera accentata PATTÈ, l'ho dovuta copiare e incollare altrimenti l'avrei scritta PATTE' come avrebbero fatto in molti.

Quindi, fin qui, tutto OK. interviene sia sulla colonna A del Cognome e anche sulla  C della Residenza.

Ho cercato di scoprire cosa potesse fare il tuo codice riga per riga ma non essendoci un commento ci ho rinunciato, non posso dire che ho fatto un atto di fede perchè ho voluto provarla mettendo blank davanti ... in fondo, mettendo lettere minuscole intercalate a maiuscole e con accenti finali ma funziona alla grande. Direi eccezionale, ma sempre con il tarlo di prendere il pacchetto così com'è.

Pertanto fino qui, OK. Se vuoi darmi in pasto un altro pezzo di codice per proseguire, lo aspetto con ansia.

Intanto commento la parte che immagino risulti *ostica* del codice precedente:

    With sh

        'trovo l'ultima cella con un valore in colonna A

        lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

        'definisco il range con nomi e cognomi

        Set rng = .Range("A2:A" & lRiga)

        'ciclo in range; per ogni cella nel range

        For Each c In rng

            'pulisco le due variabili

            s = ""

            v = ""

            'in c

            With c

                'divido la stringa della cella in tante parti

                'utilizzando lo spazio " " come separatore

                v = Split(.Value, " ")

                'per ogni parte ottenuta

                For lng = 0 To UBound(v)

                    'se la parte è diversa da stringa vuota

                    If v(lng) <> "" Then

                        'aggiungo la parte alla variabile s

                        s = s & v(lng) & " "

                    End If

                Next

                'modifico il valore della cella

                'mettendo tutto maiuscolo la stringa s

                'ed eliminando l'ultimo carattere

                '(nello specifico è uno spazio che so

                'di avere nella stringa)

                .Value = UCase(Mid(s, 1, Len(s) - 1))

                'pulisco le variabili

                s = ""

                v = ""

                'divido la stringa della colonna C

                '(Offset(0,2)

                v = Split(.Offset(0, 2).Value)

                'ripeto quanto fatto per la colonna A

                For lng = 0 To UBound(v)

                    If v(lng) <> "" Then

                        s = s & v(lng) & " "

                    End If

                Next

                .Offset(0, 2).Value = UCase(Mid(s, 1, Len(s) - 1))

            End With

        Next

    End With

Per le accentate, vedi qui: http://www.asciitable.it/asciiext.asp

ALT+0192 ti darà À, ecc.

Vedo di andare avanti... ;-)

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2011-07-15T08:42:11+00:00

 

Vedo di andare avanti... ;-)

... e avanti andiamo.

Questa(che deve essere eseguita *DOPO* aver fatto girare la prima), ti lascierà le righe con Nome/cognome, Data di nascita e residenza *UNIVOCI*. Vuol dire che se Mario Rossi compare tre volte con gli stessi dati, te ne lascia uno solo. Se la data o la residenza di uno dei mario Rossi è diversa, te ne lascierà due:

Public Sub mEliminaDoppi()

    Dim lng As Long

    Dim lRiga As Long

    Dim sh As Worksheet

    Dim lRip As Long

    Set sh = ThisWorkbook.Worksheets("Foglio1")

    Application.ScreenUpdating = False

    With sh

        'trovo l'ultima cella con un valore in colonna A

        lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

        'aggiungo una colonna

        .Range("A:A").Insert Shift:=xlToRight

        'concateno le celle B:D(ho una colonna in più

        'e la residenza è in D)

        .Range("A2").Value = "=CONCATENATE(B2 & C2 & D2)"

        'faccio l'auto completamentio in colonna A

        .Range("A2").AutoFill Destination:=Range("A2:A" & lRiga)

        'ciclo le righe partendo dall'ultima

        For lng = lRiga To 2 Step -1

            'conto quante volte ho la stessa cosa in A

            lRip = Evaluate("=COUNtIF(" & "A2:A" & lRiga & "," & _

                """" & .Range("A" & lng).Value & """" & ")")

            'se ne ho più di una, elimino la riga

            If lRip > 1 Then

                .Rows(lng & ":" & lng).Delete Shift:=xlUp

            End If

        Next

        'elimino la colonna A che non mi serve più

        .Columns("A:A").Delete Shift:=xlToLeft

    End With

    Application.ScreenUpdating = True

    Set sh = Nothing

End Sub

Fai alcune prove su copie del file originale e vedi se va bene nel tuo contesto.

La risposta è stata utile?

0 commenti Nessun commento

39 risposte aggiuntive

Ordina per: Più recente
  1. Anonimo
    2011-07-05T07:11:35+00:00
    OK, proviamo in VBA, riassumo ciò che deve fare:
    Qui sotto dati presenti nel file ANAGRAFICHE
    A1 = COGNOME; B1=ANNO;C1=RESIDENZA;D1=PATOL.1;E1=PATOL.2
    Sotto partono i dati
    cognome        anno        residenza    patol1. 1   Patol1
    rossi roberta      11/08/1948   MILANO     SI              SI
    rossi roberto     16/08/1907    ROMA        SI
    gialli daniele     01/02/1976    TRIESTE    SI             SI
    verdi mario        15/04/1948   NAPOLI      SI             SI
    ------------------------------------------------------------------------------
    Qui sotto dati presenti nel file ANAGRAFICHE_E_PATOLOGIE ma su foglio3
    Attenzione , su foglio 3 ma le intestazioni partono da riga 2, quindi
    A2 = COGNOME; B2=ANNO;C2=RESIDENZA;D2=PATOL.1;E2=PATOL.2
    Sotto in col. A3 iniziano i cognomi che sono stati estratti da altra macro.
    cognome        anno   residenza   patol1  patol2
    rossi roberto
    gialli daniele
    grullo renzo
    -------------------------------------------------------------------------------
    Dopo la ricerca in VBA, il file ANAGRAFICHE_E_PATOLOGIE dovrebbe
    essere così:
    cognome          anno     residenza    patol1    patol2
    rossi roberto   16/08/1907   ROMA        SI
    gialli daniele   01/02/1976    MILANO    SI             SI
    grullo renzo   No anagr.  No anagr.
    NOTE:
    Nel fare la ricerca prima di processare il confronto tra il cognome
    presente nei file ANAGRAFICHE_E_PATOLOGIE e il cognome presente
    sul file ANAGRAFICHE (quello per intenderci completo di tutte le informazioni)
    dobbiamo far togliere con la funzione ANNULLA.SPAZI (questa era la funzione utilizzata in formula) eventuali blank in
    fondo al COGNOME in quanto ho notato che essendo stati digitati da persone
    diverse a volte non mi riconosceva lo stesso cognome e nome. Ho appurato che il
    motivo era dato da uno spazio in + alla fine del cognome, o da
    una parte o dall'altra.
    Quindi se il cognome è presente in ANAGRAFICHE mi deve restituire a fianco
    l'anno di nascita, la residenza, la patol.1 e la patol. 2
    Tenere presente che patol1 e patol.2 avranno come risposta SI o blank
    a seconda di quello che troverà in ANAGRAFICHE.
    Qualora l'anagrafica di ricerca presente sul file ANAGRAFICHE_e_PATOLOGIE
    non dovesse essere presente in ANAGRAFICHE, dovra mettere nella colonna
    ANNO e RESIDENZA ---> No Anagr.
    Questo è quello che vorrei ottenere in VBA in modo da non appesantire con le
    formule il foglio, visto che in effetti i nominativi sono parecchi.
    Qualora non ci fosse quel cognome in ANAGRAFICHE quando verrà inserito
    facendo fare un altro giro, ovviamente in seconda battuta, completerà anche
    il record che non era stato trovato e sparirà No Anagr.
    Confido sul VBA, con le formule ci ho provato ma appesantisce troppo.
    Grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2011-07-05T05:19:08+00:00

    <cut>

    Una volta stampato il risultato gli dovrei dire in VBA chiudi il File ANAGRAFICHE.

     

    Quindi, sempre che sia giusta se mi postate i due comandi per fargli aprire il file ANAGRAFICHE e poi per farglielo chiudere a stampa finita, vi ringrazio.

    Meglio però,  sarebbe capire perchè devo far aprire il file per vedere il risultato.

    Possiamo trovare una soluzione *tutta VBA*. Quello che non ho capito, scusami, è cosa devi *estrarre* dal file Anagrafiche e dove lo devi mettere. Grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-07-03T16:56:47+00:00

    Ciao, a tutto voi che state cercando di aiutarmi, ci sono riuscito ad adattare la formula.

    Succede però una cosa strana, con la vecchia formula:

    =CERCA.VERT(A4;'C:\Users\XEON\Desktop\EROGAZIONI 2011[ANAGRAFICHE.xls]Foglio1'!$A$2:$E$1000;2;0)

    ottengo il risultato voluto pur rimanendo il file ANAGRAFICHE CHIUSO ----> 09/06/1976

    Per esigenze di digitazioni non corrette ho dovuto integrare la formula con ANNULLA.SPAZI in quanto

    ho riscontrato dei nomi che pur essendo uguali visivamente,di fatto avevano un blank di troppo O IN UN ARCHIVIO O NELL'ALTRO,

    alla fine, quindi ho pensato di eliminare i blank sia sull'archivio

    ANAGRAFICHE che in quello in cui abbiamo il risultato di CERCA.VERT

    Qui sotto la formula corretta:

    =SE(CONTA.SE('C:\Users\XEON\Desktop\EROGAZIONI 2011[ANAGRAFICHE.xls]Foglio1'!$A$2:$E$1000;ANNULLA.SPAZI(A4))=1;CERCA.VERT(ANNULLA.SPAZI(A4);'C:\Users\XEON\Desktop\EROGAZIONI 2011[ANAGRAFICHE.xls]Foglio1'!$A$2:$E$1000;2;0);"No Anagr. O digit. Male")

    e qui sotto il risultato se l'archivio ANAGRAFICHE resta chiuso

    #VALORE!

    Come vado ad aprire il file ANAGRAFICHE, ottengo il risultato --->09/06/1976

    Quello che non mi da più pace è che per avere il risultato alla fine devo aprire il file

    ANAGRAFICHE assieme al file che fa la ricerca, altrimenti mi restituisce il risultato #VALORE!

    Ammesso che la formula sia giusta, a questo punto alla fine del risultato in VBA gli dovrei dire, aprimi l'archivio ANAGRAFICHE e poi farei tornare in primo piano il file con i risultati.

    Una volta stampato il risultato gli dovrei dire in VBA chiudi il File ANAGRAFICHE.

    Quindi, sempre che sia giusta se mi postate i due comandi per fargli aprire il file ANAGRAFICHE e poi per farglielo chiudere a stampa finita, vi ringrazio.

    Meglio però,  sarebbe capire perchè devo far aprire il file per vedere il risultato.

    La risposta è stata utile?

    0 commenti Nessun commento