Domanda Collegare tutti i fogli di file Excel in Access

fedebanfi

Nuovo utente
6 Giugno 2019
12
0
1
Versione 1905
0
Ciao a tutti,

ho bisogno di importare dati da Excel in Access, mi servirebbe farlo con il collegamento delle tabelle ma potrebbe andar bene anche importarle.
Il problema è che non posso fare foglio per foglio, sono tanti fogli e cambieranno di volta in volta.
C'è la possibilità di dire ad Access "importami tutto il file Excel"? (quindi tutti i fogli)

Grazie,
Federica.
 

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
17.669
703
113
Como
2011MAC 2016WIN
294
Ciao,
puoi usare questa macro in un modulo standard di Access

Visual Basic:
Sub ImportaExcel()
    Dim excelApp As Object
    Dim excelbook As Object
    Dim dlg As Object
    Dim StrFileName As String, intcounter, intNoOfSheets As Integer
    Set excelApp = CreateObject("Excel.Application")
    Set dlg = Application.FileDialog(3)
    With dlg
        .Title = "Seleziona il file Excel dal quale vuoi importare tutti i fogli"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "Files Excel", "*.xlsx", 1
        .Filters.Add "Files Excel", "*.*", 2
        If .Show = -1 Then
            StrFileName = .SelectedItems(1)
            Set excelbook = excelApp.Workbooks.Open(StrFileName)
            intNoOfSheets = excelbook.worksheets.Count
            For intcounter = 1 To intNoOfSheets
                excelbook.worksheets(intcounter).Activate
                DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, excelbook.Activesheet.Name, StrFileName, True, _
                    excelbook.worksheets(intcounter).Name & "!" & _
                    Replace(excelbook.worksheets(intcounter).UsedRange.Address, "$", "")
            Next
        End If
    End With
End Sub
 

fedebanfi

Nuovo utente
6 Giugno 2019
12
0
1
Versione 1905
0
Perdonami,
posso via via che importo le tabelle anche accodarle all'interno di una già presente nel DB?
Non posso creare delle query "statiche" di accodamento perchè non so a priori quanti sono i fogli excel (e quindi le tabelle) ne come si chiamano.
 

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
17.669
703
113
Como
2011MAC 2016WIN
294
non so a priori quanti sono .... le tabelle) ne come si chiamano
Beh, con una semplice query puoi sapere quante sono le tabelle e come si chiamano e quindi fare un accodamento.
Lo saprai già ma meglio ripeterlo: nell'accodamento tutti i campi devono essere uguali.
 

fedebanfi

Nuovo utente
6 Giugno 2019
12
0
1
Versione 1905
0
Grazie Ges, si le tabelle avranno tutte la stessa struttura.
Riesci a darmi una mano nella query? il DB non sarà vuoto, ci saranno altre tabelle "statiche", io voglio contare e accodare solo quelle nel file excel che collego.
 

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
1.537
273
83
Italy
2013 2019
114
posso via via che importo le tabelle anche accodarle all'interno di una già presente nel DB?
Non puoi fare entrambe le operazioni (almeno non nelle stesse tabelle) per cui o importi i dati o li accodi.
Inoltre occorre vedere la struttura delle tabelle (primary key, indici, vincoli, ecc.) quindi serve vedere il database.
 

fedebanfi

Nuovo utente
6 Giugno 2019
12
0
1
Versione 1905
0
Il mio obiettivo è creare una tabella in Access che contenga le varie tabella (fogli) di Excel.
La modalità è indifferente: posso fare il collegamento e poi accodare, solo accodare o importare le tabelle e poi accodarle.
La difficoltà sta nel fatto che non so a priori quante tabelle contiene l'Excel e come si chiameranno.
Il codice di Ges è molto utile perchè mi consente di importare tutte le tabelle dell'Excel dentro l'access, mi serve però accordarle in un unico tabellone.
Per quanto riguarda indici, chiavi ecc. non credo ci siano problemi, sono tabelle molto semplici con la medesima struttura.
 

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
1.537
273
83
Italy
2013 2019
114
La difficoltà sta nel fatto che non so a priori quante tabelle contiene l'Excel e come si chiameranno.
Facendo riferimento alla macro di ges @ges :

Quanti fogli (non tabelle) contiene il file lo puoi vedere interrogando la proprietà Count:
intNoOfSheets = Worksheets.Count

Il nome di ogni singolo foglio lo ottieni interrogando la proprietà Name all'interno del ciclo:
nomefoglio = Worksheets(intcounter).Name
 

Rubik72

Excel/VBA Expert
Supermoderatore
Expert
12 Dicembre 2015
5.144
326
83
47
Cosenza
Excel 2016
137
Un saluto a tutti.
Ho integrato la macro di ges @ges con qualche comando commentato:
Visual Basic:
Sub ImportaExcel()
    Dim excelApp As Object
    Dim excelbook As Object
    Dim dlg As Object
    Dim Fg As Object
    Dim StrFileName As String, intcounter, intNoOfSheets As Integer
    
    
    Set excelApp = CreateObject("Excel.Application")
    Set dlg = Application.FileDialog(3)
    
    If IsTable("tblRiepilogo") Then 'verifica se la tabella esiste altrimenti la elimina
        DoCmd.DeleteObject acTable, "tblRiepilogo"
    End If
    
    With dlg
        .Title = "Seleziona il file Excel dal quale vuoi importare tutti i fogli"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "Files Excel", "*.xlsx", 1
        .Filters.Add "Files Excel", "*.*", 2
        If .Show = -1 Then
            StrFileName = .SelectedItems(1)
            Set excelbook = excelApp.Workbooks.Open(StrFileName)
            For Each Fg In excelbook.Worksheets 'ciclo per ogni foglio della cartella di lavoro
                DoCmd.TransferSpreadsheet _
                    acImport, _
                    acSpreadsheetTypeExcel8, _
                    Fg.Name, _
                    StrFileName, _
                    True, _
                    Fg.Name & "!" & Replace(Fg.UsedRange.Address, "$", "")
                    
                If Not IsTable("tblRiepilogo") Then 'verifica se la tabella Riepilogo esiste, altrimenti la crea
                    DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentDb().Name, acTable, Fg.Name, "tblRiepilogo", True
                End If
                
                DoCmd.SetWarnings False 'disabilita gli avvisi
                
                DoCmd.RunSQL "INSERT INTO tblRiepilogo SELECT " & Fg.Name & ".* FROM " & Fg.Name & ";" 'query di accodamento
                DoCmd.DeleteObject acTable, Fg.Name ' elimina la tabella importata
                
                DoCmd.SetWarnings True 'riabilita gli avvisi
            Next
        End If
    End With
    
    
End Sub

Function IsTable(sTblName As String) As Boolean

    On Error GoTo ErrorHeader
    Dim x
    x = DCount("*", sTblName)
    IsTable = True
    Exit Function
ErrorHeader:
    Debug.Print Now, sTblName, Err.Number, Err.Description
    IsTable = False

End Function
 
  • Like
Reactions: ges

fedebanfi

Nuovo utente
6 Giugno 2019
12
0
1
Versione 1905
0
Posso eventualmente gestire fogli con struttura diversa?
Mi spiego: vorrei il foglio iniziale, chiamato "riepilogo" vada a popolarmi una certa tabella, mentre gli altri fogli (con la stessa struttura) vengano accodati in un'altra tabella.
Ho creato una IF che consente di definire dove i vari fogli andranno accodati, quindi in tabelle diverse, ma se il foglio riepilogo lo imposto con una struttura diversa non funziona.

Grazie,
Federica
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!