Creazione Macro per automatizzare ricerca dati e copia.

Anonimo
2014-09-12T11:35:56+00:00

Salve, procedo subito con l'esporre il mio problema:

Ho due file excel riempiti da numerosi dati anagrafici,aziendali ecc.

In entrambi i file è presente una colonna "Codice Cliente", io copio il codice di un cliente dal file A, lo cerco nel file B, copio le celle relative al cliente e le incollo nel file A. Sostanzialmente cerco il cliente (partendo dal file A)nell'altro file(B) ed importo i dati che mi interessano. 

Vorrei quindi creare una macro che copi il codice cliente(A) lo cerchi nel file B, se lo trova copi una serie di celle dal file B e le vada ad incollare nel file A, se non trova il codice cliente scriva "cliente mancante". Questa operazione ovviamente andrebbe svolta per molteplici volte.

Ecco un esempio della macro da me creata che svolge la singola operazione.

Sub Macro1()

'

' Macro1 Macro

'

'

    Range("Q104").Select

    Selection.Copy

    Windows("bomboloni Gpl MODIFICATO.xls").Activate

    Cells.Find(What:="481401", After:=ActiveCell, LookIn:=xlFormulas, LookAt _

        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _

        False, SearchFormat:=False).Activate

    Range("J945:N945").Select

    Application.CutCopyMode = False

    Selection.Copy

    Windows("Liquigas modificato Andrea.xlsx").Activate

    Range("AY104").Select

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

        :=False, Transpose:=False

End Sub

A me servirebbe una macro che svolga l'operazione per tutti i codici cliente, in automatico o su mio inserimento/selezione del codice cliente.

Questa è un immagine del file B dal quale devo prelevare i dati. i codici clienti sono ripetuti due volte, a me serve selezionare il primo che viene trovato dalla funzione Trova in modo che copi i dati sulla riga del primo codice.

Grazie a tutti per l'eventuale aiuto.

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

14 risposte

Ordina per: Più utili
  1. Anonimo
    2014-09-17T15:20:57+00:00

    Ok controllato ed effettivamente non trova nessun codice con CONFRONTA, modificato il codice togliendo l'apice e la macro ora trova il cliente correttamente.

    1. Come mai per alcuni clienti( direi la netta maggioranza) funziona nonostante l'apice sia presente?

    2. Cosi su due piedi non mi viene in mente, come posso togliere dalla colonna 4/Q tutti gli apici posti prima del codice? (ora sono tutti cosi per esempio: 'B99719).

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2014-09-17T14:08:31+00:00

    Scusa nella mia mente sembrava chiaro. allora il file dove ricerco i codici e i dati ca copiare, ha 2 codici clienti uguali disposti su due righe nella stessa colonna, la macro per praticamente tutti i codici prende il primo e quindi copia i dati della prima riga, per alcuni non so perché prender il secondo codice trovato(benché il primo sia presente e corretto) e quindi copia i dati errati della seconda riga.

    Se vai nel primo post vi è un immagine, quello è il file dove cerco i codici e i dati da copiare, 2 righe con lo stesso codice cliente, trovo il primo codice e copio i dati della prima riga. Ma come detto in alcune occasioni viene selezionato il 2 codice e quindi la 2 riga errata.

    Questo non sarebbe un grande problema, i piccoli errori li posso modificare manualmente in quanto pochi. Solo visto questi errori mi è sorto il dubbio che anche nei codici presenti e che all'occhio risultano correttamente copiati non vi siano altri errori.

    Per quanto riguarda le minime differenze proverò a fare ulteriori controlli magari si tratta davvero di qualche impercettibile spazio o formattazione.

    EDIT

    La colonna da cui copio i codici controllando bene nella barra della formula per ogni codice ha un apice davanti, esempio:

    '62G52

    cosi per tutti, mentre nel file dove cerco i codici e i dati da copiare l'apice manca, ma visto che la maggior parte vengono trovati e sono solo quelli con dato/cliente mancante ad aver problemi non credo sia questo il problema.

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  3. Anonimo
    2014-09-13T09:58:00+00:00

    Grazie mille per la celere risposta e cosi dettagliata.

    Allora ho creato la macro e alla sua esecuzione(SENZA aver modificato il tuo codice) svolge correttamente l'operazione di ricerca e copia dei dati per tutti i codici.

    ...

    E' andata al primo tentativo ... bene.

    Mi sembra di aver capito che hai un minimo di conoscenza di vba, per questo mi limiterò a suggerirti le possibili soluzioni, lasciando poi a te la soddisfazione di adeguare il codice. Nell'ordine:

    1. Invece che copiare tutti i cinque valori, senza alcun controllo su di essi, puoi copiarli uno ad uno oppure parte a blocchi e parte non facendo i controlli del caso ove necessario. Ad esempio la seguente riporta il dato solamente se la cella contiene un valore diverso da 0 altrimenti segnala il dato mancante:

    .Cells(rCel.Row, "ay").Value = IIf(wsData.Cells(vRow, "j").Value <> 0, wsData.Cells(vRow, "j").Value, "Dato Mancante")

    1. Ricerca: è possibile sapere a priori - con le informazioni presenti nel primo file - in quale provincia risiede il cliente in modo da effettuare una ricerca mirata? Se sì sarà sufficiente indirizzare la ricerca direttamente sul file contenente i clienti di quella provincia ...

    In alternativa, che peraltro ti consiglio vivamente, perché non inserisci tutti i clienti in un unico file, utilizzando un foglio diverso per ogni provincia? La ricerca sarebbe più agevole ma soprattutto più performante non necessitando l'apertura di 4 diversi file nel peggiore dei casi.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-09-13T00:59:44+00:00

    Grazie mille per la celere risposta e cosi dettagliata.

    Allora ho creato la macro e alla sua esecuzione(SENZA aver modificato il tuo codice) svolge correttamente l'operazione di ricerca e copia dei dati per tutti i codici.

    Le problematiche che ho notato sono:

    1. Alcuni codici clienti sono presenti nel foglio dove viene effettuata la ricerca ma non hanno dati(al posto dei due codici hanno 0 nella prima cella e 0 nella seconda) quindi al posto di riportare 0 sarebbe opportuno riportare Dati Mancanti.

    2.Il file da cui seleziono i codici è quello completo, per il file dove ricerco i codici, ho 4 file differenti ognuno in relazione ad una provincia. (Trento, Mantova, Piacenza, Verona). Quindi con la macro da te proposta svolge correttamente la ricerca copia per i codici clienti di Trento ma per le altre aree popola il file scrivendo "not found".

    Vi è un modo per eseguire la macro con i 4 file differenti senza ogni volta compiere l'operazione corretta solo per una Provincia e popolando il resto del file come se i codici non vi fossero?

    Potrei creare 4 file differenti, eseguire la macro 4 volte e poi unire i 4 file con i dati in uno unico come ultima soluzione.

    3.Le colonne da copiare sono 5, non 4 errore mio al quale ho facilmente riparato.

    Ancora grazie mille per il tuo aiuto, mi hai praticamente salvato da giornate spese a studiare VBA o eseguire il tutto manualmente.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2014-09-12T14:02:04+00:00

    ...

    A me servirebbe una macro che svolga l'operazione per tutti i codici cliente, in automatico o su mio inserimento/selezione del codice cliente.

    Questa è un immagine del file B dal quale devo prelevare i dati. i codici clienti sono ripetuti due volte, a me serve selezionare il primo che viene trovato dalla funzione Trova in modo che copi i dati sulla riga del primo codice.

    Per il momento verifica il funzionamento della macro allegata, dopo le necessarie personalizzazioni. Verificato il corretto funzionamento faremo in modo che si azioni ad ogni nuovo codice inserito.


    Sub RiportaDatiCliente()

    Dim wbData As Workbook

    Dim wsData As Worksheet

    Dim rCel As Range

    Dim sFolderName As String, sBookName As String

    Dim lColonnaRicerca As Long, lLastRow As Long

    Dim bOpened As Boolean

    Dim vRow As Variant, vCode As Variant

    '--- parametri ricerca da modifcare

    sFolderName = ThisWorkbook.Path & ""

    sBookName = "bomboloni Gpl MODIFICATO.xls"

    lColonnaRicerca = 4   ' d

      '----------------------------------------------

      Application.ScreenUpdating = False

      '--- referenzia il file utilizzato per la ricerca, può essere aperto o chiuso

      On Error Resume Next

      Set wbData = Workbooks(sBookName)

      If wbData Is Nothing Then

        Set wbData = Workbooks.Open(sFolderName & sBookName, , True)

        bOpened = True

      End If

      On Error GoTo Uffa

    '--- modifica il nome del foglio nel quale effettuare la ricerca

    Set wsData = wbData.Worksheets("Foglio1")

    '--- modifica il nome del foglio che contiene i codici da ricercare

    With ThisWorkbook.Worksheets("Foglio1")

    '--- i codici si trovano in colonna Q

    lLastRow = .Cells(Rows.Count, "q").End(xlUp).Row

        For Each rCel In .Range("q2:q" & lLastRow)

          vCode = rCel.Value

          If Len(vCode) Then

            vRow = Application.Match(vCode, wsData.Columns(lColonnaRicerca), 0)

            If Not IsError(vRow) Then

      '--- copia 4 celle a partire dalla colonna J e le incolla a partire dalla colonna ay

    .Cells(rCel.Row, "ay").Resize(, 4).Value = wsData.Cells(vRow, "j").Resize(, 4).Value

            Else

    .Cells(rCel.Row, "ay").Resize(, 4).Value = Array("not found", "not found", "not found", "not found")

            End If

          End If

        Next

      End With

    ExitHere:

      On Error Resume Next

      If bOpened Then wbData.Close False

      Set rCel = Nothing: Set wsData = Nothing: Set wbData = Nothing

      Exit Sub

    Uffa:

      Call MsgBox("Ohibò, si è verificato il seguente errore: " & vbNewLine & _

                  CStr(Err.Number) & ": " & Err.Description & vbNewLine & vbNewLine & _

                  "Codice in elaborazione: " & vCode, _

                  vbCritical + vbOKOnly, "Error message")

      Resume ExitHere

    End Sub


    [EDIT]

    Aggiungo, che se i file sono entrambi aperti, come appare dal tuo codice, potrebbe essere sufficiente utilizzare una formula per ottenere le informazioni desiderate. 

    Se non le conosci puoi approfondire l'utilizzo delle seguenti funzioni:

    CERCA.VERT()

    CONFRONTA()INDICE().

    La risposta è stata utile?

    0 commenti Nessun commento