Condividi:        

Macro - Unire file differenti, con alcune colonne in comune

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

Macro - Unire file differenti, con alcune colonne in comune

Postdi albidibi » 14/11/16 14:30

Ciao a tutti,
premetto che prima di aprire il post, ne ho letti diversi, senza però venire a capo, per un motivo, o per un altro della mia esigenza.

Qualora trovaste la mia richiesta fuori luogo, o già trattata, se mi indicaste dove ripescarla, vado a leggere gli altri articoletti.
E' che ci sono tanti post simili.. che anche le ricerche adeguate, non sono cosa semplice! :)

Detto questo, vi espongo il quesito:

Ho 5 file excel in formato .csv, già diviso in colonne e celle.
Questi 5 file hanno nomi differenti, ma il nome, glielo assegno io a monte. (credo non si poi di fondale importanza al fine dell'esecuzione della macro, se il file si chiama PIPPO, o se si chiama 1. X comodità li chiamo con dei numeri.

Quindi, file 1.csv, file 2.csv, file 3.csv, 4.csv, 5.csv.
Questi file, contengono diverse colonne.
Per alcuni file, quelle colonne hanno la stessa identica nomenclatura, per altri file,le colonne hanno nomi differenti, ma la tipologia di dato contenuto, è della stessa natura.

ex: File1.CSV - ColonnaA = Colore ; ColonnaB: Marca ; ColonnaC: Modello
FIle2.csv - ColonnaA = Nome; ColonnaB: Tinta ; ColonnaC: Modello

Ecco, mi interessa che possa scegliere quali colonne, incolonnare.
Nell'esempio, quindi, la colonna A del file 1, può essere collegata/incolonnata alla ColonnaB del file 2. etc..

Nella macro, vorrei poter dire io, in base ai nomi dei file, quali colonne scegliere, e incollare insomma.
Non posso i file perchè contengono dati sensibili di alcuni clienti.
I volumi sono notevoli.
Stiamo parlando di file che contengono un variabile tra le 70 e le 140 colonne,
e le migliaia di Righe.

Di queste 70/140 colonne, comunque, quelle che mi serve incollare una in coda all'altra, saranno una decina, quindi mi serve creare un file nuovo, scremato delle colonne che non mi interessano, per poterli riutilizzare nella seconda parte del processo.


Non so se sono stato abbastanza chiaro nella richiesta! :|
Ah.. dimenticavo, che sono a digiuno di macro.
Le eseguo, quando me le passano, ma ancora non sono in grado di costruirle in autonomia.
Nei prox mesi la mia azienda probabilmente mi farà fare un corso.. per ora.. non se ne parla! :|

Grazie a tutti per le eventuali risposte... e spero di non aver intasato il vostro forum con una richiesta banale.. :)

Ciao
aLbi
albidibi
Newbie
 
Post: 7
Iscritto il: 11/11/16 16:58

Sponsor
 

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi patel » 14/11/16 20:33

albidibi ha scritto:Ecco, mi interessa che possa scegliere quali colonne, incolonnare.
Nell'esempio, quindi, la colonna A del file 1, può essere collegata/incolonnata alla ColonnaB del file 2. etc..
Nella macro, vorrei poter dire io, in base ai nomi dei file, quali colonne scegliere, e incollare insomma. i

Come penseresti di fare questa scelta ?
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi Anthony47 » 15/11/16 00:27

Ciao albidibi, benvenuto nel forum.
Alla domanda di patel aggiungo le mie:
-non ho capito se le colonne prescelte le devi incollare su un file xls o da un file csv ad altro file csv
-ne' se le colonne vanno affiancate (una accanto all'altra) o accodate ai dati pre-esistenti
-ne' se i file hanno tutti lo stesso numero di righe e la riga1 di 1.csv e' associable alla riga1 di 2.csv (e cosi' per tutti i csv)
-ne' se questo processo va eseguito ripetutamente o piu' volte o una sola volta; e qualora sia da ripetere se va ripetuto come eseguito la prima volta o se di volta in volta le colonne e le destinazioni cambiano

Come vedi per ora solo domande, ma "non escludiamo" di poter dare poi anche risposte, una volta chiarita la questione!
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi albidibi » 15/11/16 15:35

Beh, ma certo.. le domande servono per non girare inutilmente attorno al problema.. ritardando la soluzione! :)
Come dice un detto, "100 misure, e un taglio solo"... Quindi, ben vengano!! :)

Dunque:
-non ho capito se le colonne prescelte le devi incollare su un file xls o da un file csv ad altro file csv
(provengono da un file .csv, che non so per quale motivo, esce già suddiviso in colonne, quindi non serve suddividerlo x lavorarlo comodo. L'obiettivo, è passare da un file quindi .csv a un file .xls)


-ne' se le colonne vanno affiancate (una accanto all'altra) o accodate ai dati pre-esistenti
(accodate! le 5 estrazioni, contengono dei dati relativi a 5 situazione tecniche differenti, ma "simili" per alcuni aspetti.
potremmo definire quindi questi aspetti, come colonne che hanno un nome-colonna differente, ma il dato, della stessa natura.
mi serve metterle tutte sotto lo stesso nome-colonna, che posso definire univocamente x tutti - (ex le colonne "Colore" e "tinta", posso scegliere di chiamarla x tutti "Colore", e nelle celle, mettere i nomi dei colori)


-ne' se i file hanno tutti lo stesso numero di righe e la riga1 di 1.csv e' associable alla riga1 di 2.csv (e cosi' per tutti i csv)
(purtroppo, no. Il numero di righe è differente, e tra l'altro, variabile. Oggi possono essere 1000, domani 1571.. dopodomani 4607.. Non ci sono limiti ma difficilmente superano le 12.000 righe.
No, la riga1, di 1.csv non è associabile alla riga 1 di 2.csv, perchè purtroppo, l'ordine delle colonne, e alcuni nomi delle colonne, non combaciano.
Quindi, nella cella 1,della colonna 1, del file 1.csv, in alcuni file ci trovo il "codice cliente",
nella cella 1, della colonna1, del file 2.csv, ci trovo il codice fiscale. Il codice cliente c'è, ma magari nella colonna 3, o con lo stesso nome, o con un nome-colonna o con un nome diverso.
Vorrei poter creare un file dove scelgo le colonne che mi servono, inserendole in un ordine che decido)



-ne' se questo processo va eseguito ripetutamente o piu' volte o una sola volta; e qualora sia da ripetere se va ripetuto come eseguito la prima volta o se di volta in volta le colonne e le destinazioni cambiano

(allora, il mio lavoraccio, per ora, va ripetuto 1 volta al giorno, tutti i giorni x effettuare un analisi sull'andamento di un determinato evento.
i 5 famosi file, li estratto io tutte le mattina, e tutte le mattina li sovrascrivo, mantenendo appositamente lo stesso nome file.
i 5 file, possono variare in numero di righe, a seconda dei clienti presenti al momento, ma mantengono sempre la stessa struttura (ordine di colonne) quindi, il fle 1.csv, scenderà sempre con quell'ordine di colonne, ma con righe diverse... idem gli altri.
Il problema è che l'ordine delle colonne del file 1, è diverso da quello del file 2, ed inoltre, tutti i file, contengono decine e decine e decine di colonne, di cui non mi interessano i dati in esse contenuti. Ecco, quelli li vorrei escludere, scegliendo le colonne che mi servono
Il file che vorrei creare, accorpando tutti i 5, è sempre un file a cui vorrei dare un nome, ed ogni volta sovrascriverlo, all'occorrenza. Impostando un ordine che scelgo una volta per tutte. Uno per tutti e tutti per uno insomma.
Non escludo di poter ripetere la stessa macro, 2 volte al giorno, aggiornando preventivamente i 5 file che definirei "base dati".
Non so però se può far la differenza sta cosa.. non credo... via.. altrimenti che è.. una macro "usa e getta" ?! :)


Se servono altre info.. non esitate..

E cmq.. grazie mille per l'interessamento!!
albidibi
Newbie
 
Post: 7
Iscritto il: 11/11/16 16:58

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi albidibi » 16/11/16 06:54

Mi ero dimenticato di rispondere alla domanda di Patel..
Pardon..

Allora, avendo ogni file, le sue colonne, ed ogni colonna un nome,
pensavo di ricostruire un nuovo file, indicando nella lista, il nome delle colonne da prendere.
Quindi..
- orizzontalmente, scelgo i nomi delle colonne che mi servono dei 5 file,
- verticalmente, incollo le colonne che contengono la stessa natura del contenuto, una sotto l'altra.
ex:
File 1.csv di 150 colonne, me ne servono 10, con l'ordine prestabilito: 1-3-5-20-45-7-150-9-26-89
incolonna al file 2.csv, scegliendo le colonne con lo stesso dato che potrebbero trovarsi con un ordine differente: 3-6-55-34-21-77-83-90-101-23

ergo.. la colonna 1 contiene un dato dello stesso tipo, della colonna 3 del file 2...

E cosi via x i 5 file.

In verità i file non differiscono così tanto uno dall'altro.. quindi, quasi sempre la colonna1, contiene un dato analogo della colonna 1 di tutti i file.. più avanti però nelle colonne, alcune si alternano.. alcune mancano.. etc.

Se può aiutarvi a capire la questione.. lavoro x un gestore telefonico.. e si devono analizzare alcuni andamenti.
i 5 file identificano 5 tecnologie differenti. ADSL , XDSL, FibraOttica, FibraIbrida, ADSLWS.
Quindi, ogni file conterrà un codice identificativo dei clienti.
Solo che in alcuni file, si chiama proprio "Codice Cliente" in altri si chiama "Account"
Inoltre c'è la colonna "Tecnologia", che ovviamente, conterrà i nomi "ADSL, FIbra.. etc.." solo che la colonna tecnologia
x alcuni file si chiama Tech in altri "Tecnologia", in altri "Tipo Collegamento"..

Quindi, mi serve creare una colonna decidendo un nome: ad ex: TECNOLOGIA x l'appunto, e incolonnarci le varie relative, di ogni file.

..e poi ce ne sono svariate altre, perchè se fossero state solo queste tre, probabilmente avrei fatto la modifica a mano, ogni volta.
Ma, il progetto prevede che tutta questa cosa venga poi automatizzata, quindi, serve liminare le parti manuali.
:D

Grazie ancora.
aLbi
albidibi
Newbie
 
Post: 7
Iscritto il: 11/11/16 16:58

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi Anthony47 » 16/11/16 15:26

Mi era sfuggita la precedente risposta... Vedro' stasera...
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi Anthony47 » 17/11/16 13:21

Allora, penso che possa ottenere molto di quanto chiedi con questa macro, da inserire nel file che poi userai per assemblare le risposte:
Codice: Seleziona tutto
Sub miscell()
Dim aFiles, cF1, cF2, cF3               '<<< meglio dichiarare anche gli altri cFx usati
Dim I As Long, myPath As String, LB0 As Long, UB0 As Long
Dim aaCols As Variant, Accumula, Servizio, myNext As Long, sStr As Long

Accumula = "Foglio1"                    '<<< Il foglio su cui si accodano i files
Servizio = "Foglio2"                    '<<< Il foglio di servizio in cui si importano i csv
myPath = "C:\Users\PERCORSO\" '<<< Il folder che contiene i csv, con \finale
aFiles = Array("1.csv", "2.csv", "3.csv")   '<<< L'elenco dei file
cF1 = Array("B", "A")                   '<<< Per ogni file, l'elenco in ordine delle
cF2 = Array("C", "D")                   '    colonne da importare
cF3 = Array("B", "C")                   '
'cf4 = stesso metodo                    '
'cf5 = stesso metodo
'un cfx per ogni file in elenco!!       '<<<
'
LB0 = LBound(aFiles)
UB0 = UBound(aFiles)

For I = LB0 To UB0
    Call importaCsv(myPath & aFiles(I), Servizio)
'    Workbooks.Open myPath & aFiles(I)
    If I = lbo Then aaCols = cF1
    If I = LB0 + 1 Then aaCols = cF2
    If I = LB0 + 2 Then aaCols = cF3
    'altri statement simili per eventuali altri cFx, rispettando l'ordine dei file  '<<<
    '
    myNext = ThisWorkbook.Sheets(Accumula).Cells(Rows.Count, 1).End(xlUp).Row + 1
    If myNext = 2 Then myNext = 1
    For j = LB0 To UBound(aaCols)
        If myNext = 1 Then sStr = 1 Else sStr = 2
        Range(Cells(sStr, aaCols(j)), Cells(Rows.Count, aaCols(j)).End(xlUp)).Copy _
           ThisWorkbook.Sheets(Accumula).Cells(myNext, 1 + j - LB0)
    Next j
Next I
Sheets(Accumula).Select
MsgBox ("Completato...")
End Sub

Le righe marcate <<< vanno completate come da commento
Questa prima macro si appoggia su altre due macro semistandard, che ho usato per poter "importare" automaticamente i file csv:
Codice: Seleziona tutto
Sub importaCsv(ByVal fName As String, ByVal ShName As String)
'
    Sheets(ShName).Select
    Cells.ClearContents
    Call Cancella_Connections
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & fName, Destination:=Range("$A$1"))
        .Name = "CCSV"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

Sub Cancella_Connections()
mytim = Timer
On Error Resume Next
Do While ActiveSheet.QueryTables.Count > 0
    ActiveSheet.QueryTables(1).Delete
    If Timer > (mytim + 3) Then Exit Do
Loop
On Error GoTo 0
nName = ActiveSheet.Name & "!CCSV"
For I = ActiveSheet.Names.Count To 1 Step -1
    If Left(ActiveSheet.Names(I).Name, Len(nName)) = nName Then
        ActiveSheet.Names(I).Delete
    End If
Next I
End Sub

Operativamente, partendo dal file che utilizzerai:
-premi Alt-F11 per aprire l'editor delle macro
-Menu /Inserisci /Modulo
-Copia tutto il codice e incollalo nel frame dx del modulo appena creato
Personalizza le righe marcate <<< come da commenti

Quando vuoi importare devi lanciare la Sub miscell
I file csv saranno importati in excel, e di ogni file si prenderanno le colonne dichiarate nelle righe del tipo cF1 = Array("B", "A"); queste colone saranno importate nel foglio indicato (vedi istruzione
Accumula = "Foglio1", da personalzzare) inserendole dalla colonna A in avanti, eventualmente accodandole a quanto gia' presente sul foglio. Le intestazioni di colonna sono prelevate dal primo file csv aperto, se il foglio risulta vuoto.

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

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi albidibi » 17/11/16 14:13

Mizzega!! Ci butto un occhiata subito. :D

Grazie mille millissimo per l'interessamento...
Vi faccio sapere.. :D
albidibi
Newbie
 
Post: 7
Iscritto il: 11/11/16 16:58

Re: Macro - Unire file differenti, con alcune colonne in com

Postdi albidibi » 11/10/17 14:37

Ciao ,

mi ritrovo su questo forum,
per un altra ricerca x la creazione di un altra macro che mi occorre,
però volevo poi chiudere questa discussione, indicandovi che per il mio scopo,
alla fine, è andata meglio costruendo una macro con Access.

Vi ringrazio x il prezioso aiuto datomi un anno fa quasi! :)
... e andiamo oltre!
albidibi
Newbie
 
Post: 7
Iscritto il: 11/11/16 16:58


Torna a Applicazioni Office Windows


Topic correlati a "Macro - Unire file differenti, con alcune colonne in comune":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti