Risultati da 1 a 10 di 10

Discussione: Importazione di file CSV - cancellare la connessione



  1. #1
    L'avatar di Ciccio
    Clicca e Apri
    Data Registrazione
    Oct 2016
    Località
    Italia
    Messaggi
    29
    Versione Office
    2016
    Mi Piace ricevuti
    4
    Mi Piace dati
    15

    Importazione di file CSV - cancellare la connessione

    Buongiorno a tutti.

    Per esigenze lavorative, ogni tanto devo prendere un certo numero di file csv (il numero cambia di volta in volta) e importare ognuno di questi in excel. L'obiettivo finale sarà quello di mettere insieme il maggior numero possibile di file in un unico excel, ma non è questo il problema, o almeno, non per ora .

    Il "problema" è che, al termine dell'importazione del CSV, excel mi conserva la connessione al file di origine (Dati -> Connessioni), che io vorrei eliminare.

    Il fatto è che ho provato diversi modi per eliminare la connessione, sia registrando la macro che cercando qui e la su internet, ma la connessione rimane sempre lì. O meglio: se faccio partire la registrazione, importo il file, cancello la connessione e spengo il registratore, la connessione si chiude regolarmente. Ma se poi faccio partire questo codice, la macro viene regolarmente processata senza problemi (nessuna finestra di errore), ma andando a controllare il risultato, la connessione è ancora lì.

    Ad ogni modo, ecco il mio codice; per chiarezza di esposizione, i file da importare hanno un nome del tipo
    file_000001.csv
    file_000002.csv
    ....
    file_000040.csv

    Ciò che non funziona si verifica nella sezione in grassetto rosso
    Codice: 
    
    'Checklist:
    '1) verificare il percorso di acquisizione
    '2) verificare il numero di files da includere nel ciclo for
    '3) verificare il nome dei file da aprire
    '4) verificare il nome del file da salvare e il percorso dove farlo
    
    
    
    Sub CSVtoXLSX()
    
    '########### Macro per convertire CSV in XlSX ###########
    
    Dim percorso As String
    Dim i As Long
    Dim fileLS As String
    Dim wkk As Workbook
    Dim report As Worksheet
    Dim connect As WorkbookConnection
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' [Punto 1 della checklist] Setto il percorso
    percorso = "C:\Users\Ciccio\Desktop\file\"
    
    ' [Punto 2 della checklist] Apro il ciclo for
    For i = 1 To 87
    
    ' [Punto 3 della checklist] Se i è maggiore di 9, il nome del file deve contenere solo 0000; altrimenti 00000
    If i > 9 Then
        fileLS = "file_0000"
    Else
        fileLS = "file_00000"
    End If
    
    'Creo il nuovo file e il foglio dove incollare i dati; metto i riferimenti
    Set wkk = Workbooks.Add
        
    Sheets.Add after:=Worksheets(Worksheets.Count)
        
    ActiveSheet.Name = "Report"
        
    Set report = wkk.Sheets("Report")
         
    Worksheets(1).Delete
    
    'Importo il csv
    With  ActiveSheet.QueryTables.Add(Connection:="TEXT;" & percorso &  fileLS & i & ".csv", Destination:=Range("$A$1"))
        .Name = fileLS & i
        '.CommandType = 0 'Off topic: perchè se registro la macro compare questo, ma se poi faccio ripartire il codice, qui mi da errore?
        .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 = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
        , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    
    ' [Punto 4 della checklist] Salvo con nome
    wkk.SaveAs  filename:=percorso & fileLS & i & ".xlsx", FileFormat:=51,  ReadOnlyRecommended:=False, CreateBackup:=False
    
    ' Cancello la connessione. Ora è commentato solo perchè ho messo qui due delle diverse soluzioni che ho provato, senza successo.
    'Altrimenti, ovviamente, ci sarà una sola soluzione non commentata
    'Prima soluzione
    'For Each connect In wkk.Connections
    '    connect.Delete
    'Next
    'Seconda soluzione. L'ho provata anche mettendo direttamente "file_000001" o "file_000030" ecc, a seconda del file
    'wkk.Connections(fileLS & i).Delete
    'Ne ho provate anche altre, ma non le ho più, visto che non funzionavano
    
    'chiudo il file appena creato e setto la wkk a 0
    wkk.Close
    Set wkk = Nothing
    Set report = Nothing
    
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    Next i
    
    End Sub
    Qualche idea?

    Grazie
    Ultima modifica fatta da:alfrimpa; 13/10/16 alle 10:43

  2. #2
    L'avatar di Alessandro
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Roma
    Età
    44
    Messaggi
    477
    Versione Office
    2010 64 bit
    Mi Piace ricevuti
    72
    Mi Piace dati
    37

    Re: Importazione di file CSV - cancellare la connessione

    ciao ciccio,
    sicuramente non ho capito e sono fuori strada...ma hai pensato ad una alternativa:
    tipo andare sul prompt, usare il vecchio comando copy *.csv total...e poi da xls apri questo file total appena creato>>>testo in colonne e via...
    io lo faccio spesso con dei file txt o csv...li inglobo in un unico file e via.
    ciao
    ale

  3. #3
    L'avatar di Ciccio
    Clicca e Apri
    Data Registrazione
    Oct 2016
    Località
    Italia
    Messaggi
    29
    Versione Office
    2016
    Mi Piace ricevuti
    4
    Mi Piace dati
    15

    Re: Importazione di file CSV - cancellare la connessione

    Citazione Originariamente Scritto da Alessandro Visualizza Messaggio
    andare sul prompt, usare il vecchio comando copy *.csv total...e poi da xls apri questo file total appena creato>>>testo in colonne e via...
    Ciao Alessandro, grazie mille per l'opzione che mi suggerisci. Non ne ho mai sentito parlare, ma mi documenterò.
    Io in realtà vorrei fare tutto con vba perchè i file sono molti e l'importazione è la prima strada verso tutta un'altra serie di operazioni da fare con altre macro

    Cavolo però, interessante l'idea a ben pensarci... Al posto di fare un import, apro "banalmente" il file con excel e poi faccio "testo in colonne"... ho fatto praticamente la stessa cosa, ma probabilmente con meno "caos". Potrei rifare la macro in questo modo, quindi senza usare il cmd.

    Beh, ottimo! Però ora mi rimane comunque la curiosità del perchè non riesco a cancellare la connessione...

  4. #4
    L'avatar di Alessandro
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Roma
    Età
    44
    Messaggi
    477
    Versione Office
    2010 64 bit
    Mi Piace ricevuti
    72
    Mi Piace dati
    37

    Re: Importazione di file CSV - cancellare la connessione

    Citazione Originariamente Scritto da Ciccio Visualizza Messaggio
    Ciao Alessandro, grazie mille per l'opzione che mi suggerisci. Non ne ho mai sentito parlare, ma mi documenterò.
    in pratica tutti i programmi>>>Prompt dei Comandi (dos)>>> cd C:\Documenti\ecc...insomma cd e il path per arrivare alla cartella che contiene tutti i file
    e poi dai il comando copy *.csv total (o un nome file a tuo piacimento).
    exit per uscire dal prompt del dos
    In questo modo avrai un file che sarà la sommatoria di tutti gli altri.
    Io lo uso spesso per dei file che mi arrivano via txt e devo dirti che mi trovo molto bene.
    Per il problema della connessione lascio ad altri perchè io non saprei nemmeno da dove iniziare.
    ciao
    ale

  5. I seguenti utenti hanno dato un "Mi Piace"


  6. #5
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    71
    Messaggi
    580
    Versione Office
    2010
    Mi Piace ricevuti
    72
    Mi Piace dati
    1

    Re: Importazione di file CSV - cancellare la connessione

    a me questa funziona
    Codice: 
    Sub delconn()
    For Each Conn In ThisWorkbook.Connections
        Conn.Delete
    Next
    End Sub

  7. #6
    L'avatar di Ciccio
    Clicca e Apri
    Data Registrazione
    Oct 2016
    Località
    Italia
    Messaggi
    29
    Versione Office
    2016
    Mi Piace ricevuti
    4
    Mi Piace dati
    15

    Re: Importazione di file CSV - cancellare la connessione

    Citazione Originariamente Scritto da patel Visualizza Messaggio
    a me questa funziona
    Codice: 
    Sub delconn()
    For Each Conn In ThisWorkbook.Connections
        Conn.Delete
    Next
    End Sub
    Patel, c'ho riprovato, ma niente: la connessione è ancora lì :(

  8. #7
    L'avatar di patel
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Livorno
    Età
    71
    Messaggi
    580
    Versione Office
    2010
    Mi Piace ricevuti
    72
    Mi Piace dati
    1

    Re: Importazione di file CSV - cancellare la connessione

    io uso excel 2010, ho cancellato ora le connesioni ai miei file che importano csv, anzi ti ringrazio per la macro suggerita che funziona benissimo

  9. #8
    L'avatar di Anthony
    Clicca e Apri
    Data Registrazione
    Sep 2016
    Località
    Ivrea (TO)
    Messaggi
    217
    Versione Office
    2003-2010-2016
    Mi Piace ricevuti
    155
    Mi Piace dati
    31

    Re: Importazione di file CSV - cancellare la connessione

    Considererei seriamente la soluzione proposta da Alessandro, vedi sopra.

    Ciccio, ci sono diverse cose che non mi tornano nel tuo ragionamento.
    A) La prima e' che tu determini se la "connessione" e' presente o assente ripetendo la Sub CSVtoXLSX, e siccome funziona concludi che la connessione c'e' ancora.
    Ma la Sub CSVtoXLSX (1) crea un nuovo file e (2) aggiunge la sua connessione, quindi non puo' che funzionare...

    B) Poi, quella che viene impostata con la macro non e' una Connection, ma una QueryTable avente un Poprieta' Connection (e tante altre); quindi forse dovresti eliminare la QueryTable, cosa che potresti fare d esempio con
    Codice: 
    For Each qt In ActiveSheet.QueryTables
        qt.Delete
    Next qt
    (dovrebbe bastare anche il solo ActiveSheet.QueryTables(1).Delete visto che il file e' nuovo e quindi ce n'e' sicuramente una sola; ma tanto vale esagerare)
    Metterai queste istruzioni prima del tuo wkk.SaveAs filename:=percorso etc etc

    C) Non ho capito a che serve questo giro:
    'Creo il nuovo file e il foglio dove incollare i dati; metto i riferimenti
    Set wkk = Workbooks.Add
    Sheets.Add after:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = "Report"
    Set report = wkk.Sheets("Report")
    Worksheets(1).Delete
    Secondo me ti basta
    Codice: 
    'Creo il nuovo file e il foglio dove incollare i dati; metto i riferimenti
    Set wkk = Workbooks.Add
    ActiveSheet.Name = "Report"
    Set report = wkk.Sheets("Report")
    D) Lo scopo finale mi sembrerebbe quello di accodare in un unico foglio il contenuto di tanti .csv, e quello che hai mostrato e' un esperimento propedeutico.

    Se e' cosi', allora il mio suggerimento e':
    Creati il file su cui vuoi accumulare; in un foglio che chiamerai QUERY inserisci in A1 una QueryTable che importi correttamente la struttura del file; creati un foglio chiamato SUMMA su cui sara' accodato il contenuto di ogni i csv man mano che verra' importato:
    Poi inserisci una macro che contenga il seguente codice:
    Codice: 
    'Attiva il foglio con Query:
    Sheets("QUERY").Select
    For YYY = boh To mah                                                '<<< I TUOI PARAMETRI
    'qui le istruzioni per compilare correttamente percorso e fileLS    '<<<<
    '
    'MI PARE CHE IN QUESTA FASE TU NON ABBIA BISOGNO DI CAMBIARE Sheet, GIUSTO?
    '    
        With Range("A2").QueryTable
        '    cconn = .Connection
    'modifica Connessione e importa:
            .Connection = "TEXT;" & percorso & fileLS & i & ".csv"
            .Refresh False
        End With
    'Copia l'intervallo importato:
        myRan = "A:K"                             '<<< Le colonne dei dati importati
        LastR = Range(myRan).Find(What:="*", After:=Range(myRan).Cells(1, 1), _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious).Row
        Application.Intersect(Range(myRan), Range("1:" & LastR)).Copy
    'Accodalo al contenuto di SUMMA
        LastR = Sheets("SUMMA").Range(myRan).Find(What:="*", After:=Range(myRan).Cells(1, 1), _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious).Row
        Sheets("SUMMA").Cells(LastR + 1, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
                xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
    Next YYY
    MsgBox("Completata importazione...")
    Le righe marcate <<< vanno personalizzate come da commento

    Ciao a tutti.
    Anthony

  10. I seguenti 2 utenti hanno dato un MI Piace a Anthony per questo post:


  11. #9
    L'avatar di Ciccio
    Clicca e Apri
    Data Registrazione
    Oct 2016
    Località
    Italia
    Messaggi
    29
    Versione Office
    2016
    Mi Piace ricevuti
    4
    Mi Piace dati
    15

    Re: Importazione di file CSV - cancellare la connessione

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    Considererei seriamente la soluzione proposta da Alessandro, vedi sopra.
    Sì, senza dubbio mi sembra veloce e pratica. Ne farò uso sicuramente!

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    Ciccio, ci sono diverse cose che non mi tornano nel tuo ragionamento.
    Pensa che io stesso mi rendo conto che spesso ci sono cose che non mi tornano nei miei ragionamenti :)

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    A) La prima e' che tu determini se la "connessione" e' presente o assente ripetendo la Sub CSVtoXLSX, e siccome funziona concludi che la connessione c'e' ancora.
    Ma la Sub CSVtoXLSX (1) crea un nuovo file e (2) aggiunge la sua connessione, quindi non puo' che funzionare...
    Riaprendo il file, che ora è un xlsx, vado su Dati -> Connessioni e trovo che c'è una connessione aperta al file csv avente lo stesso nome del file xlsx. Però come ti dicevo, se sono io (e non il codice vba) ad andare su Dati -> Connessioni a chiudere la connessione, allora effettivamente sparisce; se invece lo faccio fare al codice (anche a quello ottenuto col registratore acceso mentre effettuo l'azione di chiusura della connessione), questo non va.

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    B) Poi, quella che viene impostata con la macro non e' una Connection, ma una QueryTable avente un Poprieta' Connection (e tante altre); quindi forse dovresti eliminare la QueryTable
    Lo so che col senno di poi è facile parlare, però devo ammettere che c'avevo pensato :) solo che non sapevo come fare. D'altra parte però, tutti gli esempi trovati online di import CSV chiudevano la connessione col codice che ho inserito nella mia macro. Ad ogni modo, farò un test a brevissimo per verificare se questo può risolvere il problema.


    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    C) Non ho capito a che serve questo giro:
    Eh, caro Anthony, benchè siano ormai mesi che giochicchio col VBA, purtroppo non sono ancora in grado di sfruttarne appieno le potenzialità. Questo significa che molte cose, spesso anche basilari, non so ancora farle o non ci arrivo se non attraverso inutili percorsi tortuosi. :)

    Citazione Originariamente Scritto da Anthony Visualizza Messaggio
    D) Lo scopo finale mi sembrerebbe quello di accodare in un unico foglio il contenuto di tanti .csv, e quello che hai mostrato e' un esperimento propedeutico.
    Sì, l'idea finale è quella, ma prima di poterlo fare devo effettuare tutta una serie di azioni a monte sui file.
    I tanti (87 in questo caso) CSV sono composti ognuno da 50.000 righe e 77 colonne, creare un file unico alla "prima botta" è impossibile, troppo grande per essere gestito in excel.
    Devo pertanto togliere innanzitutto delle colonne che non mi servono e, in seconda battuta, creare dei file excel "consolidati" da circa 1.000.000 di righe l'uno.
    Visto che l'obiettivo è questo, devo prima concentrarmi su tutta una serie di operazioni "di pulizia".
    Ad ogni modo, fantastico il codice che mi proponi, ne farò sicuramente uso quando avrò a che fare con file di dimensioni più contenute.

    Grazie mille!

  12. #10
    L'avatar di Ciccio
    Clicca e Apri
    Data Registrazione
    Oct 2016
    Località
    Italia
    Messaggi
    29
    Versione Office
    2016
    Mi Piace ricevuti
    4
    Mi Piace dati
    15

    Re: Importazione di file CSV - cancellare la connessione

    Stavo per scrivere che neanche l'eliminazione della querytable aveva risolto la questione.
    Poi però ho avuto un lampo di genio.
    E immediatamente dopo mi sono sentito un cretino.

    L'ordine logico con cui eseguo le operazioni nella macro è:
    1) crea nuovo file
    2) importa csv
    3) salva con nome
    4) chiudi la connessione
    5) chiudi il file

    Ma se al punto 5 chiudo senza salvare, è normale che qualunque cosa faccia al punto 4 non funzioni!

    Pertanto, ho messo la chiusura della connessione prima del salvataggio del file; ho provato sia con
    Codice: 
    For Each Conn In ThisWorkbook.Connections
        Conn.Delete
    Next Conn
    che con
    Codice: 
    For Each qt In ActiveSheet.QueryTables
        qt.Delete
    Next qt

    e posso dirvi che sia il primo (thisWorkbook.Connections)
    sia il secondo (ActiveSheet.QueryTables) funzionano!

    La connessione è finalmente sparita

Discussioni Simili

  1. importazione file txt da web con una macro
    Di Giannilima nel forum Domande su Excel VBA e MACRO
    Risposte: 11
    Ultimo Messaggio: 15/06/16, 10:35
  2. Macro per importazione e pulizia di file CSV
    Di G.Bove nel forum Domande su Excel VBA e MACRO
    Risposte: 5
    Ultimo Messaggio: 24/01/16, 23:07
  3. Macro per importazione dati da file xls o csv
    Di Harry nel forum Domande su Excel VBA e MACRO
    Risposte: 3
    Ultimo Messaggio: 29/12/15, 19:41
  4. Importazione file ed analisi dati
    Di G.Bove nel forum Domande su Excel in generale
    Risposte: 20
    Ultimo Messaggio: 13/12/15, 06:42
  5. Aprire file CSV in Excel evitando importazione guidata
    Di mspr nel forum Domande su Excel in generale
    Risposte: 8
    Ultimo Messaggio: 30/09/15, 19:46

Tag per Questa Discussione

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •