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
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
- Compartir respuesta
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.
- Compartir respuesta