esportare tabelle da access in excel

Anonimo
2015-03-18T12:08:29+00:00

Ho una serie di tabelle in access e vorrei esportarle tutte in un unico file Excel (cartella Excel con all'interno i vari fogli che corrisponderanno alle tabelle di cui sopra)... l'unica cosa che riesco ad ottenere è che viene trasferita sempre e solo il primo foglio della mia cartella di lavoro...

di seguito il codice che utilizzo:

Function Esporto() DoCmd.TransferSpreadsheet acExport, 8, "Lun", "C:\Documents and Settings\All Users\Desktop\Validazione\validazione.xls", False, "B1:o12000" False, "B1:o12000"Set xl = CreateObject("Excel.Application") ' dove sSource = path completo del tuo file .xls sSource = "C:\Documents and Settings\All Users\Desktop\Validazione\validazione.xls"With xl ' .Workbooks.Add .Workbooks.Open sSource ' .Sheets(sSheet).Activate .Visible = True End With End Function  

nel mio caso la cartella è "validazione.xls"  ed i fogli di lavoro sono divisi per giorni della settimana (lun, mar, ecc

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2015-03-24T17:11:44+00:00

Ciao Sandro!

Posto di nuovo il codice perché ho l'impressione che non ci siamo capiti riguardo la posizione dei due ScreenUpdating. Se sbaglio, scusami.

Option Compare Database

Option Explicit

#Const DevMode = 0

Public Sub Test4()

Const cstrProc = "Test4"

On Error GoTo ErrH

Dim e As Long

' --- Personalizzare -------------------- >

'

Const cstrXlsFullPath = "D:\Percorso\Test1"

Const cblnShow = False

' --------------------------------------- <

Const cstrXlClass = "Excel.Application"

Const cstrFullName = "<FullName>"

Const cstrCnn = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0" _

             & ";Data Source=" & cstrFullName _

             & ";Mode=Read;"

Dim dbp As Access.CurrentProject

Dim dbs As DAO.Database

Dim tdf As DAO.TableDef

#If DevMode Then

  Dim xlApp   As Excel.Application

  Dim xlWbk   As Excel.Workbook

  Dim xlWsh   As Excel.Worksheet

  Dim xlQry   As Excel.QueryTable

#Else

  Const xlCmdTable = 3

  Dim xlApp As Object

  Dim xlWbk As Object

  Dim xlWsh As Object

  Dim xlQry As Object

#End If

Dim blnNotRunning As Boolean

Dim strCnn    As String

Dim strTable  As String

Dim lngTable  As Long

    With Application

      Set dbp = .CurrentProject

      Set dbs = .CurrentDb

    End With

    strCnn = Replace(cstrCnn, cstrFullName, dbp.FullName)

    Debug.Print strCnn

    On Error Resume Next

    Set xlApp = GetObject(Class:=cstrXlClass)

    e = Err.Number

    On Error GoTo ErrH

    If e Then

      blnNotRunning = True

      Set xlApp = CreateObject(Class:=cstrXlClass)

    End If

    With xlApp

      If blnNotRunning And cblnShow Then .Visible = True

      .ScreenUpdating = False

      Set xlWbk = .Workbooks.Add

    End With

    With xlWbk.Worksheets

      .Add Count:=GetTableDefsCount(dbs) - .Count

    End With

    For Each tdf In dbs.TableDefs

      If (tdf.Attributes And dbSystemObject) = False Then

        lngTable = lngTable + 1

        strTable = tdf.Name

        Set xlWsh = xlWbk.Worksheets.Item(lngTable)

        With xlWsh

          .Name = strTable

          Set xlQry = .QueryTables.Add(Connection:=strCnn _

                                     , Destination:=.Range("A1"))

        End With

        With xlQry

          .CommandType = xlCmdTable

          .CommandText = strTable

          .AdjustColumnWidth = True

          .FieldNames = True

          .Refresh

          .Delete

        End With

        Set xlQry = Nothing

      End If

    Next

    MsgBox "Fatto!"

ExtP:

    On Error Resume Next

    Set tdf = Nothing

    Set dbs = Nothing

    Set dbp = Nothing

    With xlApp

      .ScreenUpdating = True

      .DisplayAlerts = False

    End With

    xlWbk.Close SaveChanges:=True _

              , FileName:=cstrXlsFullPath

    If cblnShow Then

      xlApp.Visible = True

    Else

      If blnNotRunning Then xlApp.Quit

    End If

    Set xlQry = Nothing

    Set xlWsh = Nothing

    Set xlWbk = Nothing

    Set xlApp = Nothing

    Exit Sub

ErrH:

    With Err

      MsgBox "ERR#" & CStr(.Number) _

           & vbNewLine & .Description _

           , vbOKOnly Or vbCritical, cstrProc

    End With

    Resume ExtP

End Sub

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

42 risposte aggiuntive

Ordina per: Più recente
  1. Anonimo
    2015-03-21T09:29:57+00:00

    ciao Maurizio,

    che pollastro che sono...

    Per le tabelle di base, la proprietà RecordCount include il numero di record nella tabella di database specificata. Per le tabelle collegate, la proprietà RecordCount è sempre impostata su –1.

    va da se che l'apertura del recordset è obbligatoria...!!!!

    faccio così' :

      If Len(tbf.Connect) > 0 Then

           Set rst = DBEngine(0)(0).OpenRecordset(tbf.Name, dbOpenDynaset)

           rst.MoveLast

           lngCount = rst.RecordCount

      Else

            lngCount = tbf.RecordCount

      End If

    oppure così :

    lngCount = tbf.RecordCount

    If lngCount = -1 Then

        Set rst = DBEngine(0)(0).OpenRecordset(tbf.Name, dbOpenDynaset)

        rst.MoveLast

        lngCount = rst.RecordCount

    End If

    definendo lngCount  as long

    mi piace di più la seconda.

    e così per la definzione del range per entrambe le soluzioni :

    Set rRange = newWorkSheet.Range(newWorkSheet.cells(2, i + 1), newWorkSheet.cells(lngCount + 1, i + 1))

    ciao e buon sabato!

    Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-03-21T03:03:13+00:00

    ho controllato la guida ed in rete e sono a conoscenza del metodo movelast per restituire il conteggio corretto del numero di records, di un recordset però.

    il problema che rilevo è solo con le tabelle collegate che essendo un oggetto tabledefs, ed  applicando loro la proprietà recordcount, essa dovrebbe restituirne il numero corretto di records.

    Ciao Sandro.

    Già, dimenticavo che stai usando un TableDef. Ma sta scritto:

    TableDef.RecordCount, proprietà

    [...]

    Quando si utilizzano oggetti TableDef collegati l'impostazione della proprietà RecordCount è sempre -1.

    Sempre nella Guida.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-03-20T23:16:55+00:00

    ciao Maurizio,

    ho controllato la guida ed in rete e sono a conoscenza del metodo movelast per restituire il conteggio corretto del numero di records, di un recordset però.

    il problema che rilevo è solo con le tabelle collegate che essendo un oggetto tabledefs, ed  applicando loro la proprietà recordcount, essa dovrebbe restituirne il numero corretto di records.

    Risolvo il tutto utilizzando un recordset per il conteggio dei records, e modifico la routine esattamente come detto.

    quindi, o non ho capito il tuo suggerimento o non capito quanto ho trovato in rete...

    Mi vien da pensare dopo varie prove e ragionamenti che il metodo movelast per l'oggetto tabledef non esista proprio perché se viene applicato il recordcount all'oggetto tabledef per definzione restituisce il numero corretto di records, ma questo cozza per le tabelle collegate...

    Domani provo con Ado, ma sono aperto ad ogni spiegazione...!

    ciao e grazie ancora.

    Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-03-20T20:47:51+00:00

    Ciao Sandro Peruz,

    quel -1 vuol dire: "Santa Pazienza, devo far tutto io? Non ho voglia di contare record che chissà dove sono. So che ce ne sono, altrimenti avrei risposto: zero". Insomma, bisogna costringerlo. Con un MoveLast. Ecco perché non bisognerebbe mai fidarsi di RecordCount. È scritto anche nella Guida. Asp che guardo...

    Eccolo:

    Utilizzare la proprietà RecordCount per individuare il numero di record a cui si è eseguito l'accesso contenuti in un oggetto Recordset o TableDef. La proprietà RecordCount non indica la quantità di record contenuti in un oggetto Recordset di tipo dynaset, snapshot o forward-only fino a quando non è stato eseguito l'accesso a tutti i record. Dopo che è stato eseguito l'accesso all'ultimo record, la proprietà RecordCount indica il numero totale di record non eliminati nell'oggetto Recordset o TableDef. Per forzare l'accesso all'ultimo record, utilizzare il metodo MoveLast sull'oggetto Recordset. È inoltre possibile utilizzare una funzione Count SQL per determinare il numero approssimativo di record restituito dalla query.

    La risposta è stata utile?

    0 commenti Nessun commento