Copiare righe da altri file



  • Copiare righe da altri file
    di Berio data: 04/02/2017 11:52:28

    Buon giorno, premetto che questa domanda l’ho già fatta su un altro forum ma la persona (gentilissima) che mi ha risposto con le sue competenze è arrivata fino ad un certo punto e quindi io non ho risolto la questione e mi sembrava scortese rilanciarla, quindi chiedo qui per altri pareri, tutto questo per dire che non è un cross post ma ho necessità di risolvere questo problema.
    Il mio livello di conoscenza di VBA è pari a zero, tanto per dire ho scoperto da poco che si possono registrare le macro…quindi abbiate pietà.
    Veniamo al problema, io vorrei far confluire su di un file che chiamerò Destinazione tutti i nuovi record che vengono inseriti in altri file, tecnicamente ci dovrebbe essere il confronto fra il file Destinazione e gli altri file e registrare (sul file Destinazione) solo le nuove righe escludendo di fatto i doppioni.
    Ho provato importando su Destinazione il foglio di altri file usando la Formattazione condizionale con la formula =A1<>Foglio1!A1 ma mi evidenzia i record sbagliati, ho provato anche con CERCA.VERT ma anche qui non individua le differenze.
    Il problema è complicato dal fatto che all’interno dei file di registrazione ci possono essere delle persone registrate due volte che non deve essere riconosciuti come doppione quindi bisogna impostare il confronto fra due colonne una è il Codice Fiscale l’altra è la Matricola, se questi due record sono uguali allora si che è un doppione.
    Provo a spiegarmi meglio con dei file di prova allegati dove troverete nel file Tab_A, Tab_A-1 e Tab_A-2 una simulazione di inserimento di nuovi record, righe 5- 6 - 7, se si nota la persona registrata in queste ultime tre righe è la medesima e la cosa è voluta non è un doppione e quindi non deve essere riconosciuto come tale, l’unica cosa che la differenzia è sulla colonna Matricola, quindi devo impostare un confronto fra il file Destinazione e Tab_A in modo che se trova due Codici Fiscali uguali prima di riconoscerli come doppioni confronti anche la colonna Matricola, se uguale è un doppione se diverso è un nuovo record.
    Grazie per l’attenzione



  • di mabolsie data: 04/02/2017 16:02:31

    Ciao Berio il primo consiglio che ti darei è di pensare ad un lavoro sviluppato all'interno di un file workbook, sono molto più facili i collegamenti tra fogli.

    cit. "Il problema è complicato dal fatto che all’ interno dei file di registrazione ci possono essere delle persone registrate due volte che non deve essere riconosciuti come doppione quindi bisogna impostare il confronto fra due colonne una è il Codice Fiscale l’altra è la Matricola, se questi due record sono uguali allora si che è un doppione. " ..ed allora come facciamo a fare la scansione se una persona può essere un doppione?

    Se i dati ti arrivano da un foglio esterno potresti fare un copia/incolla nel database creato e far partire le verifiche.

    Ciao Max



  • di Berio data: 04/02/2017 17:50:20

    Grazie mabolsie, cerco di spiegare meglio il concetto di doppioni...se dai un'occhiata ai file allegati per i file Tab_A, B e C hanno la stessa struttura
    colanna 1 : Nome Cognome
    colonna 2 : Codice fiscale
    colonna 3 : Matricola
    e altre colonne

    Struttura file Tab_A

    Nome Cod.F Matricola
    ___________________________________
    Mario MRA (cella vuota) (vuol dire nessun dato)
    Mario MRA 100
    Mario MRA 200
    GINO GNI (Cella vuota)
    Roberto RBT (cella vuota)
    Roberto RBT 300


    Struttura file Destinazione

    Nome Cod.F Matricola
    ___________________________________
    Mario MRA 100
    Mario MRA 200
    GINO GNI (Cella vuota)
    Roberto RBT (cella vuota)
    Roberto RBT 300

    ora devo fare il confronto fra i due file e fare un copia-incolla sul file Destinazione delle sole righe che li differenziano in questo caso solo la riga 1

    Mario MRA (cella vuota)

    quindi non posso fare per esempio un INDICE E CONFRONTA (o una formattazione condizionale con formula) solo sulla colonna Matricola perchè altrimenti mi avrebbe riconosciuto anche i record di Gino e Roberto come assenti nel file Destinazione, di conseguenza devo usare un'altra discriminante per ricavarmi il dato mancante e cioè usare la colonna del codice fiscale.
    Spero di essermi spiegato, concettualmente c'è l'ho in testa e che materialmente non sono capace di realizzarla, se mi date qualche punto di partenza con il VBA magari cerco di capirne qualche cosa.
    Grazie ancora.



  • di mabolsie data: 04/02/2017 20:19:05

    penso che non si possa fare neanche con il VBA.

    però lascia aperta la discussione che magari qualcuno risolve.

    Ciao Max



  • di Albatros54 data: 05/02/2017 08:46:11

    scenario: in una cartella ho tutti i file da confrontare compreso il file destinazione, apri il file destinazione e lanci la macro che si trova al suo interno, ti posto anche il codice, se ho capito quello che chiedi.
    ciao
    albatros54
     
    Public Sub copiabis()
    
        Dim objFSO As Object
        Dim objFolder As Object
        Dim objFile As Object
        Dim wk As Workbook
        Dim wk1 As Workbook
        Dim r As Long
    
        With Application
            .ScreenUpdating = False
        End With
        sPath = ThisWorkbook.Path    ' & "
    uova cartella"    '<< da Modificare
        Set wk1 = Workbooks("DESTINAZIONE.xlsx")
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        Set objFolder = objFSO.GetFolder(sPath)
    
        For Each objFile In objFolder.Files
            myname = Dir(objFile, vbNormal)
            If Left(myname, 1) <> "~" And (Right(myname, Len(myname) - InStrRev(myname, ".")) Like "*xl*") And (myname <> ThisWorkbook.Name) Then
    
                Set wk = Workbooks.Open(objFile.Path)
                irow = wk.Sheets("foglio1").Range("b" & Rows.Count).End(xlUp).Row
                irow1 = wk1.Sheets("foglio1").Range("b" & Rows.Count).End(xlUp).Row
                Set Rng = wk.Sheets("foglio1").Range("b2:b" & irow)
                Set rng1 = wk1.Sheets("foglio1").Range("b2:b" & irow1)
                For Each cl In Rng
                    For Each lc In rng1
                        If cl Like lc And cl.Offset(0, 1) <> lc.Offset(0, 1) Then
                            MsgBox "dato non uguale "
                            cl.Activate
                            irow1 = wk1.Sheets("foglio1").Range("a" & Rows.Count).End(xlUp).Row + 1
                            ActiveCell.Cells.Offset(0, -1).Resize(1, 5).Copy wk1.Sheets("foglio1").Cells(irow1, 1)
                        End If
                    Next
                    wk.Close
                Next
            End If
        Next
        With Application
            .ScreenUpdating = True
        End With
        Set wk = Nothing
        Set sh = Nothing
        Set objFile = Nothing
        Set objFolder = Nothing
        Set objFSO = Nothing
    
    End Sub
    
    






  • di Berio data: 05/02/2017 21:42:10

    Grazie Albatros, scusa il ritardo ma ho un raffreddore che mi sta uccidendo, ho inserito la tua macro nel file Destinazione e dove hai indicato di modificare ho sostituito con il percorso dove risiedono i file, ma mi dice indice non trovato... dove sbaglio?
    Grazie ancora.



  • di Albatros54 data: 06/02/2017 16:44:29

    Se lo scenario è quello che ti ho indicato io, non devi modificare il codice, non considerare la nota.
    ciao
    albatros54





  • di Berio data: 06/02/2017 22:41:33

    Si Albatros, continua a darmi Errore di run-time '9': indice non incluso nell'intervallo.
    Tutti i file risiedono sulla cartella (per non sbagliare l'ho chiamata nuova cartella), dal file Destinazione ho aperto VBA, in alto a dx doppio clic su Foglio1 si apre una finestra, copio-incollo il tuo codice.
    Grazie per la pazienza.