Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] Macro per impilare più file xlsx

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] Macro per impilare più file xlsx

Postdi dp8 » 07/11/12 12:26

Salve,
sono un newbie in ambito VBA e vi chiedo un aiuto per compilare una macro che mi consenta di impilare più file excel in uno solo.
Nel dettaglio:
- nella cartella "Export Excel" posizionata sul desktop sono presenti più file excel, nominati 1,2,3 sino a "n" dove "n" è il numero di file presenti nella cartella.
-in ogni file ho un solo foglio chiamato "Excel".
- per tutti i file nella cartella vorrei che venisse copiato il range A2:AR2 e riportato in un nuovo file chiamato "DB".
Ho provato a cercare una discussione con un problema simile al mio, ma non ho trovato nulla.
Riuscite a darmi una mano?
Grazie
dp8
Utente Junior
 
Post: 11
Iscritto il: 07/11/12 12:07

Sponsor
 

Re: [Excel] Macro per impilare più file xlsx

Postdi Flash30005 » 07/11/12 14:17

Ciao Dp8 e benvenuto nel Forum

Hai dato un'occhiata a questa discussione?

ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: [Excel] Macro per impilare più file xlsx

Postdi Anthony47 » 07/11/12 16:19

Temo che lo stesso approccio della discussione linkata da Flash sia duro da applicare, trattandosi di copiare 40 e oltre celle.
Si puo' pero' riciclare la logica del ciclo per aprire il singolo file e copiare quello che serve all' interno del file DB. Ad esempio:
Codice: Seleziona tutto
Sub PCF_DP8()
Dim SourceDir As String, ShName As String, I As Long
SourceDir = "C:\Users\UTENTE \Documents\"    '<<< La tua directory con \ finale
myCFile = Dir(SourceDir & "\*.xls*")     
Do
    If myCFile = "" Then Exit Do
    Workbooks.Open Filename:=SourceDir & myCFile
    Sheets(1).Move Before:=ThisWorkbook.Sheets(1)
    Windows(myCFile).Close savechanges:=False
'
'*** altre istruzioni per cancellare dal foglio corrente le aree che non servono
'
    DoEvents
myCFile = Dir
Loop
End Sub

Creati un file vuoto, inserisci in Modulo1 la macro e salvalo col nome DB.xlsm; personalizza l' istruzione marcata <<< e poi mandala in esecuzione: ti replichera' nel file DB tutti i fogli degli N file trovati; se necessario inserisci nella posizione marcata *** le istruzioni che servono a cancellare le parti del foglio che non desideri importare, istruzioni che puoi ottenere registrando in proprio una macro mentre esegui disciplinatamente tutte le cancellazioni che ti servono.
Questa e' stata la mia interpretazione della richiesta, che ha omesso particolari importanti su dove importare le informazioni.
Se non e' quello che chiedevi allora prova a descrivere nuovamente.

Comunque fai sapere.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per impilare più file xlsx

Postdi dp8 » 08/11/12 12:19

Ringrazio entrambi per aver risposto.
Ho utilizzato il codice scritto Anthony47 e di fatto funziona, in parte, almeno per il primo file copia correttamente nel file DB le informazioni contenute nel file 1, però non esegue il loop..quindi non apre il file 2 copia tutto in DB, apre il file 3 ecc..
dal debug il problema risulta essere questa parte:

Windows(myCFile).Close savechanges:=False

pare che non riesca a chiudere il file che legge..
Qualche idea per riuscire a farlo funzionare?
Grazie ancora per l'aiuto.
dp8
Utente Junior
 
Post: 11
Iscritto il: 07/11/12 12:07

Re: [Excel] Macro per impilare più file xlsx

Postdi Flash30005 » 08/11/12 15:11

La macro funziona perfettamente
sei sicuro che hai copiato tutto correttamente ed, eventualmente, adattato alle tue esigenze senza aver alterato la sintassi?

ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: [Excel] Macro per impilare più file xlsx

Postdi Anthony47 » 08/11/12 15:28

Confermo: ho ripetuto il collaudo della mia macro, e il risultato e' quello che avevo descritto.
Puoi spiegare come hai personalizzato la macro, come la usi e cosa succede quando la lanci?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per impilare più file xlsx

Postdi dp8 » 09/11/12 12:28

Ho copiato esattamente il codice scritto da Anthony47:
http://imageshack.us/photo/my-images/100/1211091208202.jpg/
modificando il solo percorso della cartella.
quando eseguo la macro,come scritto ieri, riesce a copiare le 2 righe presenti nel file 1 ma poi mi esce questo messaggio:
http://imageshack.us/photo/my-images/152/1211091207471.jpg/
interrompendo la macro.
Visto che mi avete confermatoil funzionamento della macro, è probabile un mio errore oppure una differente verisone excel può influire? io uso la versione 2010..
dp8
Utente Junior
 
Post: 11
Iscritto il: 07/11/12 12:07

Re: [Excel] Macro per impilare più file xlsx

Postdi Anthony47 » 09/11/12 13:23

Humm...
Ovviamente la macro non ha copiato le righe presenti nel primo file, ma ha copiato l' intero foglio del primo file.
La cosa strana e' che, guardando la finestra VBAProject nella prima immagine, sembra che ci sia il solo file DB.xlsm aperto, cioe' che "l' altro file" sia gia' chiuso...
Prova questa variante, che impedisce l' esecuzioni di altre macro durante la sua esecuzione.
Codice: Seleziona tutto
Sub PCF_DP8()
Dim SourceDir As String, ShName As String, I As Long
SourceDir = "C:\Users\A_Monge1\Documents\"    '<<< La tua directory
Application.EnableEvents = False

myCFile = Dir(SourceDir & "\*.xls*")
Do
    If myCFile = "" Then Exit Do
    Workbooks.Open Filename:=SourceDir & myCFile
    Sheets(1).Move Before:=ThisWorkbook.Sheets(1)
'    Windows(myCFile).Close savechanges:=False
    Workbooks(myCFile).Close savechanges:=False
'
'altre istruzioni per cancellare dal foglio corrente le aree che non servono
'
    DoEvents
myCFile = Dir
Loop
Application.EnableEvents = True

End Sub

Se comunque non risolvi, quando va in errore leggi il contenuto della variabile myCFile (posiziona il cursore sopra la parola myCFile, e dopo un paio di secondi dovresti visualizzarne il valore) e dimmi se un file con quel nome e' al momento aperto in Excel.

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per impilare più file xlsx

Postdi ricky53 » 10/11/12 00:37

Ciao,
prima leggi l'intervento precedente al mio.

Volevo dare il mio contributo :
Codice: Seleziona tutto
Option Explicit
Option Compare Text

Public RR As Long, I As Long, J As Long, K As Long, Inizio As Double
Public MioPercorso As String, MioFile As String, Nome_Precedente As String
Public Wb_In As Workbook, Ws_In As String, Wb_Out As Workbook, Ws_Out As String

Sub Leggi_Dati_e_Copia_Celle()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.AskToUpdateLinks = False
   
    Inizio = Timer
    Nome_Precedente = ActiveWorkbook.Name
    Sheets("Dati_Copiati").Select

    Set Wb_Out = ActiveWorkbook
    Ws_Out = Wb_Out.ActiveSheet.Name

    MioPercorso = "D:\Temp\Excel\Copiare_dati_da_File\" ' <<======== Qui devi scrivere il percorso dove hai i File
    MioFile = Dir(MioPercorso & "*.xls")
   
    RR = Range("A" & Rows.Count).End(xlUp).Row
    If RR < 2 Then
        RR = 2
    End If
    Range("A2:AR" & RR).ClearContents '<<====== Vengono cancellati i dati preesistenti
   
    J = 2
    Do While MioFile <> ""
        Workbooks.Open Filename:=MioPercorso & MioFile
        Set Wb_In = ActiveWorkbook
        Ws_In = Wb_In.ActiveSheet.Name
        Wb_In.Sheets(Ws_In).Range("A2:AR2").Copy ' <<==== Intervallo da copiare
        Wb_Out.Sheets(Ws_Out).Range("A" & J).PasteSpecial xlPasteValues
        Windows(MioFile).Close SaveChanges:=False
        J = J + 1
       
        MioFile = Dir()
    Loop
   
    Set Wb_In = Nothing
    Set Wb_Out = Nothing
   
    Application.DisplayAlerts = True
    Application.AskToUpdateLinks = True
    Application.ScreenUpdating = True
   
    MsgBox "Elaborazione Effettuata in  " & Format(Timer - Inizio, "0.00") & "  secondi"
End Sub


E' un po' lunga ma dovrebbe andare bnee per le tue necessità.

Copia il codice in un nuovo "Modulo" ed eseguilo con "F5".

A prove concluse e risultato ottenuto poi potrai associarlo ad un "Pulsante" o ad una "Combinazione di Tasti" tipo "Ctrl+s" (se non sai come fare lo vedremo a risultato avuto)
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [Excel] Macro per impilare più file xlsx

Postdi Anthony47 » 10/11/12 13:05

Ricky non l' ha detto, ma la sua macro fa una cosa diversa da quello che faceva la mia: mentre la mia copia nel file DB l' intero foglio degli N file, la macro di Ricky copia in un unico foglio i dati prelevati dagli N file.
Volendo capire il perche' di questa scelta ho dovuto rileggere "meglio" la discussione dall' inizio; cosi' ho notato (che sveglio!) che il range che dp8 chiede sia copiato e' costituito da una unica riga. Questo rende ragionevolmente errata la mia interpretazione (copiare l' intero foglio) e corretta l' interpretazione di Ricky.

Alla luce di tutto cio' correggo la mia macro:
Codice: Seleziona tutto
    Sub PCF_DP8B()
    Dim SourceDir As String, ShName As String, I As Long
    SourceDir = "C:\Users\UTENTE\Documents\"    '<<< La tua directory
    DestSh = ActiveSheet.Name
    J = 2
    Application.EnableEvents = False
'
    myCFile = Dir(SourceDir & "\*.xls*")
    Do
        If myCFile = "" Then Exit Do
        Workbooks.Open Filename:=SourceDir & myCFile
        Sheets(1).Range("A2:AR2").Copy
        ThisWorkbook.Sheets(DestSh).Cells(J, 1).End(xlUp).Offset(1, 0) _
        .PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        Application.CutCopyMode = False
        J = J + 1
    '    Windows(myCFile).Close savechanges:=False
        Workbooks(myCFile).Close savechanges:=False
        DoEvents
    myCFile = Dir
    Loop
    Application.EnableEvents = True
'
    End Sub
Le modifiche sono all' interno del Do /Loop e consistono appunto nella variazione da "Copia foglio intero e aggiungilo a DB" a "Copia l' intervallo A2:AR2 e accodalo a quanto gia' presente in DB"; il foglio di DB in cui avviene l' accodamento e' quello attivo al momento del lancio della macro.

Ciao a tutti.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per impilare più file xlsx

Postdi ricky53 » 10/11/12 17:43

Ciao,
e visto che io sono un ... patito delle prestazioni e dell'ottimizzazione ( e ... non aggiungete altro) propongo:

1 di inserire nella mia macro le seguenti istruzioni
Codice: Seleziona tutto
    Application.EnableEvents = True
insieme alla altre già presenti che disattivano lo schermo, gli alert ed i collegamenti
Codice: Seleziona tutto
        Application.CutCopyMode = False
dopo il comando PasteSpecial

2. di inserire nella macro di Anthony le seguenti tre istruzioni
Codice: Seleziona tutto
    Application.DisplayAlerts = False ' Dasattiva i messaggi di alert
    Application.AskToUpdateLinks = False ' disattiva il messaggio sui collegamenti ad altri file
    Application.ScreenUpdating = False ' Dasattiva lo schermo


3. di togliere dalla macro di Anthony la seguente istruzione
Codice: Seleziona tutto
DoEvents


E qui potrebbe nascere una dissertazione se toglierla o meno.


Attenzione: ricordarsi da impostare a "True" a fine macro quanto disattivato
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [Excel] Macro per impilare più file xlsx

Postdi Anthony47 » 10/11/12 19:02

Ho inserito il mio post delle 13:05 essenzialmente per precisare la diversa prestazione delle due macro e a quel punto per correggere la mia, visto che considero la tua interpretazione quella corretta; pero' secondo me rischiamo di confondere l' utente con due proposte.
Ricordo che l' ultima notizia da dp8 dava un errore su chiusura file, con pero' il file (per quello che avevo dedotto dall' immagine che aveva allegata) gia' chiuso; da qui l' ipotesi che il file aperto dalla macro contenesse a sua volta delle macro che lo portassero a chiudersi da solo, e la conseguente aggiunta di Application.EnableEvents = False /True nel mio post del 9/11 @13:23 confermato nella revisione di oggi pomeriggio.

Ho messo volutamente la DoEvents per poter "breakare" la macro se dovesse andare in loop, ma non escludo che essa possa facilitare la manifestazione di altre situazioni, anche se ho cercato di "pararmi" usando sempre riferimenti espliciti.
Inoltre e' possibile che tu volessi inserire Application.EnableEvents = False all' inizio e =True alla fine?

In quanto a "prestazioni" fintanto che l' utente non ci dice che "ho fatto cosi' e ora funziona" temo che sia presto per parlarne.

Ciao!
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per impilare più file xlsx

Postdi dp8 » 12/11/12 11:47

Vorrei ringraziare tutti coloro che hanno preso parte alla discussione, la macro con le ultime correzioni funziona.
Ho utilizzato il codice di Anthony47 del 10/11/12 13:05 ed effettivamete la macro copia il range impostato da tutti i file presenti nella cartella desiderata, ma restituisce un messaggio di errore quando però ha già fatto il suo dovere. Ho provato ad aggiungere le correzioni suggerite da ricky53 per eliminare l'errore che si presenta a fine macro, senza troppa fortuna però. Se inserisco le modifiche la macro non funziona, sono sicuro che è colpa mia che sbaglio a scrivere il codice..
dp8
Utente Junior
 
Post: 11
Iscritto il: 07/11/12 12:07

Re: [Excel] Macro per impilare più file xlsx

Postdi Anthony47 » 12/11/12 11:55

Che errore ti da' e su quale riga?
(Va bene l' uso di immagini, come avevi fatto la volta precedente)

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per impilare più file xlsx

Postdi dp8 » 12/11/12 12:21

Ciao, questo è il primo avviso:
Immagine
Clicco NO, altrimenti mi ritorna il foglio vuoto (mi cancella le righe che ha correttamente riportato), poi appare:
Immagine
Debug:
Immagine
dove, SourceDir=la cartella dove sono i file e myCFile="DB.xslm"
dp8
Utente Junior
 
Post: 11
Iscritto il: 07/11/12 12:07

Re: [Excel] Macro per impilare più file xlsx

Postdi ricky53 » 12/11/12 13:59

Ciao,
la macro che esegui si trova nel file DB.xlsm e questo file si trova nella stessa cartella dove ci sono i file da cui si copiano i dati?

Se la risposta è SI allora sposta il file DB.xlsm in un'altra cartella.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [Excel] Macro per impilare più file xlsx

Postdi dp8 » 12/11/12 14:30

ricky53 è proprio come hai detto tu, ho spostato il file e funziona tutto perfettamente senza errori.
Vorrei ringraziare sia te che Anthony47 per l'aiuto, mi avete risparmiato tanto lavoro noioso.
Ciao e grazie!
dp8
Utente Junior
 
Post: 11
Iscritto il: 07/11/12 12:07

Re: [Excel] Macro per impilare più file xlsx

Postdi ricky53 » 12/11/12 16:10

Bene,
partecipazione, collaborazione e sinergia e si arriva al risultato.

Buon proseguimento.
Alla prossima.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Macro per impilare più file xlsx":


Chi c’è in linea

Visitano il forum: Nessuno e 22 ospiti