Exportar un su formulario de access a excel

Tengo un subformulario de access y quisiera exportar esa información a excel asignado un botón

2 respuestas

Respuesta
1

La respuesta que da el sabio es ineficiente y torpe desde todo punto de vista, utilizo para estos casos una función excelente para exportar recordset clonado en formulario o subformulario. Elaborada por Daniel Pineault, CARDA Consultants Inc., está diseñada para pasarle varios parámetros opcionales como:

- Ruta del archivo y nombre a usar

- Nombre de la hoja de trabajo para actualizar, si se proporciona el libro y la hoja no existe, será
creada.

- Número de columna para comenzar a insertar los datos

- Número de fila para comenzar a insertar los datos

- Ajustar automáticamente la columna al ancho de los datos

- Congelar la fila del encabezado

FORMULARIO

Le muestro el resultado de 2 formas de llamar la función:

Resultado de llamar la función sin pasar ningún parámetro. Observe que aparece como título Libro1. Ejemplo de llamada:

Call ExportRecordset2XLS(Me.RecordsetClone)

En este caso le pasé a la función 2 parámetros, la ruta y nombre del libro, y, nombre de la hoja.

Ejemplo de llamada:

Call ExportRecordset2XLS(Me.RecordsetClone, CurrentProject.Path & "\ejemploExcel.xlsx", "ejeExcel")

Copie y pegue este código en un módulo.

Código de la función.

Option Compare Database
Option Explicit
'---------------------------------------------------------------------------------------
'Procedimiento: ExportRecordset2XLS
'Autor: Daniel Pineault, CARDA Consultants Inc.
'Sitio web: http://www.cardaconsultants.com
'Propósito: exportar el conjunto de registros pasado a Excel
'Copyright: Lo siguiente es una publicación como Attribution-ShareAlike 4.0 International
'(CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
'
'Variables de entrada:
'~~~~~~~~~~~~~~~~
'rs: objeto Recordset para exportar a Excel
'sFile: Opcional -> Ruta del archivo y nombre a usar
'Si no se proporciona ninguno, se crea un nuevo archivo de Excel
'sWrkSht: Opcional -> Nombre de la hoja de trabajo para actualizar
'Si se proporciona sWrkSht y la hoja no existe, será
'                   creado
'lStartCol: Opcional -> Número de columna para comenzar a insertar los datos en
'Si no hay suministro, la insersión comenzará en la 1ra columna
'lStartRow: Opcional -> Número de fila para comenzar a insertar los datos en
'Si no hay suministro, la insersión comenzará en la 1ra fila
'bFitCols: Opcional -> Ajustar automáticamente la columna al ancho de los datos contenidos en
'El valor predeterminado es verdadero
'bFreezePanes: Opcional -> Congelar la fila del encabezado
'El valor predeterminado es verdadero
'bAutoFilter: Opcional -> AutoFilter los datos
'El valor predeterminado es verdadero
'
' Ejemplo de llamada:
' ~~~~~~
' Call ExportRecordset2XLS(Me.RecordsetClone)
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2017-Mar-13             Initial Release
' 2         2017-Mar-16             Added sFile
'                                   Added sWrkSht
'                                   Added lStartCol
'                                   Added lStartRow
'                                   Added bFitCols
'                                   Added bFreezePanes
'                                   Added bAutoFilter
' 2         2018-09-20              Updated Copyright
'---------------------------------------------------------------------------------------
Function ExportRecordset2XLS(ByVal rs As DAO.Recordset, _
                             Optional ByVal sFile As String, _
                             Optional ByVal sWrkSht As String, _
                             Optional ByVal lStartCol As Long = 1, _
                             Optional ByVal lStartRow As Long = 1, _
                             Optional bFitCols As Boolean = True, _
                             Optional bFreezePanes As Boolean = True, _
                             Optional bAutoFilter As Boolean = True)
    '#Const EarlyBind = True    'Use Early Binding, Req. Reference Library
    #Const EarlyBind = False    'Use Late Binding
    #If EarlyBind = True Then
        'Early Binding Declarations
        Dim oExcel            As Excel.Application
        Dim oExcelWrkBk       As Excel.WorkBook
        Dim oExcelWrkSht      As Excel.WorkSheet
    #Else
        'Late Binding Declaration/Constants
        Dim oExcel            As Object
        Dim oExcelWrkBk       As Object
        Dim oExcelWrkSht      As Object
        Const xlCenter = -4108
    #End If
    Dim bExcelOpened          As Boolean
    Dim iCols                 As Integer
    Dim lWrkBk                As Long
    'Start Excel
    On Error Resume Next
    Set oExcel = GetObject(, "Excel.Application")    'Bind to existing instance of Excel
    If Err.Number <> 0 Then    'Could not get instance of Excel, so create a new one
        Err.Clear
        On Error GoTo Error_Handler
        Set oExcel = CreateObject("Excel.Application")
        bExcelOpened = False
    Else    'Excel was already running
        bExcelOpened = True
    End If
    On Error GoTo Error_Handler
    oExcel.ScreenUpdating = False
    oExcel.Visible = False   'Keep Excel hidden until we are done with our manipulation
    If sFile <> "" Then
        Set oExcelWrkBk = oExcel.Workbooks.Open(sFile)    'Start a new workbook
        On Error Resume Next
        lWrkBk = Len(oExcelWrkBk.Sheets(sWrkSht).Name)
        If Err.Number <> 0 Then
            oExcelWrkBk.Worksheets.Add.Name = sWrkSht
            Err.Clear
        End If
        On Error GoTo Error_Handler
        Set oExcelWrkSht = oExcelWrkBk.Sheets(sWrkSht)
        oExcelWrkSht.Activate
    Else
        Set oExcelWrkBk = oExcel.Workbooks.Add()    'Start a new workbook
        Set oExcelWrkSht = oExcelWrkBk.Sheets(1)
        If sWrkSht <> "" Then
            oExcelWrkSht.Name = sWrkSht
        End If
    End If
    With rs
        If .RecordCount <> 0 Then
            .MoveFirst    'This is req'd, had some strange behavior in certain instances without it!
            'Build our Header
            '****************
            For iCols = 0 To rs.Fields.Count - 1
                oExcelWrkSht.Cells(lStartRow, lStartCol + iCols).Value = rs.Fields(iCols).Name
            Next
            'Format the header
            With oExcelWrkSht.Range(oExcelWrkSht.Cells(lStartRow, lStartCol), _
                                    oExcelWrkSht.Cells(lStartRow, lStartCol + iCols - 1))
                .Font.Bold = True
                .Font.ColorIndex = 2
                .Interior.ColorIndex = 1
                .HorizontalAlignment = xlCenter
            End With
            'Copy the data from our query into Excel
            '***************************************
            oExcelWrkSht.Cells(lStartRow + 1, lStartCol).CopyFromRecordset rs
            'Some formatting to make things pretty!
            '**************************************
            'Freeze pane
            If bFreezePanes = True Then
                oExcelWrkSht.Cells(lStartRow + 1, 1).Select
                oExcel.ActiveWindow.FreezePanes = True
            End If
            'AutoFilter
            If bAutoFilter = True Then
                oExcelWrkSht.Rows(lStartRow & ":" & lStartRow).AutoFilter
            End If
            'Fit the columns to the content
            If bFitCols = True Then
                oExcelWrkSht.Range(oExcelWrkSht.Cells(lStartRow, lStartCol), _
                                   oExcelWrkSht.Cells(lStartRow, lStartCol + iCols)).EntireColumn.AutoFit
            End If
            'Start at the top
            oExcelWrkSht.Cells(lStartRow, lStartCol).Select
        Else
            MsgBox "There are no records returned by the specified queries/SQL statement.", _
                   vbCritical + vbOKOnly, "No data to generate an Excel spreadsheet with"
            GoTo Error_Handler_Exit
        End If
    End With
Error_Handler_Exit:
    On Error Resume Next
    oExcel.Visible = True   'Make excel visible to the user
    Set rs = Nothing
    Set oExcelWrkSht = Nothing
    Set oExcelWrkBk = Nothing
    oExcel.ScreenUpdating = True
    Set oExcel = Nothing
    Exit Function
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: ExportRecordset2XLS" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function

Para que inventar la rueda si ya existe. Ofrezco el código y respeto el autor no como otros que acostumbran hacerlo y se atribuyen méritos que no le corresponden. Esto es para el inexperto Julián Gonzalez

Respuesta
1

No dices si el archivo Excel ya está creado o quieres que te lo cree. Así que voy a suponer que ya está creado y se llama Yasmin.xlsx. Y como no quiero complicarte la vida con mucho código...

Yo tengo una tabla Ventas y otra DetalleVenta relacionadas por Idventa y con ellas tengo hecho un formulario con subformulario, como en la imagen

Con la tabla DetalleVenta(la del subformulario) creo una consulta de creación de tabla a la que voy a llamar Aux, como en la imagen

De forma que cuando en cualquier registro pulso el botón

En este caso, el código del botón es

Private Sub Comando52_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "consulta1"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "aux", "c:\users\gonza\documents\borrar\yasmin.xlsx", True
DoCmd.DeleteObject acTable, "aux"
End Sub

Es decir

1º Lo de Docmd. Setwarnings es para que no aparezca lo de Va a crear...

2º Abre(ejecuta, ya que es una consulta de acción) la consulta1, con lo cual crea la tabla aux sólo con los registros del subformulario

3º Envía a Excel los datos a la hoja Aux

4º Elimina la tabla Aux para que pueda repetir el proceso.

Como esta página ya no avisa de la petición de ampliación de información, si quisieras preguntar algo, casi mejor que me envíes un mensaje (sólo el mensaje) a [email protected] avisándome, o por si quisieras el ejemplo.

El retrasado mental de Eperezfer sólo sabe copiar lo que hacen otros, su única neurona no da para más.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas