IMPORTARE FILE CSV IN EXCEL



  • IMPORTARE FILE CSV IN EXCEL
    di vatuss (utente non iscritto) data: 23/07/2017 17:20:33

    Buonasera forum

    ho posto la stessa domanda chiedendo se era possibile ottenere un risultato analogo con Access ma dai colleghi mi è stato fatto notare che si dovrebbe poi implementare anche il sistema di fatturazione che viene gestito con Excel 2007, perciò l'importazione direttamente nel database non è utile e continuerò a farlo come sempre.
    Cerco di spiegare cosa mi piacerebbe ottenere, l'input l'ho avuto leggendo la discussione sull'importazione di file nel formato TXT .

    Lavoro quotidianamente con tre listini di fornitori e tre/quattro volte al giorno scarico i tre listini allegati per aggiornare le disponibilità. Ogni volta devo sempre andare in Dati, Testo in Colonne ecc., in un caso fare copia incolla.

    Per snellire il lavoro vorrei attraverso un bottone poter richiamare i file da caricare che di trovano tutti nella stessa cartella LISTINO sul desktop.

    L'istruzione dovrebbe prima cancellare tutto il contenuto nella tabella di destinazione, perchè il numero delle righe da scrivere cambia, e poi riscriverlo a partire dalle colonne B2 dei tre fogli escludendo l'intestazione del Listino2. Nella colonna A ho le azioni delle macro che eseguo.

    Spero di essere stato chiaro.

    Grazie per il prezioso supporto.



  • di patel data: 23/07/2017 19:16:09

    prova questa 
     
    Sub Import1()
        filepath = "F:DownloadListinolistino1.csv" ' <<<<< modifica percorso
        linenumber = 1
        elementnumber = 1
        Open filepath For Input As #1 ' Open file for input
            Do While Not EOF(1) ' Loop until end of file
                linenumber = linenumber + 1
                Line Input #1, line
                arrayOfElements = Split(line, "|")
    
                elementnumber = 1
                For Each element In arrayOfElements
                    elementnumber = elementnumber + 1
                    Cells(linenumber, elementnumber).Value = element
                Next
            Loop
        Close #1 ' Close file.
    End Sub
    






  • di vatuss (utente non iscritto) data: 23/07/2017 20:06:06

    Ciao patel grazie per la risposta sei stato velocissimo.

    L'importazione del listino1 è perfetta,
    quella del listino2 mi copia anche la prima riga del file sorgente (è l'intestazione delle celle, a me, non serve),
    quella del listino3 invece accoda i record sullo stesso rigo, forse dipende dal fatto che temina con e genera un errore nel rigo
    Cells(linenumber, elementnumber).Value = element

    Grazie ancora




  • di patel data: 23/07/2017 20:18:39

    credevo fossero tutti simili, gli altri 2 non capisco quali sono i separatori





  • di vatuss (utente non iscritto) data: 23/07/2017 20:31:23

    no patel non sono tutti uguali.

    Listino2 a differenza di Listino1 è già in colonne, l'importazione è perfetta ma contiene nel primo rigo il nome dei campi, dovrebbe partire dal secondo.

    Listino3 invece importa i record tutti nel secondo rigo del foglio questa la struttura:
    xxx|EPSON|xxx|47,74|0000030337|in arrivo|0|0,6|xxx|xxx|8715946518183|-1|0000030337
    forse l'errore nell'interpretazione del codice può dipendere dal carattere > ?

    ciao

     
    Cells(linenumber, elementnumber).Value = element 



  • di vatuss (utente non iscritto) data: 23/07/2017 20:43:48

    è stato rimosso < endrecord > senza spazi
     
    xxx|EPSON|xxx|47,74|0000030337|in arrivo|0|0,6|xxx|xxx|8715946518183|-1|0000030337< endrecord >



  • di vatuss (utente non iscritto) data: 23/07/2017 21:51:38

    patel è proprio quello indicato l'errore.
    Se tolgo < endrecord > l'importazione del lino 3 è corretto ma mi mette i seguenti caratteri al termine:
    ;;;;

    Buona serata a domani



  • di patel data: 24/07/2017 10:06:19

    per listino2 prova
     
    Sub Import2()
        filepath = "F:DownloadListinolistino1.csv" ' <<<<< modifica percorso
        linenumber = 1
        elementnumber = 1
        Open filepath For Input As #1 ' Open file for input
            Line Input #1, line ' <<<<<< linea aggiunta
            Do While Not EOF(1) ' Loop until end of file
                linenumber = linenumber + 1
                Line Input #1, line
                arrayOfElements = Split(line, "|")
    
                elementnumber = 1
                For Each element In arrayOfElements
                    elementnumber = elementnumber + 1
                    Cells(linenumber, elementnumber).Value = element
                Next
            Loop
        Close #1 ' Close file.
    End Sub






  • di Vecchio Frac data: 24/07/2017 15:39:26

    cit. "mi è stato fatto notare che si dovrebbe poi implementare anche il sistema di fatturazione che viene gestito con Excel 2007"
    ---> Anzi, sarebbe quasi doveroso implementare tutto in Access. Excel in confronto non ha la stessa potenza e la stessa versatilità.





  • di Vecchio Frac data: 24/07/2017 15:45:39

    La struttura dei file csv è diversa essenzialmente perchè nei primi due c'è la pipe a fare da separatore, mentre nel terzo c'è il classico punto e virgola.
    La domanda che mi viene spontanea è: questa struttura è ignota a priori? cioè quando devi importare un listino non sai se i campi son separati dalla pipe o dal punto e virgola? o sai per certo che i primi due sono fatti così e il terzo cosà?





  • di vatuss (utente non iscritto) data: 24/07/2017 21:59:01

    grazie patel adesso il listino viene caricato in maniera perfetta



  • di vatuss (utente non iscritto) data: 24/07/2017 22:27:38

    Ciao Vecchio Frac, grazie per il tuo intervento farò tesoro del tuo consiglio.

    A proposito del file "Listino3.csv" da importare ho notato che aprendolo con Excel le righe del listino appaiono in questo modo:
    xxx|EPSON|xxx|47,74|0000030337|in arrivo|0|0,6|xxx|xxx|8715946518183|-1|0000030337< endrecord >

    facendolo con Notepad appaiono così:
    xxx|EPSON|xxx|47,74|0000030337|in arrivo|0|0,6|xxx|xxx|8715946518183|-1|0000030337;;;;

    Inoltre aprendolo con Notepad e salvandolo nel formato *.csv e riaprendolo con Excel la struttura delle righe diventa:
    xxx|EPSON|xxx|47,74|0000030337|in arrivo|0|0,6|xxx|xxx|8715946518183|-1|0000030337

    ho provato a modificare l'istruzione di patel con ";" nel rigo
    arrayOfElements = Split(line, "|")
    senza ottenere risultato.

    Sono un poco confuso e se devo dare una risposta alla tua domanda

    cit. La domanda che mi viene spontanea è: questa struttura è ignota a priori? cioè quando devi importare un listino non sai se i campi son separati dalla pipe o dal punto e virgola?

    La risposta è: La struttura è nota e i separatori ci sono entrambi, anzi no!



  • di vatuss (utente non iscritto) data: 25/07/2017 20:52:54

    Buonasera Forum,
    dovendo caricare listini che possono avere più o meno righe del precedente documentandomi ho pensato di modificare il codice di patel, inserendo una riga che cancella il contenuto delle colonne e riscrive tutto.

    Mi sono accorto però che con questo sistema le colonne con le formule perdono il riferimento e anche la semplice formula:

    =SE(B3<>"";(SOMMA(A2+1)))

    diventa
    =SE(#RIF!<>"";(SOMMA(A2+1)))

    perdendo il riferimento della cella, è possibile rimediare?

     
    Sub Import1()
    Columns("B:Q").EntireColumn.Delete <<<<< RIGA INSERITA
        filepath = "C:listino1.csv" ' <<<<< modifica percorso
        linenumber = 1
        elementnumber = 1
        Open filepath For Input As #1 ' Open file for input
            Do While Not EOF(1) ' Loop until end of file
                linenumber = linenumber + 1
                Line Input #1, Line
                arrayOfElements = Split(Line, "|")
    
                elementnumber = 1
                For Each element In arrayOfElements
                    elementnumber = elementnumber + 1
                    Cells(linenumber, elementnumber).Value = element
                Next
            Loop
        Close #1 ' Close file.
    End Sub



  • di vatuss (utente non iscritto) data: 25/07/2017 22:07:59

    evvai ho risolto da solo sostituendo :

    Columns("B:Q").EntireColumn.Delete

    con

    Range("B:Q").clearcontents

    così anche le formule non perdono il riferimento.

    Buonanotte forum e grazie per il prezioso contributo