› Sviluppare funzionalita su Microsoft Office con VBA › Access export report su Excel-2
-
AutoreArticoli
-
Magari potevo continuare sul thread precedente, ma per evitare confusione, ne apro un altro, visto che l'oggetto è diverso.
Ho un report, basato su una query, che elenca dei nominativi in base ad un certo criterio; non è importante, il report funziona bene. Notare che le intestazioni delle colonne nel report sono un po' diverse da quelle della tabella origine per motivi di spazio. Questo è uno snapshot del report

Ora vorrei esportare il report su excel e pdf. L'export su pdf funziona perfettamente, e conserva le intestazioni del report. Questo è il codice
Private Sub Command27_Click() Dim path As String, NomeFile As String, filename As String On Error GoTo Command27_Click_Err path = CurrentProject.path NomeFile = "Report " & Format(Date, "dd-mm-yy") & ".pdf" ' if file exists, delete it filename = path & "\" & NomeFile If Len(Dir$(filename)) > 0 Then Kill filename DoCmd.OutputTo acOutputReport, "Elenco Soci", acFormatPDF, _ filename Command27_Click_Exit: Exit Sub Command27_Click_Err: MsgBox Error$ Resume Command27_Click_Exit End SubUsando lo stesso codice col " DoCmd.OutputTo acOutputReport" e "acFormatXslx" per l'export su excel, il file di uscita, come potete vedere, presenta vari problemi ed è inutilizzabile:

-la prima colonna è finita in fondo
-due campi del record header (anno, 2026, e conteggio, 100) sono finiti in A1 e B1, quasi intestazione colonne
-le intestazioni colonne del report sono ignorate, compaiono le intestazioni della tabella
-aggiunte le intestazioni column1, column2 etc.
-ovviamente, tutte le mie formattazioni successive vanno a pallino
Come dicevo, ho risolto parzialmente il problema usando il codice seguente con "transferSpreadsheet", che peraltro continua ad usare le intestazioni della tabella; ciò magari è ovvio, visto che l'export fa riferimento diretto alla query. Comunque l'output è corretto e posso applicare le mie formattazioni.Private Sub Command32_Click() Dim path As String, NomeFile As String, filename As String Dim XLapp As Object, wkbk As Workbook, wks As Worksheet path = CurrentProject.path NomeFile = "Report " & Format(Date, "dd-mm-yy") & ".xlsx" ' if file exists, delete it filename = path & "\" & NomeFile If Len(Dir$(filename)) > 0 Then Kill filename ' ' DoCmd.OutputTo acOutputReport, "Elenco Soci", acFormatXLSX, _ ' filename DoCmd.TransferSpreadsheet _ acExport, _ acSpreadsheetTypeExcel12Xml, _ "QryReportSoci", _ filename, True ' Adjust columns and format as table fot easier reading Set XLapp = CreateObject("Excel.Application") ' With xlApp Workbooks.Open (path & "\" & NomeFile) Set wkbk = Workbooks(NomeFile) ' .Visible = True ' End With Set wks = wkbk.Worksheets(1) With wks .Columns("A:L").AutoFit ActiveSheet.ListObjects.Add(xlSrcRange, _ Range("A1").CurrentRegion, XlListObjectHasHeaders:=xlYes, _ TableStyleName:="TableStyleMedium7").Name = "ElencoSoci" End With wkbk.Save wkbk.Close Set wks = Nothing Set wkbk = Nothing ' Set xlApp = Nothing DoCmd.Close acQuery, "QryReportSoci", acSaveNo End SubQuindi la domanda è: perchè non funziona il "DoCmd.OutputTo acOutputReport" con excel?
E' possibile avere le intestazioni colonne del report in excel?
tanto per capire meglio, visto che un rimedio parziale comunque c'è...
Ciao, ricordando il fatto che non sono molto ferrato su Access, ma in ufficio ho un database molto strutturato e quindi, seppur minima, di esperienza un po' ne ho...posso dirti che quando esporti in PDF, Access mantiene fedelmente il layout che visualizzi. Diverso è per l'esportazione in file di tipo XLSX in quanto Excel riceve dati grezzi.
Anche io come te ho lo stesso identico problema e per risolverlo, dopo estratti i dati, apro in modo silente il file appena creato e lo modifico andando a eliminare, spostare e rinominare ciò interessa...un po' come già fai tu.
Le intestazioni che vedi: "Nome"; "Numero tessera"; "Tessera Elettronica n"; "Indirizzo"; ecc.. dovrebbero essere i nomi che tu hai attribuito ai vari oggetti "textbox" (nome elemento) che ricevono i dati e non ciò che è scritto nelle label sopra di esse.
Il loro ordine di comparsa dovrebbe dipendere o dall'ordine in cui sono stati creati nel Report oppure dalla query stessa da cui dipendono.
Siccome ad un certo punto apri il file appena estratto per applicare l'AutoFit alle colonne e alla creazione di una ListObject, ti conviene andare ad eseguire prima le modifiche sulle etichette e lo spostamento di colonne, nonché la cancellazione di righe superflue...ma credo che questo tu già lo sappia.
Inoltre ti consiglio di verificare la presenza di istanze Excel in corso, anziché aprirne una nuova in modo brutale.
Dovresti sfruttare qualcosa del genere:
Dim xlApp As Object On Error Resume Next Set xlApp = GetObject(, "Excel.Application") If xlApp Is Nothing Then Set xlApp = CreateObject("Excel.Application") End If On Error GoTo 0 xlApp.Visible = TrueGrazie per l'interesse. Rincuora molto di queati tempi la volontà di collaborare a distanza.
Come ho scritto, ho rinumciato ad usare l'output di docmd.outputTo perchè troppo incasinato, quindi vado a modificare l'output di TransferSpreadsheet, che almeno è corretto. Non avevo pensato ai nomi delle text box, pensavo bastassero le intestazioni del report. Magari provo a cambiare quei nomi.
Aggiungo un bit di info. Aprendo il report in modalità "print preview" e cliccando il tasto destro su tale view, nel menu compare la voce "export to " e qui si può scegliere Excel, word etc. Solo che "export to Excel" prevede solo output su .xls

per cui viene l'idea che, nonostante la presenza di acFormatXslx nelle opzioni di runcmd.OutputTo, l'export di un REPORT in formato xslx non sia previsto e ci sia un po' di confusione nella documentazione Microsoft. Ok, possiamo sopravvivere.
-
AutoreArticoli
