› Sviluppare funzionalita su Microsoft Office con VBA › Correzione Macro per importare valori da file .csv
-
AutoreArticoli
-
Buongiorno, consultando varie guide, alcune anche di questo sito, ho scopiazzato una macro per importare i dati di un file .csv nel foglio di lavoro "SourceAFR" di un file di Excel 2010 (.xlsb).
La Macro, che si attiva con CTRL + SHIFT + A, importa i dati e mi combina un macello nel file di Excel.
Vengono cancellate le Formattazioni, le Formattazioni Condizionali, le Formule che fanno riferimento alle celle coi valori importati vengono riempite col classico #RIF!.
Un'altro problema da risolvere riguarda il file .csv da importare, vorrei che la Macro lo andasse a cercare nella stessa cartella ove risiede il file di Excel, ma non ci sono riuscito.
Vi allego i 2 files in questione.
Ho ricevuto il suggerimento di impostare le formattazioni nella macro, dopo il caricamento, ma non so nemmeno cosa significhi questa cosa.
Vi ringrazio anticipatamente per il vostro supporto.
Allegati:
You must be logged in to view attached files.Carico il file 'AFRWorks.csv' in formato .rar.
Allegati:
You must be logged in to view attached files.Premesso che non ho ancora guardato i file, una soluzione alternativa potrebbe essere quella di importare il csv in n altro foglio, poi copiare e incollare questi valori nel foglio di destinazione conservando le formattazioni (insomma usare PasteSpecial con i parametri giusti). Presumo quindi che eventuali formule che puntino alle celle così copiate mantengano i loro riferimenti.
Naturalmente tutto da provare 🙂
Grazie Vecchio Frac per la risposta.
Si, se clicco su AFRWorks.csv il contenuto mi viene importato in Excel da cui posso copiare le celle desiderate, caricare in Excel il file ER-6... ed incollarci il contenuto del .csv.
Però ci dovrebbe essere il modo di farlo in VBA, tra l'altro non ho mai usato VBA ed nemmeno copiando dai sorgenti che trattano l'importazione dati da .csv riesco a impostare una Macro che faccia ciò che mi sono proposto (per ora).
Ma col vostro aiuto ...
Ho registrato una macro, che ho chiamato "riordina", che mi rimette in sesto il file dopo il macello prodotto dalla macro "ImportCSV", registrando passo passo ogni comando per riordinare.
Non è per niente elegante ma è tutto quello che riesco a fare, per il momento. Se e quando riuscirò a fare quanto mi sono prefisso sarò ben lieto di postare la soluzione qui, su ExcelVBA.
Buon fine settimana a tutti.
Vengono cancellate le Formattazioni, le Formattazioni Condizionali, le Formule che fanno riferimento alle celle coi valori importati vengono riempite col classico #RIF!.
Vedendo il file e la mcaro, mi pare abbastanza ovvio e scontato (normale) che avvenga questo, perché è questo che la TUA macro fa.
Quello che non chiarisci è perché hai scritto una macro che va a sovrascrivere tutto e poi te ne lamenti?
Qual'è lo scopo che ti prefiggi di raggiungere?
Se non chiarisci BENE tali concetti è difficile per chicchessia poterti aiutare.Ciao Leonardo,
ti sono grato del fatto che ti sei preso la briga di visionare i miei files.
Senz'altro è come dici tu, ossia che io non sono in grado di chiarire bene quando mi prefiggo di ottenere con la macro nel file allegato (non mia, per ora non sono in grado di scrivere quello che nemmeno riesco a capire, infatti l'ho copiata).
Sono però convinto che ci riuscirò, e quando ciò avverrà sarò felicissimo di condividere su questo forum almeno il file con la macro corretta, e, anche se non saprò dire a cosa serve, forse qualcuno che usa come chiave di ricerca in Google: "Importare dati da file .csv" analizzando il file, potrà avvantaggiarsi del mio lavoro e, sopratutto, conoscerà e potrà affidarsi a questo forum.
Penso che ci metterò un po' di tempo perché non conoscendo VBA dovrò fare un corso in merito (a meno di non trovare online materiale adatto).
Quindi, non posso dire: "a presto" ma: "arrivederci", senz'altro.
Buon fine settimana.
Guarda dove ho trovato il corso, https://www.excelvba.it/corso/.
Dovrebbe esserci quanto mi occorre. E, se mi permetto di dargli una valutazione?
Sicuramente non ti servirà a spiegare bene l'obiettivo di questa discussione, tu vuoi importare il csv ma dove ? hai allegato un file con tanti fogli, vuoi aggiungerne uno con i dati del csv ?
Ciao Patel, hai ragione, tanti fogli possono generare confusione.
Come file dal quale importare i dati manteniamo afrworks.csv e, se questo file necessita di qualche modifica per poter essere importato fate pure.
Come file di excel invece, lasciamo perdere il precedente ed usiamo "ImportaCSV.xlsb", è un file vuoto, con un solo foglio, che attualmente si chiama "Foglio1".
Mi servirebbe una macro che importi i dati dal file afrworks.csv e li scriva nell'unico foglio del file "ImportaCSV.xlsb" partendo dalla cella "A1".
Per ora è tutto.
Se andiamo avanti per gradi forse anche laddove io non sappia spiegarmi voi potrete contribuire.
Allegati:
You must be logged in to view attached files.Ecco la macro originale che ho pasticciato:
"https://answers.microsoft.com/it-it/msoffice/forum/all/macro-per-importare-file-csv/0184fa6c-2b56-4142-aacb-146f508150ad"
Ma non tenetene minimamente conto, riguardo a ciò che mi sono prefisso mi sembra che sia totalmente inutile.
prova questa cambiando il percorso
Sub importa() Set sh = ThisWorkbook.Sheets(1) Workbooks.OpenText "F:\Download\AFRWORKS.CSV", Local:=True Set wbCSV = ActiveWorkbook Sheets(1).Copy , sh wbCSV.Close False End Sub
Ciao Patel, grazie per la tua macro, è notevole, con così poche righe di codice importa i dati, ma non funziona, al posto delle formule che puntano ai dati appena importati appare il solito #RIF!.
Io ho escogitato questa:
Sub Importa()
Dim Percorso As String
Percorso = ActiveWorkbook.Path & "\AFRWorks.csv"
Open Percorso For Input As #1
Nriga = 0
For Reader = 1 To 103
Line Input #1, LineaFile
RigaF = Split(LineaFile, ";")
ActiveCell.Offset(Nriga, 0).Value = RigaF(0)
ActiveCell.Offset(Nriga, 1).Value = RigaF(1)
ActiveCell.Offset(Nriga, 2).Value = RigaF(2)
ActiveCell.Offset(Nriga, 3).Value = RigaF(3)
ActiveCell.Offset(Nriga, 4).Value = RigaF(4)
ActiveCell.Offset(Nriga, 5).Value = RigaF(5)
ActiveCell.Offset(Nriga, 6).Value = RigaF(6)
ActiveCell.Offset(Nriga, 7).Value = RigaF(7)
ActiveCell.Offset(Nriga, 8).Value = RigaF(8)
ActiveCell.Offset(Nriga, 9).Value = RigaF(9)
ActiveCell.Offset(Nriga, 10).Value = RigaF(10)
ActiveCell.Offset(Nriga, 11).Value = RigaF(11)
ActiveCell.Offset(Nriga, 12).Value = RigaF(12)
ActiveCell.Offset(Nriga, 13).Value = RigaF(13)
ActiveCell.Offset(Nriga, 14).Value = RigaF(14)
ActiveCell.Offset(Nriga, 15).Value = RigaF(15)
ActiveCell.Offset(Nriga, 16).Value = RigaF(16)
ActiveCell.Offset(Nriga, 17).Value = RigaF(17)
ActiveCell.Offset(Nriga, 18).Value = RigaF(18)
ActiveCell.Offset(Nriga, 19).Value = RigaF(19)
ActiveCell.Offset(Nriga, 20).Value = RigaF(20)
ActiveCell.Offset(Nriga, 21).Value = RigaF(21)
ActiveCell.Offset(Nriga, 22).Value = RigaF(22)
ActiveCell.Offset(Nriga, 23).Value = RigaF(23)
ActiveCell.Offset(Nriga, 24).Value = RigaF(24)
ActiveCell.Offset(Nriga, 25).Value = RigaF(25)
ActiveCell.Offset(Nriga, 26).Value = RigaF(26)
ActiveCell.Offset(Nriga, 27).Value = RigaF(27)
ActiveCell.Offset(Nriga, 28).Value = RigaF(28)
ActiveCell.Offset(Nriga, 29).Value = RigaF(29)
ActiveCell.Offset(Nriga, 30).Value = RigaF(30)
Nriga = Nriga + 1
Next Reader
Close #1End Sub
Una cosa che mi prefiggevo l'ho ottenuta, ossia che, se il file .csv è nella stessa cartella del file .xls, il .csv venga importato automaticamente, questo l'ho ottenuto con la sottostante riga di codice:
Percorso = ActiveWorkbook.Path & "\AFRWorks.csv"
Una seconda cosa che ho ottenuto è che formule, formattazioni etc non vengono modificate.
Una cosa, invece, per ora mi manca, vorrei che i dati vengano importati nel foglio di lavoro che si chiama "SourceAFR" a partire dalla cella "A1".
Attualmente l'importazione avviene a partire dalla cella attiva, qualunque essa sia, in qualunque foglio essa si trovi.
Allego i files, una raccomandazione: "usate sempre gli ultimi files allegati" ovvi i motivi.
Allegati:
You must be logged in to view attached files.Ho provato il codice sottostante e mi scrive solo nel foglio "SourceAFR", solo che, se mi trovo in un altro foglio scrive sul foglio "SourceAFR" a partire da "A1" mentre se mi trovo nel foglio "SourceAFR" mi scrive a partire dalla cella attiva.
Sheets("SourceAFR").Select
Ci siamo quasi.
Aggiunta questa riga:
Range("A1:AE103").Select
Finito.
Riallego il tutto, la macro in txt nel file "Macro.txt", i files vecchi cancellarli, ci sono degli errori nelle formule.
Se ritenete faccio un riepilogo circa questo post.
Allegati:
You must be logged in to view attached files.L'ultima versione, forse definitiva:
Sub Importa()
Sheets("SourceAFR").Select
Range("A1:AE103").SelectDim Percorso As String
Percorso = ActiveWorkbook.Path & "\AFRWorks.csv"
Open Percorso For Input As #1For Reader = 1 To 103
Line Input #1, LineaFile
RigaFile = Split(LineaFile, ";")
For Colonna = 0 To 30
ActiveCell.Offset(NumeroRiga, Colonna).Value = RigaFile(Colonna)
Next Colonna
NumeroRiga = NumeroRiga + 1
Next ReaderClose #1
End Sub
Ciao Patel, grazie per la tua macro, è notevole, con così poche righe di codice importa i dati, ma non funziona, al posto delle formule che puntano ai dati appena importati appare il solito #RIF!.
non capisco cosa c'entrano le formule, la mia macro importa il csv ed il csv non contiene formule
Torno sull'argomento perché con la sostituzione di 2 righe di codice si ottiene che:
1) le formattazioni delle celle nelle quali i dati vengono importati non vengano cancellate;
2) la finestra di dialogo per puntare al file .csv si apra nella cartella ove risiede il file di excel in uso (attivo?);
1) Inserire Ws.Cells.ClearContents al posto di Ws.Cells.Delete;
2) Sostituire .InitialFileName = Environ("UserProfile") & "\" con .InitialFileName = ActiveWorkbook.Path & "\AFRWorks.csv" ma anche questa lavora bene .InitialFileName = ActiveWorkbook.Path & "\"
Dato che le formattazioni sono mantenute le formule che puntano ai dati importati rimangono integre.
Era moooolto più facile di quanto si potesse pensare.
Sulla mia precedente macro credo si possa inserire un Do Until EOF(1) che eliminerebbe la necessità del FOR/NEXT per le 103 righe del .csv da importare, e qualcosa per evitare il FOR/NEXT per le 31 colonne.
Ci dev'essere anche un modo per non specificare il range ma la cella di partenza, la "A1" o altra in base alle necessità.
(Le formule si riferiscono alla macro iniziale, quella copiata dal link:
-
AutoreArticoli