Condividi tramite

Esportazione dati (in Excel, Csv, Txt, Xml)

Anonimo
2012-07-27T17:54:57+00:00

Ciao a tutti! Nel mio applicativo A2007 ho una routine che permette di esportare i dati di “Tabella2” in un file Excel.

“Tabella2” è composta dai seguenti 6 campi:

      - 1°          : data in cifre (es.: 02/04/2012)

      - 2° e 3°   : numero intero

      - 4°-5°-6° : Euro con due posizioni decimali (es.: € 220,46)

Se però l’applicativo deve girare in un pc in cui, oltre al sistema Windows è installato solo Access Stand-Alone o Access Run-Time, e quindi manca il programma Excel, in che formato potrei esportare i dati di “Tabella2”?

Un'idea potrebbe essere quella di verificare tramite vba, se è installato Excel e poi: 

  • se Excel è installato, eseguire la routine di esportazione in Excel, altrimenti
  • se Excel NON è installato, eseguire una routine di esportazione in CSV o TXT

Cosa mi consigliate?

N.B.: Volendo potrei esportare sempre in CSV (anche nel caso in cui sia installato Excel), però la routine che utilizzo per esportare in Excel, mi dispone i dati in modo ordinato (larghezza colonne, centratura dei dati, colore delle caselle)... mentre esportando in CSV e aprendo poi il file CSV con Excel, i dati non appaiono ben ordinati...

Microsoft 365 e Office | Accesso | 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

  1. Anonimo
    2012-07-28T07:54:28+00:00

    Ciao a tutti! Nel mio applicativo A2007 ho una routine che permette di esportare i dati di “Tabella2” in un file Excel.

    <cut>

    Se però l’applicativo deve girare in un pc in cui, oltre al sistema Windows è installato solo Access Stand-Alone o Access Run-Time, e quindi manca il programma Excel, in che formato potrei esportare i dati di “Tabella2”?

     

    Un'idea potrebbe essere quella di verificare tramite vba, se è installato Excel e poi: 

    • se Excel è installato, eseguire la routine di esportazione in Excel, altrimenti
    • se Excel NON è installato, eseguire una routine di esportazione in CSV o TXT

    Cosa mi consigliate?

     

    <cut>

     

    Questa funzione restituisce True o False a seconda della presenza o meno di Excel:

    Public Function fExcel() As Boolean

        Dim obj As Object

        On Error Resume Next

        Set obj = CreateObject("Excel.Application")

        If Err.Number <> 0 Then

            fExcel = False

        Else

            fExcel = True

        End If

        Err.Number = 0

        Set obj = Nothing

    End Function

    Puoi richiamarla così:

    Public Sub m()

        If fExcel Then

            MsgBox "Excel è presente"

        Else

            MsgBox "Excel non è presente"

        End If

    End Sub

    Sostituendo alle MsgBox il codice da eseguire. Vista la diffusione di O.O. e similari, controllerei se è presente Calc.

    I file .csv e .txt rimangono, per la semplice esportazione dei dati, le scelte migliori (o standard, se vuoi).

    C'è anche .xml (nelle sue varie forme/files) che consentirebbe di esportare anche le formattazioni.

    0 commenti Nessun commento

10 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-08-01T12:20:55+00:00

    Ciao Eulero,

    non so quanto si possa guadagnare ma puoi  provare e farci sapere:

    Cambierei questo pezzo:

      While Not rs.EOF

    strTesto = strTesto & rs("GIORNO") & ";" & _

    Right(String(5, " ") & rs("C2"), 5) & ";" & _

    Right(String(5, " ") & rs("C3"), 5) & ";" & _

    Right(String(15, " ") & Format(rs("C4"), "#,##0.00"), 15) & ";" & _

    Right(String(15, " ") & Format(rs("C5"), "#,##0.00"), 15) & ";" & _

    Right(String(15, " ") & Format(rs("C6"), "#,##0.00"), 15) & vbCrLf

    rs.MoveNext

    Wend

    così:

     Dim s5 as string

     dim s15 as string

    s5=String(5, " ")

    s15=String(15, " ")

    While Not rs.EOF

    strTesto = strTesto & rs("GIORNO") & ";" & _

    Right(s5 & rs("C2"), 5) & ";" & _

    Right(s5 & rs("C3"), 5) & ";" & _

    Right(s15 & Format(rs("C4"), "#,##0.00"), 15) & ";" & _

    Right(s15 & Format(rs("C5"), "#,##0.00"), 15) & ";" & _

    Right(s15 & Format(rs("C6"), "#,##0.00"), 15) & vbCrLf

    rs.MoveNext

    Wend

    qualcosina dovresti guadagnare!

    0 commenti Nessun commento
  2. Anonimo
    2012-08-01T11:21:32+00:00

    Grazie dei chiarimenti e dei consigli Mauro!!

    Esportazione in xlsIl metodo classico per esportare i dati nel formato XLS, è il seguente:

        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, _

                        "Tabella2", “C:\Percorso\MioFile.xls"

    Tuttavia io uso un altro metodo nel quale il salvataggio del file XLS (con il metodo SaveAs) necessita del:

    * parametro 43 se E <= E2003

    * parametro 56 se E >= E2007

    pertanto potrei utilizzare un codice del tipo:

     ------

    Public Sub ExportTable()

       On Error GoTo Excel_NotFound

       Select Case CreateObject("Excel.Application").Version / 10

          Case 8 To 11

             'Esportazione in formato XLS, passando il parametro 43

          Case 12 To 15

             'Esportazione in formato XLS, passando il parametro 56

          Case Else

    Excel_NotFound:

             'Esportazione in formato CSV

       End Select

    End Sub


    Esportazione in csv/txtMi sono creato un codice (analogo a quello proposto da Mauro) che esporta i dati in csv/txt:


    Public Sub m()

      Dim FileNum As Integer

      FileNum = FreeFile

      Dim strTesto As String

      Dim rs As DAO.Recordset

      DoCmd.Hourglass True

      On Error GoTo Err_Sub

      'If Dir(Environ("UserProfile") & "\Desktop\Export.csv") <> "" Then

      '  Kill Environ("UserProfile") & "\Desktop\Export.csv"

      'End If

      Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM Tabella2 ORDER BY GIORNO", dbOpenDynaset)

      Open Environ("UserProfile") & "\Desktop\Export.txt" For Output As #FileNum

      If Not rs.BOF Then 'Se il recordset non è vuoto

        rs.MoveFirst

        While Not rs.EOF

          strTesto = strTesto & rs("GIORNO") & ";" & _

                            Right(String(5, " ") & rs("C2"), 5) & ";" & _

                            Right(String(5, " ") & rs("C3"), 5) & ";" & _

                            Right(String(15, " ") & Format(rs("C4"), "#,##0.00"), 15) & ";" & _

                            Right(String(15, " ") & Format(rs("C5"), "#,##0.00"), 15) & ";" & _

                            Right(String(15, " ") & Format(rs("C6"), "#,##0.00"), 15) & vbCrLf

          rs.MoveNext

        Wend

      Else                'Se il recordset è vuoto

        MsgBox "La tabella è vuota!", vbExclamation + vbOKOnly, "Attenzione!"

      End If

      Print #FileNum, strTesto

      Close #FileNum

      DoCmd.Hourglass False

      MsgBox "Esportazione terminata!", vbExclamation, "Esportazione"

    Exit_Sub:

       rs.Close

       Set rs = Nothing

       Exit Sub

    Err_Sub:

       DoCmd.Hourglass False

       MsgBox "Errore n° " & Err.Number & ": " & Err.Description, vbExclamation

       GoTo Exit_Sub

    Enx Sub


    Questo codice però mi risulta abbastanza lento. Su un pc non tanto veloce, per esportare 2000 record, impiega anche 30 secondi... accetto suggerimenti per velocizzarlo...

    (La verifica e cancellazione del file Export.csv già esistente sembra non essere necessaria in quanto il file csv/txt può essere sovrascritto...)

    Esportazione in xmlUn metodo semplice per esportare i dati in formato XML, è il seguente:

         Application.ExportXML acExportTable, "Tabella2", “C:\Percorso\MioFile.xml"

    Per questo tipo di esportazione (come per il metodo TransferSpreadSheet), l'unico problema da risolvere sarebbe quello di riordinare i record in base al primo campo (GIORNO), probabilmente bisogna utilizzare una tabella temporanea...

    0 commenti Nessun commento
  3. Anonimo
    2012-07-29T08:56:34+00:00

    Grazie dell'attenzione Mauro!! Scusami l'ignoranza ma non ho ben capito le abbreviazioni e quindi il significato della frase:

    "Vista la diffusione di O.O. e similari controllerei se è presente Calc.".

     

    Ripensandoci su, la mia routine di esportazione in Excel, esporta i dati in un file XLSX, se però nel pc fosse installato una versione inferiore di E2007 (E1997 <= Excel <= E2003) bisognerebbe esportare i dati in un file XLS, pertanto mi ero chiesto: "Come potrei ricavare (tramite il mio applicativo Access) la versione di Excel installata nel pc?"

    Probabilmente basta applicare la proprietà “Version” all’oggetto “Excel.Application”,

    così per l’esportazione, pensavo di utilizzare un codice tipo il seguente:


    Public Sub ExportTable()

       On Error GoTo Excel_NotFound

       Select Case CreateObject("Excel.Application").Version / 10

          Case 8 To 11

             'Esportazione in formato XLS

          Case 12 To 15

             'Esportazione in formato XLSX

          Case Else

    Excel_NotFound:

             'Esportazione in formato CSV

       End Select

    End Sub


     

    Il codice:    CreateObject("Excel.Application").Version / 10

    l’ho provato su E2007 ed E2010, spero vada bene anche con le versioni inferiori:

    8 --> E1997  ,  9 --> E2000  ,  10 --> E2002  ,  11 --> E2003

    altrimenti devo trovare un codice più corretto...

    ________________________________________________________

     

    Per quanto riguarda l’esportazione in formato CSV, ho provato utilizzare  il codice:

        DoCmd.TransferText acExportDelim, , "Tabella2", "C:\MioPercorso\MioFile.csv", True

    Però mi esce un errore di run-tim ‘3441’: "Il separatore di campo nella specifica dei file di testo corrisponde al separatore decimale o al delimitatore di testo".

    Come potrei risolvere questo problema?

     

     

     

    O.O. sta per Open Office. Calc è l'quivalente di Excel di Open Office. E similari pechè c'è anche Libre Office e chiisà cosa altro.

    Una domanda(mia): se non hai particolari esigenze (numero di righe eccedenti le 65.536 o particolari formattazioni, perchè non salvare in .xls lasciando perdere il resto? E' standard per tutte le versioni e, inoltre, se salvi in .xlsx e il file verrà aperto all'interno del contesto che lo utilizza da un pc con le versioni più vecchie, perderai comunque le caratteristiche .xlsx. Per non parlare di eventuali problemi legati alle macro. Il mio consiglio, per quello che vale, è di salvare .xls.

    Per l'esportazione dei dati.

    Personalmente mi scrivo io le routine di salvataggio da Excel in .csv/.txt per evitare qualsiasi problema. Immagino sia possibile anche in Access.

    Apro un file di testo.

    Leggo il record del recordset inserendoli in una stringa e separando i campi con il separatore che scelgo, aggiungo un vbNewLine,  ripeto per ogni record, salvo il file.

    Adesso vado un po' OT in attesa deegli *accessisti*.

    In Excel, per salvare un file .csv con il mio separatore(qui ; punto e virgola), utilizzo un codice tipo questo(qui per 4 colonne a partire da colonna A per n righe):

    Public Sub m()

        Dim FileNum As Integer

        FileNum = FreeFile

        Dim sTesto As String

        Dim sTemp As String

        Dim lRighe As Long

        Dim lng As Long

    On Error GoTo RigaErrore

        If Dir("C:\Prova\unFile.txt") <> "" Then

            Kill "C:\Prova\unFile.txt"

        End If

        Open "C:\Prova\unFile.csv" For Output As #FileNum

        With Worksheets("Foglio1")

            lRighe = .Range("A" & Rows.Count).End(xlUp).Row

            For lng = 1 To lRighe

                        sTemp = .Cells(lng, 1).Value & ";" & _

                    Left(.Cells(lng, 2).Value & String(25, " "), 25) & ";" & _

                    Left(.Cells(lng, 3).Value & String(10, " "), 10) & ";" & _

                    Right(String(12, " ") & Format(.Cells(lng, 4).Value, "#,##0.00"), 12)

                sTesto = sTesto & sTemp & vbNewLine

            Next

         End With

        Print #FileNum, sTesto

        Close #FileNum

        Exit Sub

    RigaErrore:

        MsgBox Err.Number & vbNewLine & Err.Description

    End Sub

    Come puoi vedere, nel blocco che porta il contenuto delle celle nella stringa, posso operare formattazioni diverse(non è detto siano sempre corrette e giustificate).

    Questi i dati nelle celle di Excel se vuoi provare a vedere l'effetto finale(nel tuo caso, ripeto che devi ciclare i record del recordset):

    COD001 Pippo Pippi 29/07/2012 1.345,90
    COD002 Pluto Pluti 30/07/2012 10
    COD003 Topolino Topi 31/07/2012 0,54
    COD004 Paperino Paperi 01/08/2012 23.987,01
    0 commenti Nessun commento
  4. Anonimo
    2012-07-29T07:29:17+00:00

    Grazie dell'attenzione Mauro!! Scusami l'ignoranza ma non ho ben capito le abbreviazioni e quindi il significato della frase:

    "Vista la diffusione di O.O. e similari controllerei se è presente Calc.".

    Ripensandoci su, la mia routine di esportazione in Excel, esporta i dati in un file XLSX, se però nel pc fosse installato una versione inferiore di E2007 (E1997 <= Excel <= E2003) bisognerebbe esportare i dati in un file XLS, pertanto mi ero chiesto: "Come potrei ricavare (tramite il mio applicativo Access) la versione di Excel installata nel pc?"

    Probabilmente basta applicare la proprietà “Version” all’oggetto “Excel.Application”,

    così per l’esportazione, pensavo di utilizzare un codice tipo il seguente:


    Public Sub ExportTable()

       On Error GoTo Excel_NotFound

       Select Case CreateObject("Excel.Application").Version / 10

          Case 8 To 11

             'Esportazione in formato XLS

          Case 12 To 15

             'Esportazione in formato XLSX

          Case Else

    Excel_NotFound:

             'Esportazione in formato CSV

       End Select

    End Sub


    Il codice:    CreateObject("Excel.Application").Version / 10

    l’ho provato su E2007 ed E2010, spero vada bene anche con le versioni inferiori:

    8 --> E1997  ,  9 --> E2000  ,  10 --> E2002  ,  11 --> E2003

    altrimenti devo trovare un codice più corretto...

    ________________________________________________________

    Per quanto riguarda l’esportazione in formato CSV, ho provato utilizzare  il codice:

        DoCmd.TransferText acExportDelim, , "Tabella2", "C:\MioPercorso\MioFile.csv", True

    Però mi esce un errore di run-tim ‘3441’: "Il separatore di campo nella specifica dei file di testo corrisponde al separatore decimale o al delimitatore di testo".

    Come potrei risolvere questo problema?

    0 commenti Nessun commento