Importare dati da file excel

di il
5 risposte

Importare dati da file excel

Ciao a tutti,
avrei bisogno di importare dati da più file excel contenuti in una cartella in una determinata tabella di access.
I file excel hanno la stessa struttura ed i dati da importare sono contenuti in 2 fogli: il primo foglio "Informazioni generali" contiene 2 informazioni da ripetere in corrispondenza degli altri dati contenuti nel secondo foglio "Utenze domestiche".

Ho provato con un ciclo Do ... Loop ma funziona soltanto su 1 file.

Il ciclo dovrebbe inserire nella tabella di access "ud", tramite la query (INSERT INTO), i dati copiati da tutti i file fino a quando nel foglio "Utenze domestiche" non trova una cella vuota nella prima colonna.

Di seguito il codice con il Loop che copia correttamente i dati soltanto da 1 file: invece di lanciare la query ho inserito un Msgbox.

Vorrei quindi inserire un ciclo per eseguire la stessa operazione per tutti i files contenuti nella cartella ma non riesco.


Private Sub Comando1_Click()
Dim SourceDir As String
Dim app As Object
Dim file As Object
Dim foglio As Object
Dim riga As Integer
Dim query As String

riga = 2
SourceDir = "C:\Users\s.dedonato\Desktop\prova\" 'cartella da dove copiare tutti i files'
myFile = Dir(SourceDir & "\*.xls*") 'nome files da cui estrarre i dati'


Set app = CreateObject("Excel.Application")
Set file = app.Workbooks.Open(SourceDir & myFile)
Set anagrafica = file.worksheets("Informazioni generali")
Set foglio = file.worksheets("Utenze domestiche")

Do

If foglio.Cells(riga, 1) = "" Then
Exit Do
End If

MsgBox ("lancio query per il file" & myFile)

'query = "INSERT INTO ud(istat, comune, tipo_ut, ka, kb) VALUES('" & anagrafica.Cells(3, 2) & "','" & anagrafica.Cells(2, 2) & "','" & foglio.Cells(riga, 1) & "','" & foglio.Cells(riga, 2) & "','" & foglio.Cells(riga, 3) & "');"
'DoCmd.SetWarnings False 'disabilito gli avvisi
'DoCmd.RunSQL query 'lancia la query chiamata query
'DoCmd.SetWarnings True 'riattivo gli avvisi

MsgBox ("Istat - " & anagrafica.Cells(3, 2) & "," & "Comune - " & anagrafica.Cells(2, 2) & "," & "utenza - " & foglio.Cells(riga, 1) & "," & "ka - " & foglio.Cells(riga, 2) & "," & "kb - " & foglio.Cells(riga, 3))


riga = riga + 1 'per incrementare le righe per il ciclo


'Active.Workbook.Close = False 'non so se è utile chiudere il file dopo il loop

'myFile = Dir dovrei inserire un loop per far leggere tutti i file contenuti nella cartella

Loop

MsgBox ("arrivati in fondo")

End Sub


Grazie mille

5 Risposte

  • Re: Importare dati da file excel

    Dejavier ha scritto:


    ..
    avrei bisogno di importare dati da più file excel contenuti in una cartella in una determinata tabella di access.
    ...
    Ho provato con un ciclo Do ... Loop ma funziona soltanto su 1 file.
    ...
    SourceDir = "C:\Users\s.dedonato\Desktop\prova\" 'cartella da dove copiare tutti i files'
    myFile = Dir(SourceDir & "\*.xls*") 'nome files da cui estrarre i dati'
    ...
    Do
    ...
    'myFile = Dir dovrei inserire un loop per far leggere tutti i file contenuti nella cartella
    Loop[code][/quote]
    Per passare al file successivo devi fare un altro Dir(), fino a quando il risultato di quella funzione è una stringa vuota.
    Qui trovi una pagina che illustra parecchi modi di importare da Excel, tra cui anche tutti i file presenti in una cartella
    [url]http://www.accessmvp.com/kdsnell/EXCEL_Import.htm[/url]
  • Re: Importare dati da file excel

    Ciao,
    innanzitutto grazie per la risposta.
    Avevo già provato ad inserire il Dir, provando con 2 file inseriti nella cartella apre il primo file e copia la prima riga, apre il secondo file copia la seconda riga del primo file....poi si ferma dato che sono presenti solo 2 file.

    Avevo scritto come di seguito...

    Dim app As Object
    Dim file As Object
    Dim foglio As Object
    Dim riga As Integer
    Dim query As String

    riga = 2
    SourceDir = "C:\Users\s.dedonato\Desktop\prova\" 'cartella da dove copiare tutti i files'
    myFile = Dir(SourceDir & "\*.xls*") 'nome files da cui estrarre i dati'


    Set app = CreateObject("Excel.Application")
    Set file = app.Workbooks.Open(SourceDir & myFile)
    Set anagrafica = file.worksheets("Informazioni generali")
    Set foglio = file.worksheets("Utenze domestiche")


    Do While myFile <> ""

    If foglio.Cells(riga, 1) = "" Then
    Exit Do
    End If

    MsgBox ("lancio query per il file" & myFile)

    'query = "INSERT INTO ud(istat, comune, tipo_ut, ka, kb) VALUES('" & anagrafica.Cells(3, 2) & "','" & anagrafica.Cells(2, 2) & "','" & foglio.Cells(riga, 1) & "','" & foglio.Cells(riga, 2) & "','" & foglio.Cells(riga, 3) & "');"
    'DoCmd.SetWarnings False 'disabilito gli avvisi
    'DoCmd.RunSQL query 'lancia la query chiamata query
    'DoCmd.SetWarnings True 'riattivo gli avvisi

    MsgBox ("Istat - " & anagrafica.Cells(3, 2) & "," & "Comune - " & anagrafica.Cells(2, 2) & "," & "utenza - " & foglio.Cells(riga, 1) & "," & "ka - " & foglio.Cells(riga, 2) & "," & "kb - " & foglio.Cells(riga, 3))

    riga = riga + 1 'per incrementare le righe per il ciclo


    'file.Workbooks.Close savechanges:=False 'serve per chiudere file dopo il loop

    myFile = Dir 'dovrei inserire un loop per far leggere tutti i file contenuti nella cartella


    Loop

    MsgBox ("arrivati in fondo")


    End Sub


    Grazie ancora
  • Re: Importare dati da file excel

    Dejavier ha scritto:


    ...
    Avevo già provato ad inserire il Dir, provando con 2 file inseriti nella cartella apre il primo file e copia la prima riga, apre il secondo file copia la seconda riga del primo file....poi si ferma dato che sono presenti solo 2 file.
    ...
    
    SourceDir = "C:\Users\s.dedonato\Desktop\prova\" 'cartella da dove copiare tutti i files'
    myFile = Dir(SourceDir & "\*.xls*") 'nome files da cui estrarre i dati'
    
    Set app = CreateObject("Excel.Application")
    Set file = app.Workbooks.Open(SourceDir & myFile)
    Set anagrafica = file.worksheets("Informazioni generali")
    Set foglio = file.worksheets("Utenze domestiche")
    
    Do While myFile <> ""
    ...
    myFile = Dir 'dovrei inserire un loop per far leggere tutti i file contenuti nella cartella
    Loop
    ...
    Perché l'assegnazione alla variabile oggetto [file] (e degli oggetti che da essa dipendono) è fatto fuori dal Do Loop, quindi dopo aver fatto Dir() è vero che riparte il Do ma alla variabile file è ancora assegnato il file precedente.
    Prova a spostare le assegnazioni dentro il Do Loop
  • Re: Importare dati da file excel

    Ho provato come di seguito sempre con 2 file.

    Il loop dovrebbe farlo per tutte le righe di ogni file fino a trovare uno spazio vuoto, una volta finito dovrebbe cambiare file e ricominciare.

    In questo modo copia solo la prima riga del primo file e solo la seconda del secondo file. Dovrebbe copiare 6 righe da ogni file.
    ......
    riga = 2
    SourceDir = "C:\Users\s.dedonato\Desktop\prova\" 'cartella da dove copiare tutti i files'
    myFile = Dir(SourceDir & "\*.xls*") 'nome files da cui estrarre i dati'

    Do While myFile <> ""

    Set app = CreateObject("Excel.Application")
    Set file = app.Workbooks.Open(SourceDir & myFile)
    Set anagrafica = file.worksheets("Informazioni generali")
    Set foglio = file.worksheets("Utenze domestiche")


    If foglio.Cells(riga, 1) = "" Then
    Exit Do
    End If

    ..........


    'file.Workbooks.Close savechanges:=False 'serve per chiudere file dopo il loop

    myFile = Dir() 'dovrei inserire un loop per far leggere tutti i file contenuti nella cartella

    Loop

    MsgBox ("arrivati in fondo")


    End Sub



    Se invece scrivo

    .....
    riga = 2
    SourceDir = "C:\Users\s.dedonato\Desktop\prova\" 'cartella da dove copiare tutti i files'
    myFile = Dir(SourceDir & "\*.xls*") 'nome files da cui estrarre i dati'

    Do While myFile <> ""

    Set app = CreateObject("Excel.Application")
    Set file = app.Workbooks.Open(SourceDir & myFile)
    Set anagrafica = file.worksheets("Informazioni generali")
    Set foglio = file.worksheets("Utenze domestiche")

    Do While foglio.Cells(riga, 1) <> ""

    ......
    riga = riga + 1 'per incrementare le righe per il ciclo

    Loop

    'file.Workbooks.Close savechanges:=False 'serve per chiudere file dopo il loop

    myFile = Dir() 'dovrei inserire un loop per far leggere tutti i file contenuti nella cartella

    Loop

    MsgBox ("arrivati in fondo")


    End Sub

    Copia le 6 righe del primo file e termina il Loop, sembra che così non veda il loop su myFile.
    Le sto provando tutte ma non essendo molto pratico di vba non riesco a trovare la strada
    Grazie ancora
  • Re: Importare dati da file excel

    X Dejavier: leggi il regolamento, nei forum decentemente moderati il cross posting non è ammesso
Devi accedere o registrarti per scrivere nel forum
5 risposte