Sviluppare funzionalita su Microsoft Office con VBA Correzione Macro per importare valori da file .csv

Login Registrati
Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
  • Autore
    Articoli
  • #15185 Score: 0 | Risposta

    Maxxy
    Partecipante

      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.
      #15187 Score: 0 | Risposta

      Maxxy
      Partecipante

        Carico il file 'AFRWorks.csv' in formato .rar.

        Allegati:
        You must be logged in to view attached files.
        #15190 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          245 pts

          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 🙂

          #15218 Score: 0 | Risposta

          Maxxy
          Partecipante

            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 ...

            #15252 Score: 0 | Risposta

            Maxxy
            Partecipante

              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.

              #15257 Score: 0 | Risposta

              Anonimo
                1 pt

                Maxxy ha scritto:

                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.

                 

                #15263 Score: 0 | Risposta

                Maxxy
                Partecipante

                  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.

                  #15264 Score: 0 | Risposta

                  Maxxy
                  Partecipante

                    Guarda dove ho trovato il corso, https://www.excelvba.it/corso/.

                    Dovrebbe esserci quanto mi occorre. E, se mi permetto di dargli una valutazione?

                    #15268 Score: 0 | Risposta

                    patel
                    Moderatore
                      50 pts

                      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 ?

                      #15270 Score: 0 | Risposta

                      Maxxy
                      Partecipante

                        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.
                        #15272 Score: 0 | Risposta

                        Maxxy
                        Partecipante

                          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.

                          #15281 Score: 0 | Risposta

                          patel
                          Moderatore
                            50 pts

                            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
                            #15285 Score: 0 | Risposta

                            Maxxy
                            Partecipante

                              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 #1

                              End 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.
                              #15287 Score: 0 | Risposta

                              Maxxy
                              Partecipante

                                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.

                                #15288 Score: 0 | Risposta

                                Maxxy
                                Partecipante

                                  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.
                                  #15294 Score: 0 | Risposta

                                  Maxxy
                                  Partecipante

                                    L'ultima versione, forse definitiva:

                                    Sub Importa()

                                       Sheets("SourceAFR").Select
                                       Range("A1:AE103").Select

                                    Dim Percorso As String
                                             Percorso = ActiveWorkbook.Path & "\AFRWorks.csv"
                                            Open Percorso For Input As #1

                                    For 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 Reader

                                    Close #1

                                    End Sub

                                    #15296 Score: 0 | Risposta

                                    patel
                                    Moderatore
                                      50 pts

                                      Maxxy ha scritto:

                                      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

                                      #15324 Score: 0 | Risposta

                                      Maxxy
                                      Partecipante

                                        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:

                                        https://answers.microsoft.com/it-it/msoffice/forum/all/macro-per-importare-file-csv/0184fa6c-2b56-4142-aacb-146f508150ad.)

                                      Login Registrati
                                      Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
                                      Rispondi a: Correzione Macro per importare valori da file .csv
                                      Gli allegati sono permessi solo ad utenti REGISTRATI
                                      Le tue informazioni: