Creazione di un file Excel con Access

di il
11 risposte

Creazione di un file Excel con Access

Buongiorno,

vorrei chiedere se esiste la possibilità in Access, utilizzando il VBA, di generare un file excel migliore di quello che genera il comando seguente:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Priority_Table", strAllegato

Cosa intendo per migliore:

1) Che presenti una larghezza colonna non fissa ma già adattata al contenuto della colonna stessa senza superare un valore massimo di larghezza (aprendo il file excel generato da Access, non si legge il contenuto delle celle, occorre allargare le colonne che sono tutte a lunghezza standard)

2)Che presenti una altezza di riga adeguata in funzione della massima larghezza di colonna.

In somma, vorrei formattare la larghezza colonna e altezza riga come farei manualmente ma in modo controllato dal programma in VBA.

C'è qualcosa che si può fare durante la generazione del file excel con codice VBA?

Grazie

Francesco

11 Risposte

  • Re: Creazione di un file Excel con Access

    Io creerei prima un report con un look molto simile alla griglia, impostando la proprietà Espandibile: Sì per quei campi che desideri "adattare". Poi esporti il report in Excel.

  • Re: Creazione di un file Excel con Access

    Creati un Template tuo in Excel ed esporta i dati nelle Aree destinate... ovviamente se usi la funzione TransferSpreadsheet  hai qualche limite, ma basta conoscerlo e predisporre il foglio in modo adeguato.

    Esempio la funzione in oggetto, supporta il Parametro RANGE,come vedi...

    expression.TransferSpreadsheet (TransferType, SpreadsheetType, TableName, FileName, HasFieldNames, Range, UseOA)

    Questo può essere usato passando il NomeFoglio e Range AlfaNumerico... es: NomeFoglio!A2:F65

    Range:=strSheetName & "!" & strRange

    In ogni caso ci sono molti modi per esportare in Excel, io per applicazioni specifiche preferisco passare il Recordset DAO direttamente ad Excel usando il Metodo CopyFromRecordset, ma questo richiede l'automazione, un processo più articolato che la semplice chiamata sopra.

    Quì trovi qualche esempio con le spiegazioni:

    https://www.automateexcel.com/vba/access/import-export-excel/

  • Re: Creazione di un file Excel con Access

    Dear Osvaldo and Alex,

    grazie per il suggerimento.

    Il metodo suggerito da Alex mi piace di più per evitare di creare un oggetto report in ACCESS.

    Inoltre nel mio caso specifico la creazione del file excel è inserita in un codice VBA che spedisce l'allegato excel con Outlook.

    Per questo motivo vorrei integrare il codice già presente con il necessario a formattare il file excel nel miglior modo.

    Il codice che utilizzo è di sotto riportato.

    @ ALEX: secondo te posso inserire in questo codice sotto riportato quanto mi hai prospettato sopra nel tuo messaggio?

    Private Sub Command3_Click()
    ' EMAIL DI SOLLECITO INVIO NOTIFICA DI ISPEZIONE FINALE
    
    Dim rstEmail As New ADODB.Recordset
    Dim Cat As New ADOX.Catalog
    Cat.ActiveConnection = CurrentProject.Connection
    Dim cmd1 As ADODB.Command
    Dim strDestinatario_to As String
    Dim strDestinatario_cc As String
    Dim strBody As String
    Dim strSubject As String
    Dim ponum As String
    Dim appOutlook As New Outlook.Application
    Dim mail As Outlook.MailItem
    
    ' Elimina la tabella che viene generata tramite istruzione successiva
    Cat.Tables.Delete "RFI_Pending"
    
    ' Crea la tabella dalla quale viene generata la query parametrica per generare il file excel da allegare alla email
    Set cmd1 = Cat.Procedures("RFI_Pending_Make_Table").Command
    cmd1.Execute
    Set cmd1 = Nothing
    Application.RefreshDatabaseWindow
    
    ' Apro il recordset ed assegno il valore alle variabili
    rstEmail.Open "Email_RFI", CurrentProject.Connection, adOpenForwardOnly
    
    Do Until rstEmail.EOF
                                
                       
                       strDestinatario_to = rstEmail![DESTINATARIO_TO]
                       strDestinatario_cc = rstEmail![DESTINATARIO_CC]
                       ponum = rstEmail![PO NO]
                       strSubject = rstEmail![OGGETTO] & "RFI NOT SUBMITTED YET / VENDOR ACTION IS REQUIRED"
                       strBody = rstEmail![CORPO]
                       strPM_Name = rstEmail![PM_NAME]
                       
                       
                       ' preparo allegato
                                           
                       Dim cmd As New ADODB.Command
                       Set Cat.ActiveConnection = CurrentProject.Connection
                       Dim strPercorso As String
                       Dim strAllegato As String
                       Dim strFilename As String
    
                      
                       strPercorso = Application.CurrentProject.Path & "\"
                       strFilename = ponum & "_" & "RFI_Not_Submitted_Yet" & "_" & Format(Date, "yyyymmdd") & "_" & Format(Time, "hhmm") & ".xls"
                       strAllegato = strPercorso & strFilename
    
                       Dim strSQL As String
                       strSQL = "SELECT RFI_Pending.* FROM RFI_Pending  WHERE RFI_Pending.[PO NO] ='" & ponum & "'"
    
                       cmd.CommandText = strSQL
                       Cat.Views.Append "RFI_Not_Submitted_Yet", cmd
                       Set cmd = Nothing
                       Application.RefreshDatabaseWindow
                       DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "RFI_Not_Submitted_Yet", strAllegato
                       Cat.Views.Delete "RFI_Not_Submitted_Yet"
                      
                       Application.RefreshDatabaseWindow
                       
                       
                       ' finito di preparare l'allegato adesso preparo l'invio della email
                                                                                
                       Set mail = appOutlook.CreateItem(olMailItem)
       
                       With mail
                           .To = strDestinatario_to
                           .CC = strDestinatario_cc
                           .Body = "Dear " & strPM_Name & strBody
                           .Subject = strSubject
                           .Attachments.Add (strPercorso & strFilename)
                           .Send
                       End With
                       Set mail = Nothing
                       
                       
              
               rstEmail.MoveNext
             
                
    Loop
    Set Cat = Nothing
    End Sub
    
  • Re: Creazione di un file Excel con Access

    28/01/2025 - fcaliandro ha scritto:

    C'è qualcosa che si può fare durante la generazione del file excel con codice VBA?

    Ciao, come ti hanno già risposto, certamente lo puoi fare e con diverse tecniche.

    28/01/2025 - fcaliandro ha scritto:

    1) Che presenti una larghezza colonna non fissa ma già adattata al contenuto della colonna stessa senza superare un valore massimo di larghezza (aprendo il file excel generato da Access, non si legge il contenuto delle celle, occorre allargare le colonne che sono tutte a lunghezza standard)

    Mi soffermo sulla formattazione del file excel una volta che l'hai creato e ti faccio questo esempio per farti capire cosa potresti fare utilizzando uno dei tanti metodi... in questo caso tutto da Vba.

    rea questa piccola demo...

    Crea una tabella di nome MyTrasfExcel con questi dati: (un campo di tipo testo, numerico, data e valuta)

    Per esempio crea una query di nome Qry_MyTrafExcel dove imposti i nomi delle colonne, le colonne da estrarre e da ordinare, etc etc..:

    Quando ti soddisfa la selezione della query .... salva e chiudi

    Adesso poniamo di voler creare un Excel in questa forma dove:

    • Impostare la riga di intestazione con uno sfondo e i titoli centrati ein grassetto
    • La riga di intestazione verrà bloccata in alto allo scorrere delle righe
    • Le quattro colonne A B C D sono formattate secondo il loro specifico contenuto (Testo, Numerico, Data e Valuta)
    • La colonna C viene impostato un colore di sfondo e di primo piano
    • Le righe importare verranno poste in una griglia

    ESEMPIO:

    A questo punto prendi un modulo in VBA, incolla il codice sotto riportato

    • imposta il percorso dove creare il file excel in xlsPath = "C:\youPath" e il nome del file excel da creare xlsName = "MyExcel.xlsx" (come test puoi lasciare questo nome)
      • in questo esempio verrà eliminato se già esiste il file excel
        • viene creato il nuovo file excel
        • viene formattato per le sue quattro colonne A B C D
    • premere F5 per eseguire il codice
    Option Compare Database
    Option Explicit
    
    Sub ExportExcel()
        ' initialize variables and object
        Dim xlApp As Object
        Dim xlWorkbook As Object
        Dim xlSheet As Object
        Dim fullPath As String
        Dim xlsPath As String
        Dim xlsName As String
        Dim trasfQuery As String
        Dim lastRow As Long
    
        ' set excel path
        xlsPath = "C:\youPath"
        ' set excel name
        xlsName = "MyExcel.xlsx"
        ' set excelfullpath
        fullPath = xlsPath & "\" & xlsName
    
        ' name query trasfer
        trasfQuery = "Qry_MyTrasfExcel"
        
        ' check excel file if exist
        If Dir(fullPath) <> "" Then Kill fullPath
    
        ' query export in the excel document
        DoCmd.TransferSpreadsheet _
                                TransferType:=acExport, _
                                SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
                                TableName:=trasfQuery, _
                                FileName:=fullPath, _
                                HasFieldNames:=True
    
        ' open excel file and format
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Visible = False
        Set xlWorkbook = xlApp.Workbooks.Open(fullPath)
        Set xlSheet = xlWorkbook.Sheets(1)
    
        ' set display grid remove
        xlSheet.Application.ActiveWindow.DisplayGridlines = False
    
        ' search last row
        lastRow = xlSheet.Cells(xlSheet.Rows.Count, 1).End(-4162).Row
    
        ' format only A, B, C, D columns
        With xlSheet.Range("A1:D1")
            .Font.Bold = True                   ' bold font
            .HorizontalAlignment = -4108        ' center
            .Interior.Color = RGB(255, 255, 0)  ' yellow background
            .Font.Color = RGB(0, 0, 0)          ' black color
        End With
    
        ' add grid in the A, B, C, D columns
        With xlSheet.Range("A1:D" & lastRow).Borders
            .LineStyle = 1
            .Weight = 2
            .Color = RGB(0, 0, 0)
        End With
    
        ' columns A format Text
        With xlSheet.Columns("A")
            .NumberFormat = "@"
            .AutoFit
        End With
    
        ' columns B format numeric and decimal point
        With xlSheet.Columns("B")
            .NumberFormat = "#,##0.000"
            .AutoFit
        End With
    
        ' columns C format date
        With xlSheet.Columns("C")
            .NumberFormat = "dd/mm/yyyy" ' Formato data
            .AutoFit
        End With
        ' column C format blue interior color and white fornt color
        With xlSheet.Range("C2:C" & lastRow)
            .Interior.Color = RGB(0, 0, 255)
            .Font.Color = RGB(255, 255, 255)
        End With
    
        ' columns D format currency
        With xlSheet.Columns("D")
            .NumberFormat = "#,##0.00 €"
            .AutoFit
        End With
    
        ' fix heading row
        xlSheet.Rows("2:" & lastRow).Select ' Seleziona i dati
        xlSheet.Application.ActiveWindow.FreezePanes = True
    
        ' set cursor
        xlSheet.Cells(2, 1).Select
    
        ' document save and close
        xlWorkbook.Save
        xlWorkbook.Close False
        xlApp.Quit
    
        ' object close
        Set xlSheet = Nothing
        Set xlWorkbook = Nothing
        Set xlApp = Nothing
    
        MsgBox "Completed export File: " & fullPath
    End Sub
    

    Con questa piccola e semplice demo puoi approfondire e studiarti come formattare le tue colonne del foglio excel appena creato.
    Puoi sostituire la query con un qualsiasi altro tipo di recordset e implementare varie cose come i vari controlli per le validazioni e metodi vari a tuo piacimento.

    Potrebbe essere un piccolo punto di partenza di come poter interagire tra VBA access e un Foglio Excel.

    (Come esempio ti ho riportato solo alcuni tipi di formattazione, ma puoi ben capire che lo puoi implementare secondo le tue specifiche esigenze)

  • Re: Creazione di un file Excel con Access

    28/01/2025 - fcaliandro ha scritto:

    Dear Osvaldo and Alex,

    grazie per il suggerimento.

    Il metodo suggerito da Alex mi piace di più per evitare di creare un oggetto report in ACCESS.

    Inoltre nel mio caso specifico la creazione del file excel è inserita in un codice VBA che spedisce l'allegato excel con Outlook.

    Per questo motivo vorrei integrare il codice già presente con il necessario a formattare il file excel nel miglior modo.

    Il codice che utilizzo è di sotto riportato.

    @ ALEX: secondo te posso inserire in questo codice sotto riportato quanto mi hai prospettato sopra nel tuo messaggio?

    Direi di no in senso assoluto ma non perchè non funziona, ma perchè non funzionerà più...!
    Le nuove versioni di MSO (Outlook) non esporranno più l'interfaccia COM di Automazione.

  • Re: Creazione di un file Excel con Access

    Grazie Franco,

    sei stato generoso nel fornirmi il codice di sotto. Ed anche la tua spiegazione è molto lineare e ben scritta.

    Avrei bisogno di un ultimo consiglio prima di fare qualche prova:

    Il mio codice attuale esegue le seguenti azioni in sequenza automatica su evento click (pulsante):

    1) Apre un recordset che contiene n destinatari

    2) Crea l'allegato in excel per il destinatario-1

    3) Prepara e spedisce la mail al destinatario-1

    4) ... ripete tutto per tutti gli n destinatari

    5) Uscita dal codice

    La domanda è: il codice dedicato alla "formattazione del file excel allegato" è meglio inserirlo nel mio codice esistente o è preferibile richiamarlo come codice esterno?

    La soluzione come codice esterno mi sembra più elegante, però non ho idea di come si possa fare. Mi puoi dare un'indicazione generale su come richiamare un codice? Io ho utilizzato le funzioni in VBA. Forse potrei farlo richiamando una funzione in VBA?

    Grazie

  • Re: Creazione di un file Excel con Access

    28/01/2025 - @Alex ha scritto:

    Le nuove versioni di MSO (Outlook) non esporranno più l'interfaccia COM di Automazione.

    Alex  Aiuto!! 

    significa che tutto il mio lavoro non sarà più utile quando sarò costretto a passare alla nuova versione di Outlook?

    Il nuovo Outlook non può inviare mail in automatico tramite VBA?

  • Re: Creazione di un file Excel con Access

    28/01/2025 - fcaliandro ha scritto:

    28/01/2025 - @Alex ha scritto:

    Le nuove versioni di MSO (Outlook) non esporranno più l'interfaccia COM di Automazione.

    significa che tutto il mio lavoro non sarà più utile quando sarò costretto a passare alla nuova versione di Outlook?

    Esatto

    Il nuovo Outlook non può inviare mail in automatico tramite VBA?

    No

  • Re: Creazione di un file Excel con Access

    28/01/2025 - By65Franco ha scritto:

    Con questa piccola e semplice demo puoi approfondire e studiarti come formattare le tue colonne del foglio excel appena creato.
    Puoi sostituire la query con un qualsiasi altro tipo di recordset e implementare varie cose come i vari controlli per le validazioni e metodi vari a tuo piacimento.

    Potrebbe essere un piccolo punto di partenza di come poter interagire tra VBA access e un Foglio Excel.

    (Come esempio ti ho riportato solo alcuni tipi di formattazione, ma puoi ben capire che lo puoi implementare secondo le tue specifiche esigenze)

    Franco

    mi hai postato qualcosa di molto utile, ma il codice è molto lungo e vorrei gestirlo come codice "richiamato" all'occorrenza (se possibile).

    Si può creare un codice esterno richiamato all'interno di un altro codice? Come per le funzioni VBA all'interno di una query...

    Fammi sapere grazie

    Francesco

  • Re: Creazione di un file Excel con Access

    L'esempio di Franco serve per farti capire cosa si può fare, se ti crei un Template formattato come serve a te e non devi trasferire dati in 7 aree del foglio... puoi evitare di doverlo formattare a Runtime.

  • Re: Creazione di un file Excel con Access

    29/01/2025 - fcaliandro ha scritto:

    Si può creare un codice esterno richiamato all'interno di un altro codice?

    Si che lo puoi fare ... devi semplicemente implementare la parte iniziale dove metterai i valori da passare come parametri e rendere il metodo come public.

    Per esempio puoi parametrizzare  la Path , Il nome del file excel, il nome della tabella o della query o un recorset da trattare per trasferire i dati all'excel.

    Infine quando richiami tale sub passerai semplicemente i parametri richiesti e il gioco è fatto.

    Però è anche validissimo il sistema riportato da @Alex

    Insomma, dovrai decidere come implementare il tuo progetto, grosso modo hai più di una soluzione, devi seguire la strada più utile allo scopo. 

Devi accedere o registrarti per scrivere nel forum
11 risposte