Condividi:        

Importare una lista di file excel in una sola tabella

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

Re: Importare una lista di file excel in una sola tabella

Postdi Anthony47 » 06/06/09 19:25

Qualcosa ti avevo gia' detto qui: viewtopic.php?f=26&t=75664&p=459040#p458684
Una volta che hai il file pippo.txt lo puoi aprire con notepad, poi copi l' elenco e lo incolli in un foglio dove fai "testo in colonna" (Menu /Data /Testo in colonna); oppure lo "importi" senza aprirlo (la procedura e' descritta in testa a questo messaggio, uno di quelli gia' linkati: viewtopic.php?f=26&t=75455#p428651).
Se vuoi puoi registrare una macro mentre fai Importa file, che poi associ a un pulsante (lo trovi nella barra degli strumenti Moduli), cosi' diventa piu' facile ripetere l' operazione quando ne hai bisogno.

Quindi: impara a fare Dati /Importa dati esterni per portare nel tuo file il contenuto di pippo.txt, e quando ti funziona tutto esegui quel processo dopo aver lanciato il registratore di macro (Menu /Strumenti /Macro /Registra nuova macro; il procedimento e' descritto nel messaggio linkato).

Un ulteriore spunto lo trovi in questo post: viewtopic.php?f=26&t=75664&p=459040#p458684
Lì potrai imparare come scrivere una macro che genera da solo il file pippo.txt, semplificando ulteriormente le tue cose; ti interessa solo la prima parte di quel messaggio, ma se non ti fai confondere leggi anche il resto e i messaggi successivi, che descrivono una ulteriore possibile automazione, integrando il comando che lancia il file .bat con il codice che importa pippo.txt.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Sponsor
 

Re: Importare una lista di file excel in una sola tabella

Postdi sacco » 07/07/09 16:31

Ciao a tutti,
espongo qui il mio problema perchè mi sembra pertinente con quanto scritto in precedenza, sperando di non fare confusione.
Ho una serie di files (circa un centinaio, e periodicamente ne vengono aggiunti alcuni), riferiti ognuno ad un particolare prodotto; tutti questi files, salvati con il nome della matricola del prodotto (C000, C001 ...), hanno la stessa tabulazione e manualmente vengono inseriti valori diversi.
Devo creare un ulteriore file di riepilogo che in modo automatico legga alcuni valori scritti nelle celle dei files riferiti al prodotto.
Vorrei impostare il file di riepilogo in questo modo:
- nella colonna H si inserisce manualmente il numero di matricola (a partire dalla riga 4 in giù);
- il programma dovrebbe leggere la matricola e copiare in alcune celle della stessa riga dei valori presi nel file del prodotto denominato con tale matricola;
- mano a mano che si inserisce una nuova matricola nel file di riepilogo (e si crea un nuovo file "prodotto" che corrisponde a tale matricola) il programma dovrebbe andare a leggere i dati che gli interessano, senza bisogno di aprire ulteriori files.

Ho provato ad utilizzare le formule indicate da Anthony47 nel post del 03/10/08 18:26 ed adattarle al mio caso, ma in questo modo i campi non vengono più aggiornati quando si modificano i files "prodotto".
Esistono formule che possono fare al caso mio, senza bisogno di creare una macro?
Se serve una macro il file di riepilogo può comunque essere utilizzato su diversi pc in rete?

Spero di essere stato abbastanza chiaro, aggiungo che lavoro con Excel 2000, che i file riferiti al prodotto si trovano nella cartella F:\COMUNI e che il file di riepilogo dovrebbe stare nella cartella F:\PRODUZIONE (entrambe le cartelle sono su un server e se servisse a semplificare potrei mettere tutti i files in una unica cartella)
Grazie mille,
ciao
sacco
Newbie
 
Post: 6
Iscritto il: 07/07/09 15:17

Re: Importare una lista di file excel in una sola tabella

Postdi Anthony47 » 08/07/09 00:38

C' era stata anche una discussione simile, affrontata con macro: vedi viewtopic.php?f=26&t=64713 e in particolare la macro Collega().

Fai sapere se riesci a utilizzarla...
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare una lista di file excel in una sola tabella

Postdi sacco » 08/07/09 09:15

Grazie a Anthony della solerte risposta!
Purtroppo però non ho mai usato le macro e non sono riuscito ad adattare quella da te consigliata al mio caso, in quanto non capisco il significato di molte righe di codice.
I cambiamenti di cui necessiterei sono:
- le celle da cui devo attingere i dati non sono su di un'unica riga, ma sono sparse (la posizione rimane però sempre la stessa per tutti i files) all'interno di due differenti fogli, rispettivamente 'Tempi di lavoro' e 'Progressivo lavorazione';
- i valori letti dovrebbero essere scritti per riga nel file RIEPILOGO (cosa che effettivamente la macro consigliata fa) ma nel mio caso in fogli diversi, denominati rispettivamente Gennaio, Febbraio, ecc..., a seconda di dove viene scritta la matricola del prodotto.

In alternativa alla macro, potrebbe essere fattibile una formula del tipo:
='F:\XXX\[C099.xls]Tempi di lavoro'!$C$3
in cui si modifichi in automatico il nome del file da leggere in base alla matricola scritta nella riga corrispondente?

Resto a disposizione per chiarimenti e auguro una buona giornata!
sacco
Newbie
 
Post: 6
Iscritto il: 07/07/09 15:17

Re: Importare una lista di file excel in una sola tabella

Postdi Anthony47 » 09/07/09 00:19

Da come la descrivi, la procedura suggerita a FabioGe dovrebbe esserti utile a mettere i dati in 1 file di riepilogo; se poi li vuoi smazzare in tanti fogli (cosa che non ho mai suggerito, ne' lo faccio adesso) lo potrai fare partendo da questo riepilogo.
Metti la directory dei tuoi file in una cella es F1, nel formato #('C:\Directory\SubDir\ (nota i caratteri iniziali e la "\" in fondo); i nomi file da A2 in giu'; il nome foglio e la cella da cui vuoi importare da H1 verso destra nel formato Nomefoglio!'$Colonna$Riga) (es Tempi di lavoro!'$G$12); nota l' esclamativo, l' apostrofo e la parentesi chiusa); poi con la funzione Concatena devi ottenere una stringa del tipo #('F:\XXX\[C099.xls]Tempi di lavoro'!$C$3); la formula in H2 sara' qualcosa come =$F$1&$A2&H$1, che poi copierai il largo e in lungo; poi copi una riga di formule in una posizione di riserva, e sostituisci (nell' area di riepilogo) le formule con i valori (copia/Incolla speciale-valori); infine sostituisci "#" con "=" (tramite il comando Trova/Sostituisci) per ottenere dei link ai fogli elencati in col A (per FabioGe il # veniva sostituito con =Somma, perche' questa era la sua esigenza), nei fogli e celle elencate da H1 verso dx.

Quando aggiungerai in col A nuovi nomi file, bastera' copiare sulla riga le formule di riserva e ripetere il processo; tutta questa fase potra' essere automatizzata tramite una macro registrata aggiungendo poche modifiche, ma ne parleremo piu' avanti.

Prova e fai sapere.
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare una lista di file excel in una sola tabella

Postdi sacco » 10/07/09 08:30

Grazie, con questa procedura sono riuscito ad importare nel file riepilogo i dati che mi interessano.
Non ho capito però cosa intendi quando dici che non hai mai suggerito, ne l'avresti fatto adesso, di smazzare in tanti fogli i valori del riepilogo. E' una procedura che può creare problemi?
Mi dicevi che la procedura può essere automatizzata tramite una macro... in effetti io creo 2/3 files (riferiti ad un particolare prodotto e salvati con la propria matricola) alla settimana, e man mano che li creo vorrei aggiungere nel file riepilogo la riga di dati che si ottiene con la formula da te suggerita. Se fosse possibile la vorrei inserire nel foglio del mese che mi interessa, vale a dire nel foglio in cui vado a scrivere la matricola (se per far questo è necessario avere nel file un foglio di riepilogo generale con tutti i mesi non sarebbe un problema).
Ancora grazie per l'attenzione, ciao.
sacco
Newbie
 
Post: 6
Iscritto il: 07/07/09 15:17

Re: Importare una lista di file excel in una sola tabella

Postdi Anthony47 » 11/07/09 00:26

La mia opinione e' che i dati devono stare tutti insieme, poi se vuoi li vedi o li ricalcoli suddivisi come vuoi tu, usando filtri, tabelle pivot e formule come meglio pare.
Comunque se vuoi lavorare su tanti fogli, e tu sai gia' quale e' il foglio, il processo e' lo stesso.

Per la gestione delle righe aggiunte settimanalmente:
-scrivi un codice nella sua cella; poi registri una macro mentre..
-copi le formule di riserva (anche se sono in altro foglio) e le incolli nella riga del codice
-esegui il Copia/Incolla speciale - Valori
-esegui il Trova/Sostituisci del # con =
-fermi la registrazione macro
A questo punto:
-Alt-F8; dall' elenco "Macro" che ti compare scegli il nome della macro registrata (probabilmmente sara' Macro1) e premi Modifica
-ti si apre l' editor delle macro che ti presenta il codice registrato
-copi tutta la macro (Da Macro1() a End Sub) e posti il codice.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare una lista di file excel in una sola tabella

Postdi sacco » 14/07/09 09:38

Ciao, sono riuscito ad implementare la procedura che mi hai descritto!
Nel foglio 'tab' ho inserito le formule di riserva, mentre nel foglio 'Tempi Gennaio' ho inserito una nuova matricola ed ho registrato la macro mentre effettuavo la procedura per importare i dati che mi interessano.
Il codice della macro è il seguente:

Codice: Seleziona tutto
Sub Macro1()
'
' Macro1 Macro
' Macro registrata il 14/07/2009 da winxp
'
' Scelta rapida da tastiera: CTRL+MAIUSC+A
'
    Range("G7").Select
    Sheets("tab").Select
    Range("G4").Select
    Selection.Copy
    Sheets("Tempi Gennaio").Select
    ActiveSheet.Paste
    Sheets("tab").Select
    Range("I4:N4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Tempi Gennaio").Select
    Range("I7:N7").Select
    ActiveSheet.Paste
    Sheets("tab").Select
    Range("P4:R4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Tempi Gennaio").Select
    Range("P7:R7").Select
    ActiveSheet.Paste
    Range("G7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("I7:N7").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("P7:R7").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("G7").Select
    ActiveCell.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=SOMMA", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=SOMMA", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=SOMMA", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    ActiveCell.Replace What:="#", Replacement:="=SOMMA", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Cells.Find(What:="#", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
        .Activate
    Range("A8").Select
End Sub


La mia idea era di lavorare su tanti fogli (i 12 mesi dell'anno), e che i dati venissero aggiunti nel foglio in cui io scrivo la matricola/avvio la macro. Se però proponi diversamente non posso che darti retta!

Grazie ancora per l'aiuto!!
Fabio
sacco
Newbie
 
Post: 6
Iscritto il: 07/07/09 15:17

Re: Importare una lista di file excel in una sola tabella

Postdi sacco » 14/07/09 11:19

Rilanciando la macro mi sono accorto che dà un errore...
Errore di run-time '1004': La formula digitata contiene un errore
ed eseguendo il debug evidenzia il seguente codice:
Codice: Seleziona tutto
ActiveCell.Replace What:="#", Replacement:="=SOMMA", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False

Quando avevo registrato la macro però non mi aveva dato nessun problema, ed anche ora se vado sulla formula e premo invio la calcola correttamente senza fare nessuna modifica.
Forse ti è utile saperlo.

Fabio
sacco
Newbie
 
Post: 6
Iscritto il: 07/07/09 15:17

Re: Importare una lista di file excel in una sola tabella

Postdi Anthony47 » 14/07/09 22:55

Non capisco perche' le formule di riserva le copi un pezzo alla volta e non un rigo completo; idem per il Copia /Incolla-speciale/Valori...
Poi, alcune celle devono diventare semplici "collegamenti" e altre sono invece "Somme"; giusto? In questo caso la cosa piu' semplice era avere formule che generavano stringhe in un caso che cominciavano con "#(" e nell' altro che cominciavano con "#Somma(";comunque mi dici in quali colonne bisogna mettere "=" e in quali "=SOMMA"?
Per quanto riguarda l' errore, esso indica che la formula ottenuta con "=SOMMA" e' sintatticamente errata; ispeziona quindi la "cella attiva" al momento dell' errore (senza modificare la selezione) per capire in cosa consiste l' errore.

Per quanto detto nei post precedenti, questa e' una semplificazione di un processo che gia' funziona (a mano); non lo metto tra le prime cose da guardare perche' in questi giorni ho qualche casino tra i piedi...

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Importare una lista di file excel in una sola tabella

Postdi sacco » 15/07/09 11:49

Non capisco perche' le formule di riserva le copi un pezzo alla volta e non un rigo completo; idem per il Copia /Incolla-speciale/Valori...
Avevo fatto in questo modo perchè le celle nella riga di riepilogo non erano tutte adiacenti ed inoltre la matricola era scritta in una cella interna alla riga: copiando il rigo completo o mi si sovrascriveva il numero di matricola oppure mi dava l'errore Impossibile eseguire il comando su una selezione multipla.
Comunque ora ho cambiato la disposizione delle celle in modo da copiare e incollare in una volta sola.

Poi, alcune celle devono diventare semplici "collegamenti" e altre sono invece "Somme"; giusto? In questo caso la cosa piu' semplice era avere formule che generavano stringhe in un caso che cominciavano con "#(" e nell' altro che cominciavano con "#Somma(";comunque mi dici in quali colonne bisogna mettere "=" e in quali "=SOMMA"?
Si, giusto. Ora ho modificato le stringhe come mi hai suggerito tu, facendo iniziare alcune formule con "#(" ed altre con "#SOMMA("
Ad ogni modo le colonne H, I, J, L e M sono collegamenti, le colonne N, P, Q e R sono Somme.
Per quanto riguarda l' errore, esso indica che la formula ottenuta con "=SOMMA" e' sintatticamente errata; ispeziona quindi la "cella attiva" al momento dell' errore (senza modificare la selezione) per capire in cosa consiste l' errore.
Questo ho provato a farlo ma non riesco a capire quale sia il problema...
Ti posto nuovamente la macro con le modifiche che ho (hai) fatto, che ora risulta molto più corta:
Codice: Seleziona tutto
Sub Macro2()
'
' Macro2 Macro
' Macro registrata il 15/07/2009 da winxp
'

'
    Sheets("tab").Select
    Range("H4:R4").Select
    Selection.Copy
    Sheets("Tempi Gennaio").Select
    Range("H8").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
End Sub
Ho provato a registrare una seconda macro, senza cambiare formule ma solo effettuando la sostituzione di "#" con "=" una alla volta (nelle formule con SOMMA), ed in questo caso rilanciando la macro non dà errori, però ovviamente si allunga un po':
Codice: Seleziona tutto
Sub Macro3()
'
' Macro3 Macro
' Macro registrata il 15/07/2009 da winxp
'
    Sheets("tab").Select
    Selection.Copy
    Sheets("Tempi Gennaio").Select
    Range("G31").Select
    Selection.End(xlUp).Select  ' <<<<  In questo modo mi posiziono in fondo all'elenco delle matricole
                                '       (quando ho registrato la macro era la riga 8), non so se ti può essere utile.
    Range("H8").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("H8:M8").Select
    Range("M8").Activate
    Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False
    Range("N8").Select
    ActiveCell.FormulaR1C1 = _
        "=SUM('C:\Documents and Settings\amministratore\Desktop\area test\COMMESSE\[125.09.G.xls]Progressivo lavorazione'!R15C4:R20C4)"
    Range("P8").Select
    ActiveCell.FormulaR1C1 = _
        "=SUM('C:\Documents and Settings\amministratore\Desktop\area test\COMMESSE\[125.09.G.xls]Progressivo lavorazione'!R21C4:R22C4)"
    Range("Q8").Select
    ActiveCell.FormulaR1C1 = _
        "=SUM('C:\Documents and Settings\amministratore\Desktop\area test\COMMESSE\[125.09.G.xls]Progressivo lavorazione'!R6C4:R9C4,R13C4:R15C4,R21C4:R22C4)"
    Range("R8").Select
    ActiveCell.FormulaR1C1 = _
        "=SUM('C:\Documents and Settings\amministratore\Desktop\area test\COMMESSE\[125.09.G.xls]Progressivo lavorazione'!R28C4:R29C4)"
    Range("A8:T8").Select
'   Il seguito è solo per comodità di visualizzazione, se crea problemi si può omettere.
    With Selection.Font
        .Name = "Arial"
        .Size = 12
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
    End With
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .ShrinkToFit = False
        .MergeCells = False
    End With
    Range("A9").Select
End Sub
Non voglio assolutamente metterti fretta, anzi di ringrazio tantissimo per il tempo che mi hai già dedicato e che mi dedicherai!
Ciao.
Fabio
sacco
Newbie
 
Post: 6
Iscritto il: 07/07/09 15:17

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "Importare una lista di file excel in una sola tabella":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti