Condividi:        

[Excel]Spostare grande volume dati da Righe in COLONNE

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]Spostare grande volume dati da Righe in COLONNE

Postdi maxi » 20/11/06 20:05

Partendo da un file Excel estratto da Access (in realtà i file sono molti e tutti con dati diversi, ma trovata la soluzione per uno il resto è scontato) che contiene moltissimi dati formattati come segue (lo scrivo come fosse un file ASCII ma sappiate che è un foglio Excel ed ogni dato è in una colonna ben definita, per un totale di 3 colonne ma con migliaia di righe):
“NOME, DATA, VALORE”


Pippo, 10/10/06, 150
Pippo, 11/10/06, 149
Pippo, 12/10/06, 160


Pluto, 10/10/06, 50
Pluto, 11/10/06, 55
Pluto, 12/10/06, 48


Paperino, 10/10/06, 76
Paperino, 11/10/06, 75
Paperino, 12/10/06, 70

Nota: praticamente ogni “NOME” presenta un valore ogni giorno diverso, ed i “…” stanno a significare che la base dati è molto + estesa di quanto non abbia riportato nell’esempio qui sopra.

Per dare qualche ordine di grandezza alla base dati, le righe per ogni cartella di lavoro saranno circa 60.000, quindi quasi al limite delle righe gestibili da un foglio Excel. Lo segnalo anche x capire con che dimensioni in MB avrò a che fare nel caso dovessi copiare delle formule in moltissime celle del foglio di lavoro.

L’obiettivo è di arrivare ad avere una tabella che abbia invece la seguente formattazione (meglio se trattasi di due cartelle di lavoro separate, xè il primo file lo ottengo con un export da Access. Quindi nelle varie formule si inserirà eventualmente il riferimento ad un altro file excel esterno):
“DATA, Pippo, Pluto, Paperino, …”


10/10/06, 150, 50, 76
11/10/06, 149, 55, 75
12/10/06, 160, 48, 70


La tabella così ottenuta presenta adesso una colonna “DATA” unica per ogni tipo NOME presente nel foglio iniziale, ed i VALORI relativi ad una stessa DATA sono su un’unica riga.
Ad ogni colonna invece corrisponde un NOME. Ovviamente i NOMI presenti per ogni cartella di lavoro saranno inferiori a 256, e visto che la prima colonna è occupata già dal campo DATA, rimangono “solo” 255 intestazioni di colonna per inserire i vari NOMI (in realtà x ogni foglio ci saranno in media 70/80 NOMI).

Purtroppo non mi è possibile sapere a priori quanti NOMI ci saranno in una tabella iniziale (lo definisce Access, che in base ai filtri applicati esporta sempre un numero di NOMI variabile, e nemmeno conosco a priori quante righe ( = DATA ) ci sono per ogni NOME, perché la base dati iniziale è dinamica ed inoltre questi export dovrò farli su base settimanale ed ogni volta su molti fogli di lavoro (uno per ogni Query di Access).
Quindi se mi suggerirete delle funzioni da usare in Excel, le stesse dovranno riconoscere “dinamicamente” ad esempio la riga dove finisce il Nome ‘Pippo’ e dove ad es. inizia ‘Pluto’.

DOMANDA:
Premesso che non so usare VBA, in che modo è possibile (con quali formule e/o funzioni) ottenere la formattazione desiderata per la base dati in questione?


Ps. Il post è stato aperto x “aggirare” un problema legato ad Access. Se qualcuno avesse bisogno di maggiori informazioni, al fine chiarire meglio il discorso x trovare una soluzione, può dare un’occhiata al seguente post: http://www.pc-facile.com/forum/viewtopic.php?t=53577
maxi
Utente Senior
 
Post: 219
Iscritto il: 04/03/02 20:18

Sponsor
 

Postdi Anthony47 » 21/11/06 00:14

Ciao Maxi,
ovviamente il vba non te lo risparmia nessuno, ma non dovrebbere essere difficile. Proviamoci.
1- Ti fai un file (che sara' il file di uscita) dove in A2 e B2 inserisci le seguenti formule:
Codice: Seleziona tutto
A2   =CONFRONTA(C2;1:1;0)
B2   =CONFRONTA(D2;A:A;0)

E lo salvi con un nome a piacere.

2- Apri il file "sorgente" (quello con 60000 righe), poi apri il vba editor con Alt-F11
3- Sul vba editor, fai Inserisci ->Modulo; ti dovrebbe comparire un foglio bianco
4- Copi la seguente macro e la incolli nel riquadro bianco di dx del vba editor:
Codice: Seleziona tutto
Sub maxi1()
FSorg = "Cartel2"   '<<<< File Sorgente
FUsc = "Cartel3"    '<<<< File di Uscita
Application.ScreenUpdating = False
Windows(FUsc).Activate
Range(Cells(3, 1), Cells(65536, 255)).Select
Selection.ClearContents
Range("A1:IV1").Select
Selection.ClearContents
Range("A1").Select

Windows(FSorg).Activate
NRighe = Range("A65536").End(xlUp).Row

For I = 1 To NRighe - 1
Windows(FSorg).Activate
Range("A1").Offset(I, 0).Range("A1:C1").Copy
Windows(FUsc).Activate
Range("C2").Select

ActiveSheet.Paste

Riprova:
NNome = Application.WorksheetFunction.IsError(Range("A2"))
NData = Application.WorksheetFunction.IsError(Range("B2"))
LNome = Range("IV1").End(xlToLeft).Column
LData = Range("A65536").End(xlUp).Row

If NNome = True Then
 Cells(1, LNome + 1).Value = Range("C2").Value
 GoTo Riprova:
End If
If NData = True Then
 Cells(LData + 1, 1).Value = Range("D2").Value
 GoTo Riprova:
End If

Cells(Range("B2").Value, Range("A2").Value).Value = Range("E2").Value

Next I
Application.ScreenUpdating = True
End Sub


Sostituisci subito in queste istruzioni Cartel2 e Cartel3 con i veri nomi dei files:
FSorg = "Cartel2" '<<<< File Sorgente
FUsc = "Cartel3" '<<<< File di Uscita

Vai sul foglio sorgente e lancia la macro, tramite Strumenti ->Macro ->Macro; selezioni la macro "maxi1" e premi Esegui.

In questo modo sul foglio di uscita dovrebbe costruirti in orizzontale i nomi, in verticale le date, e nell' itersezione mettere il 3° dato.

Prova prima con qualche decina di righe sorgente, con piu' nomi, cosi' capisci quanto puo' durare e non ti allarmi quando la mandi in esecuzione sul file completo.

Facci sapere se fa quello che serve.
Ciao,
Avatar utente
Anthony47
Moderatore
 
Post: 19220
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi maxi » 22/11/06 01:18

GRAZIE per la risposta molto precisa.

Ho provato a seguire le tue istruzioni ed ho tenuto i nomi delle cartelle 'Cartel2' e 'Cartel3' x non avere problemi in fase di test.

Tenendo aperti entrambe i fogli, lancio la macro, ma mi appare una finestra pop-up "Microsoft Visual Basic":
Errore di run-time '9':
Indice non incluso nell'intervallo

Se faccio il DEBUG mi evidenzia in giallo la seguente stringa di codice VBA: Windows(FUsc).Activate

Ad ogni modo tramite un altro suggerimento sono riuscito a risolvere il mio problema direttamente in Access usando una Query a Campi Incrociati.

Però se vuoi provare di nuovo con una modifica al codice VBA sono disponibilissimo a testare tutte le soluzioni che eventualmente proporrai. L'importante è che tu non perda tempo inutilmente con me, visto che te ne ho già fatto perdere abbastanza per mettere giù il codice di cui sopra.

Ps. tanto x curiosità, VBA lo usi x lavoro oppure è solo un hobby?
15 anni fa programmavo in 'C' ma ora dire che non ricordo nulla è dire poco. Mi sa che mi devo mettere sotto a studiare VBA, che in tutti gli ambienti Windows è sempre molto comodo, se non fondamentale.


Grazie ancora
maxi
Utente Senior
 
Post: 219
Iscritto il: 04/03/02 20:18

Postdi Anthony47 » 22/11/06 09:47

Se i file sono gia' stati salvati, prova con Cartel2.xls e Cartel3.xls, se hai voglia visto che il problema e' risolto alla radice.

Ovviamente il vba e' una necessita', dovuta al bisogno di gestire dati e realizzare modelli per uso comune.
Un buon sistema per cominciare e fare pratica e' "registrare" una macro, e poi imparare a modificarla per i propri scopi.

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

Postdi maxi » 22/11/06 19:33

Ho modificato la Macro con Cartel2.xls e Cartel3.xls ed ora perlomeno la Macro gira.

Sono partito dalla seguente base dati iniziale:
Pippo,10/11/06,7
Pippo,11/11/06,8
Pippo,12/11/06,9
Pluto,10/11/06,25
Pluto,11/11/06,26
Pluto,12/11/06,27
Papero,10/11/06,108
Papero,11/11/06,109
Papero,12/11/06,110

… ma ho ottenuto questa formattazione, non del tutto corretta:
,Pippo,Pluto,Papero,
4,4,Papero,12/11/06,110
11/11/06,8,26,109,
12/11/06,9,27,110,
10/11/06,,25,108,

Quello che invece sarebbe dovuto uscire era questo:
DATA, Pippo, Pluto, Papero
10/10/06, 7, 25, 108
11/10/06, 8, 26, 109
12/10/06, 9, 27, 110


Ad ogni modo s’è capito che c’era da inserire “.XLS”.
Ora non stare a perdere tempo a sistemare la macro suggerita, visto che l’obiettivo è stato risolto per altra via.
Lo stesso GRAZIE MILLE per il supporto. Alla prossima :-)
maxi
Utente Senior
 
Post: 219
Iscritto il: 04/03/02 20:18

Postdi Anthony47 » 23/11/06 17:24

Ciao maxi,
se il problema e’ risolto all’ origine chiudiamo qui le indagini.
Alla prossima.
Avatar utente
Anthony47
Moderatore
 
Post: 19220
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[Excel]Spostare grande volume dati da Righe in COLONNE":


Chi c’è in linea

Visitano il forum: Nessuno e 57 ospiti