Unire dati di più fogli



  • Unire dati di più fogli
    di Damatta (utente non iscritto) data: 17/01/2013 11:43:39

    Ciao a tutti!
    Provo a chiedere in questa sezione, se dovessi aver sbagliato chiedo scusa in anticipo sperando però di poter ricevere in ogni caso un bell'aiuto.

    Il problema è il seguente:

    Ho svariati fogli di lavoro nello stesso file .xls, tutti nominati differentemente ma con stessa struttura
    La struttura prevede ovviamente una prima riga d'intestazione e a seguire tutti i dati che mi servono.

    Ora il problema (molto probabilmente banale per voi ma non per me):
    Io dovrei raggruppare in un altri fogli di lavoro solo alcuni fogli di lavoro.

    Spiego meglio facendo un esempio.
    Ho 10 fogli tutti chiamati per cliente (Gianni, Mauro, Filippo, Francesco etc...) con stessa struttura in colonne ma ovviamente con righe diverse a seconda dei dati a disposizione.

    Io ora vorrei poter copiare in un foglio già esistente (e con stessa struttura) chiamato per esempio "Clienti veneti" solo i dati di quei fogli (per es. solo il foglio Gianni e il foglio Mauro). E fare la stessa cosa con "Clienti lombardi" copiando i dati di Filippo e Francesco.

    Ho semplificato il tutto perchè poi il lavoro che devo fare è ben diverso ma questa è l'operazione che non riesco a fare. Come posso fare per evitare il tristissimo copia e incolla?



  • di Vecchio Frac data: 17/01/2013 17:55:18

    La copia riguarderebbe l'intero foglio dei clienti specificati o soltanto un elenco filtrato all'interno di essi?
    Alle volte il triste copia incolla è la soluzione più veloce :)




  • Julio
    di Julio data: 17/01/2013 22:48:30

    Mi permetto di dare anch'io un consiglio.
    Sul foglio di destinazione, in ogni sua cella, farei un = alla cella del foglio di partenza. Se i dati sono numeri potresti fare delle somme in modo.
    Ciao



  • di Damatta (utente non iscritto) data: 17/01/2013 23:43:03

    l'esempio era solo semplificativo, in realtà i fogli che ho sono almeno una 50ina e vorrei copiare su un foglio dello stesso file i dati in sequenza di alcuni fogli specifici.

    Come si fa a generare un codice che mi permetta di copiare i dati dalla riga 2 fino all'ultima non vuota di fogli specifici tutti su un foglio preciso dalla riga 2 e in sequenza.

    Il risultato dovrebbe essere così

    Foglio Veneto
    riga 1 intestazione
    riga 2 prima riga foglio Alberto
    riga n ultima riga non vuota foglio Alberto
    riga n+1 prima riga foglio Dario
    riga n+n ultima riga non vuota foglio Dario


    Foglio Lombardia
    riga 1 intestazione
    riga 2 prima riga foglio Bruno
    riga n ultima riga non vuota foglio Bruno
    riga n+1 prima riga foglio Enrico
    riga n+n ultima riga non vuota foglio Enrico




    Insomma una serie di foglio che si compilino a seconda degli altri fogli...

    Spero di essermi spiegato leggermente meglio,
    grazie intanto!!!



  • di Vecchio Frac data: 18/01/2013 10:53:46

    Allega un estratto del file con alcuni dati di esempio e magari solo un paio di fogli, non ho il tempo di ricostruire lo scenario. Comunque la buona notizia è che si può fare in automatico e anzi argomenti simili sono già stati affrontati qui tempo fa.





  • di Damatta (utente non iscritto) data: 18/01/2013 11:22:57

    Ho allegato il file entrando un po' più nello specifico di quanto mi serve
    (spero che il file allegato sia arrivato)

    in sort Error devono finire i dati dei fogli "Documents" e "Release"
    in Docs Discrepance devono finire "Edi correction" e "Standard"
    in Not Keyed infine deve essere compilato con i dati di "Not on File" e "Ok Dis no Dogana"

    E' tutto fatto molto semplificato, ma l'idea di fonod è questa.
    Trovare la macro che m faccia inserire automaticamente i dati di fogli specifici in un altro foglio specifico (ovviamente in sequenza senza salti o sovrapposizioni dalla riga 2 in poi)


    Davvero gentilissimo

    Grazie ancora



  • di Vecchio Frac data: 18/01/2013 11:35:54

    L'allegato è arrivato.
    Approfitto per segnalarti che in foglio Sort Error c'è una sovrabbondanza e sovrapposizione di pulsanti.





  • di Damatta (utente non iscritto) data: 18/01/2013 11:47:42

    grazie della segnalazione.

    Ho cancellato in fretta diversi fogli.
    Non fare caso alle macro ancora in memoria



  • di Vecchio Frac data: 18/01/2013 15:07:52

    Per cominciare dai un'occhiata a come ho impostato il lavoro.
    Allego il mio file ("per damatta - vfrac 2").
    Ho eliminato tutti quei moduli (avrei da fare alcune osservazioni per ottimizzare e migliorare, ma le farò se me lo richiederai) quindi il mio codice lo trovi nell'unico modulo rimasto ("travaso_dati").
    Fa quel che volevi e il codice sarebbe pure da commentare perchè mi sembra interessante :)
    In pratica travasa i dati da ciascuno dei fogli richiesti, a gruppi di due, nei fogli di destinazione corretti.

    Però non trovo nessuna corrispondenza con i primi post della discussione: nomi di persona e nomi di regione, con fogli corrispondenti, nel tuo file non ce ne sono... erano solo esempi presumo.
    Attento poi che ci sono ancora molti e molti pulsanti sovrapposti, che ingrandiscono il file per niente.
    Inoltre la convalida dei dati nelle colonne REASON va rivista perchè non è congruente nei rispettivi fogli (suggerisco un foglio separato per i dati delle convalide e non foglio per foglio).





  • di Damatta (utente non iscritto) data: 19/01/2013 01:10:49

    intanto grazie mille...mi sto avvicinando alla soluzione del caso...

    come avrai visto il file che ti ho girato era molto più grande e avevo cancellato diverse cose.
    Avevo fatto l'esempio di nomi e regioni solo per cercare di semplificare il concetto piuttosto che parlare di Error, Sort Export etc...

    In ogni caso come indizi ci siamo, ma se per caso non volessi inserirli a coppie di 2?
    Voglio dire, se in Sort Error ci devono finire 6 fogli, in Docs Discrepance solo 3 fogli etc...?

    cosa dovrei cambiare nel modulo che mi hai inserito?



  • di Vecchio Frac data: 19/01/2013 09:14:07

    Riporto la Sub completa qui sotto.
    Il trucco è qui:
    For Each v In Array("documents:1", "release:1", "edi correction:2", "standard:2", "not on file:3", "ok dis no dogana:3")

    accoppiato a:
    sh2 = Choose(Split(v, ":")(1), "sort error", "docs discrepance", "not keyed")

    E' la mia implementazione di un dizionario in senso pythonico :)
    In pratica l'Array del For associa un indice numerico ai fogli che devono finire nello stesso foglio mentre il successivo Choose assegna l'indice numerico corretto al foglio di destinazione. Quindi documents e release finiranno nel foglio di indice 1 che il successivo Choose stabilisce che sia "sort error". Il secondo valore in Choose ha indice 2, e così via.

    Parentesi:
    Si poteva anche scrivere
    For Each v In Array("documents:sort error", "release:sort error", "edi correction:docs discrepance", "standard:docs discrepance", "not on file:not keyed", "ok dis no dogana:not keyed")
    e il successivo diventava solo
    sh2 = Choose(Split(v, ":")(1)
    ma la prima soluzione è più chiara anche per mantenimento futuro.
    Chiusa parentesi.

    Quindi devi solo aggiornare l'Array descrivendo per ogni valore tra virgolette la coppia "foglio da cui copiare:indice del foglio in cui copiare" e stabilire nel Choose l'elenco dei fogli di destinazione, considerando che si parte da 1 e si va in avanti.

     
    Sub travaso_dati()
    Dim r_source As Range, r_dest As Range, i As Long, v As Variant
    Dim sh1 As String, sh2 As String
    
        If MsgBox("Sto per travasare i dati:" & vbCrLf & "- da Documents e Release in Sort Error" & vbCrLf & _
            "- da Edi correction e Standard in Docs Discrepance" & vbCrLf & _
            "- da Not on file e Ok Dis no Dogana in Not Keyed" & vbCrLf & vbCrLf & "Vuoi proseguire?", vbQuestion + vbYesNo, "Copia in corso") = vbNo Then Exit Sub
    
    
        For Each v In Array("documents:1", "release:1", "edi correction:2", "standard:2", "not on file:3", "ok dis no dogana:3")
        
            sh1 = Split(v, ":")(0)
            sh2 = Choose(Split(v, ":")(1), "sort error", "docs discrepance", "not keyed")
        
            i = Sheets(sh1).[A1].CurrentRegion.Rows.Count
            Set r_source = Sheets(sh1).Range("A2:F" & i)
            i = Sheets(sh2).[A1].CurrentRegion.Rows.Count
            Set r_dest = Sheets(sh2).Range("A" & i + 1)
        
            r_source.Copy r_dest
        Next
            
        MsgBox "Travaso completato.", vbInformation, "Fatto!"
    End Sub






  • di Damatta (utente non iscritto) data: 19/01/2013 13:03:40

    Spettacolo!!!

    grazie mille!!!