Macro APRICOPIAINCOLLASALVA e CHIUDI



  • Macro APRI/COPIA/INCOLLA/SALVA e CHIUDI
    di Jaqen77 data: 05/05/2016 15:21:19

    Ciao a tutti,

    vi chiedo una mano per un file forse impossibile ma ci provo:
    ci sono tre file allegati, su quello di "Test" avrei bisogno che fosse presente una macro che all'apertura vada ad aprire, copiare ed incollare il contenuto delle celle C4:D5 presenti sugli altri due file (Uno e Due), e che poi li chiuda in automatico.
    E' possibile?
    Grazie mille!



  • di cromagno data: 06/05/2016 00:24:32

    Ciao Jaqen77,

    possibile è possibile... con qualche accorgimento ed eventualmente integrare il codice con dei controlli nel caso non dovesse trovare i file in cui copiare i dati.

    Nel modulo di classe di "Questa_cartella_di_lavoro" metterai il primo codice (sotto) per richiamare la macro che si trova in un modulo standard (il secondo codice nel riquadro giallo).

    Ti riallego il file ("Test - Copia.xlsm")...

    P.S.
    Ho supposto che tutti i file si trovino nella stessa cartella, in caso contrario dovrai modificare la variabile "percorso".
     
    Private Sub Workbook_Open()
    Call Copia_dati
    End Sub
    
    
    Sub Copia_dati()
    Dim i As Long, Dati As Range, uCol As Long, Nome_file As String
    Dim percorso As String
    
    percorso = ThisWorkbook.Path & ""
    Application.ScreenUpdating = False
    With Worksheets("Test")
        uCol = .Cells(3, Columns.Count).End(xlToLeft).Column
        For i = 3 To uCol Step 2
            Nome_file = .Cells(3, i).Value & ".xlsx"
            Set Dati = .Range(Cells(4, i), Cells(5, i + 1))
            Dati.Copy
            Application.DisplayAlerts = False
            Workbooks.Open percorso & Nome_file
            Range("C4").PasteSpecial xlPasteValues
            Range("C4").Select
            ActiveWorkbook.Close True
            Application.DisplayAlerts = True
        Next i
        Application.CutCopyMode = False
    End With
    Application.ScreenUpdating = False
    Set Dati = Nothing
    MsgBox "Dati copiati!", vbInformation
    End Sub
    



  • di Jaqen77 data: 06/05/2016 11:06:55

    Ciao cromagno,
    grazie mille per la risposta, sempre veloci e competenti, siete grandissimi.
    Forse non sono stato troppo preciso però...i dati andrebbero letti dai file Uno e Due e copiati su Test, e non viceversa come mi sembra esegua il codice che hai riportato.
    Inoltre ti chiedo un'altra cortesia: sui file Uno e Due aggiungendo su ogni riga della colonna B una data in formato "gg mm aa hh:mm", è possibile implementare (su file Test) anche un controllo sulla data che consenta di copiare solo quei dati con data ed orario di riferimento precedenti a quella attuale =ADESSO() ?
    E magari anche una funzione che non dia errore e chiuda forzatamente i file Uno e Due se in uso al momento dell'apertura di Test?

    Ti ringrazio moltissimo.



  • di cromagno data: 06/05/2016 18:13:45

    Ciao,
    si, avevo capito il contrario di quello che intendevi

    Comunque i metodi da usare (per fare l'inverso di quello che ho fatto) sono pressapoco gli stessi.
    Hai già provato a farlo da solo?

    Per quanto riguarda le nuove richieste, allega 1 file per capire bene come sono realmente disposte queste "date" e che formato hanno.



  • di Jaqen77 data: 07/05/2016 12:16:14

    Ciao,

    ho allegato il nuovo Test2, con data e orario in colonna B, non riallego anche i file Uno e Due ma dovranno avere gli stessi riferimenti temporali del file Test2, sulle stesse righe e colonna.
    Ho provato ad adattarlo ma con scarsi risultati...purtroppo sono alle prime armi e sto cercando di imparare ma anche se appassionante è tosta!

    Grazie ancora!



  • di cromagno data: 08/05/2016 11:00:21

    Ciao,
    prova con il codice sotto...

    P.S.
    Non capisco cosa intendi con questa frase:

    E magari anche una funzione che non dia errore e chiuda forzatamente i file Uno e Due se in uso al momento dell'apertura di Test?

    A me non da nessun errore anche se un file è già aperto...
    Comunque ho aggiunto queste righe che ti dovrebbero chiudere tutti gli altri file aperti (salvandoli prima) al momento dell'avvio del codice:


    For Each Aperti In Workbooks
    If Aperti.Name <> ThisWorkbook.Name Then
    Aperti.Close True
    End If
    Next


    ti riallego il file ("Test - ultimo.xlsm")...
     
    Sub Copia_dati()
    Dim i As Long, Dati As Range, uCol As Long, Nome_file As String
    Dim percorso As String, uRiga As Long, j As Long, Aperti As Workbook
    
    percorso = ThisWorkbook.Path & ""
    Application.ScreenUpdating = False
    
    For Each Aperti In Workbooks
        If Aperti.Name <> ThisWorkbook.Name Then
            Aperti.Close True
        End If
    Next
    
    With Worksheets("Test")
        uCol = .Cells(3, Columns.Count).End(xlToLeft).Column + 1
        uRiga = .Range("C" & Rows.Count).End(xlUp).Row
        .Range(Cells(4, 3), Cells(uRiga, uCol)).ClearContents
        
        For i = 3 To uCol Step 2
            Nome_file = .Cells(3, i).Value & ".xlsx"
            Application.DisplayAlerts = False
            Workbooks.Open percorso & Nome_file
            For j = 4 To uRiga
                If Cells(j, 2).Value <= Now Then
                    .Cells(j, i).Value = Cells(j, 3).Value
                    .Cells(j, i + 1).Value = Cells(j, 4).Value
                End If
            Next j
            ActiveWorkbook.Close True
            Application.DisplayAlerts = True
        Next i
        Application.CutCopyMode = False
    End With
    Application.ScreenUpdating = False
    Set Dati = Nothing
    MsgBox "Dati copiati!", vbInformation
    End Sub



  • di Jaqen77 data: 09/05/2016 18:01:59

    Perfetto!!!
    In merito all'errore è che avevo provato a modificare il codice (si vede in maniera non corretta) e non funzionava ma il tuo ultima va benissimo.

    Un'informazione: mi spieghi solo la necessità di inserire quel .ClearContents ?
    Inoltre se avessi necessità di copiare su Test più valori in range C4:D50 da ogni file (da Uno, da Due. etc....) in che modo va adattato il codice?

    Grazie ancora sei stato gentilissimo!



  • di cromagno data: 10/05/2016 03:35:20

    Ciao,

    Quel .ClearContents serve per cancellare i dati già esistenti nella tabella del foglio "Test" in quanto se le
    nuove date non dovessero soddisfare le condizioni impostate (inferiori ad oggi), il codice non dovrebbe ricopiare alcun
    dato ma nel foglio "Test" avresti comunque i dati vecchi...il che sfalserebbe il risultato.
    Come regola generale, prima di copiare dei dati è sempre meglio eliminare quelli precedenti che si trovano nelle celle
    di destinazione.

    Per la seconda domanda....

    questa parte di codice:


    For j = 4 To uRiga
    If Cells(j, 2).Value <= Now Then
    .Cells(j, i).Value = Cells(j, 3).Value
    .Cells(j, i + 1).Value = Cells(j, 4).Value
    End If
    Next j


    prende in considerazione l'ultima riga della tabella nel foglio "Test" (attualmente la riga 5) e copia i dati dai vari fogli.
    Quindi, al momento è un valore variabile. Se sai per certo che devi copiare fino alla riga 50, ti basta
    sotituire (nel ciclo For...Next) la variabile "uRiga" con il valore 50 :


    For j = 4 To 50
    If Cells(j, 2).Value <= Now Then
    .Cells(j, i).Value = Cells(j, 3).Value
    .Cells(j, i + 1).Value = Cells(j, 4).Value
    End If
    Next j



  • di cromagno data: 14/05/2016 23:50:10

    Ciao,
    ho visto che hai tolto il "Risolto" dalla discussione e non avendo avuto alcun riscontro all'ultimo post non capisco se hai effettivamente risolto oppure no.



  • di Jaqen77 data: 17/05/2016 07:12:48

    Scusa devo aver tolto la spunta senza renderemene conto mentre abbozzavo un altro post....volevo chiederti un'ultima cosa: come modificare il codice nel caso volessi che sul foglio "Test" le celle non vuote (quindi già copiate precedentemente) non vengano invece sovrascritte?



  • di cromagno data: 17/05/2016 07:18:50

    Essendo passato un pò di tempo, i file allegati non sono più disponibili e quelli che avevo li ho eliminati credendo che avessi risolto.
    Francamente non ricordo bene quello che abbiamo fatto, quindi dovresti rinfrescarmi le idee e riallegare il file.



  • di Jaqen77 data: 17/05/2016 09:33:09

    Ho riallegato i file!