Exportar a excel desde un listbox

Tengo un formulario en el cual tengo dos objetos: un cuadro combinado y un cuadro de texto (listbox), de tal manera que cuando selecciono una opción listada en el cuadro combinado se desplega toda la información asociada (de una tabla) en el cuadro de texto. Me gustaría crear un botón que esté nulo (en gris) hasta que se habilite al seleccionar una opción en el cuadro combinado, y que cuando se clique el botón coja toda la información que hay en el listbox y lo exporte a una nueva hoja de excel. ¿Es posible?

Respuesta
2

Para hacer esa operación sigue el proceso que te comento.

En el Formulario pones un Botón que puedes llamar como quieras, pero en el Código yo lo he llamado >> BtnExportListaAExcel

Copia el Procedimiento en el Módulo del Formulario y no te olvides de Activar el Procedimiento de Evento.

En un Modulo Estandar copia las variables que te comento y la Función.

'En un Botón del Formulario que he llamado BtnExportListaAExcel
Private Sub BtnExportListaAExcel_Click()
Dim dbs As DAO.Database
Dim Qdf As DAO.QueryDef
Dim StrSQL As String  
Dim StrQry As String
Di
Dim RutaExport As String, NombExcel As String, NombFichero As String
StrSQL = Me.Lista0.RowSource  'Nombre de la Consulta capturada como RowSorce del Cuadro de Lista. En éste caso el ListBox se llama Lista0
StrQry = "QryTemporal"      'Nombre de la Consulta que se crea con el CreateQry de abajo
RutaExport = CurrentProject.Path & "\Export\"          'Export será una carpeta que cuelga de la que está la BBD (Se puede cambiar)
NombExcel = "ExcelTemp" & Format(Now(), "yymmddhhnn")  'ExcelTem es el comienzo del Nombre del FicheroExcel que obtendremos. y el Format...para detectar Fecha y hora
NombFichero = RutaExport & NombExcel & ".xlsx"         'NombFichero es la Ruta completa que se necesita. Aquí por ejemplo Obtenemos >> "C:\DirectorisBBDS\Export\ExcelTemp1904301524.xlsx"
'Sondeo si por alguna maniobra se ha quedado creada y sin Borrar la Consulta >> "QryTemporal" -----
ObjetoDestino = "QryTemporal"
Call ExisteObjeto(ObjetoDestino)
If Existe = True And EsConsulta = True Then  'En principio no debe existir porque se borra al Exportar, pero por si acaso
        DoCmd.DeleteObject acQuery, StrQry
Else
        Set dbs = CurrentDb
        Set Qdf = dbs.CreateQueryDef(StrQry, StrSQL)
        'Aegurar que la Consulta tiene Registros
    If Nz(DCount("*","QryTemporal"),0) > 0 Then 'Si la Consulta tiene Registros seguimos el Proceso      
                DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, StrQry, NombFichero, True
                MsgBox "El Fichero de Excel generado es: " & NombFichero, vbInformation, "EXCEL GENERADO"
        Else
                MsgBox "La lista de valores no puede estar vacía. Asegura que tiene valores", vbCritical, "FALTAN DATOS"
        End If
        DoCmd.DeleteObject acQuery, StrQry 'Elimino la Consulta Temporal
        Set dbs = Nothing
        Set Qdf = Nothing
End If
End Sub
'Para poner en un Modulo Estandar. Váldrá en otros usos de ver si existe una Consulta o Tabla
'Declarar éstas variables Publicas
Public Existe As Boolean
Public EsConsulta As Boolean
Public EsTabla As Boolean
Function ExisteObjeto(NombreObjeto)
Existe = False
EsConsulta = False
EsTabla = False
For Each Objeto In CurrentDb.QueryDefs
        If NombreObjeto = LCase(Objeto.Name) Then
                Existe = True
                EsConsulta = True
                Exit For
        End If
Next
If Not Existe Then
        EsConsulta = False
        For Each Objeto In CurrentDb.TableDefs
                If NombreObjeto = LCase(Objeto.Name) Then
                        Existe = True
                        EsTabla = True
                        Exit For
                End If
        Next
End If
End Function ' ExisteObjeto

En el conjunto se puede aligerar de líneas de Código, pero he preferido seguir un paso a paso completo, para que se vea el Proceso. El código está comentado y no debería representar ningún inconveniente al aplicarlo, pero en caso de ser así me comentas. Saludos >> Jacinto

¡Gracias! 

Lo probaré: entiendo que tendré que cambiar muchos campos para adecuarlo al access que tengo, ¿cierto?

Si quieres respetar los nombres que yo he puesto, lo puedes hacer a condición de que:

Crees una nueva Carpeta que cuelgue de la que esté la Base de Datos y que se llame >> Export

Después de eso solo debes cambiar Lista0 por el Nombre del ListBox que tu tengas.

Cuando hayas hecho pruebas y te funcione, puedes ir cambiando el Nombre del Fichero u otras cosas, que a ti te resulten mas representativas, pero de momento mi sugerencia es que solo hagas los dos cambios que te comento. Un saludo >> Jacinto

Gracias, Jacinto: comienzo con las consultas...

Los nombres de los controladores que tengo son 'btnExportExcel' y 'lstActivitats'. Y tengo el siguiente error:

Como primera limpieza, quita ese Di, porque es un principio de Dim de una variable que supongo iba a declarar. Le doy una mirada con calme si es que quitándolo no se soluciona. Saludos >> Jacinto

Continuamos: una consulta, has mencionado que debo crear la carpeta y leyendo el código (lo poco que entiendo) no comprendo dónde tengo que crear la carpeta "Export".

Comencemos con la Carpeta: Vamos a suponer que tu base de datos está en un Directorio (Carpeta) tal como C:\MisBasesAccess\EjemplosExport

Pues bien En la carpeta EjemplosExport has de Crear una que se llame Export, de modo que la estructura te quedará como:

C:\MisBasesAccess\EjemplosExport\Export

El error que te da en la figura lo hace, porque esa parte la has de copiar en un Módulo estandar tal como te comento. Si es que quieres dejarlo donde lo tienes, esas tres variables las has de poner inmediatamente después del Option Compare Database y borrarlas de ahí. Un saludo > Jacinto

Probaré y te aviso: y aprendreré que es un "módulo estándar" :)

Genial, Jacinto:

Ha funcionado de mil maravillas. Una consulta para acabar, ¿sabrías decirme cómo cambiar el título de las columnas en el access, de tal manera que se vea reflejado también en los .xls que se creen?

Lo puedes hacer como mínimo de un par de maneras, y según tengas el RowSource del ListBox.

1.- El menos aconsejable es cambiar el Nombre de los Campos de la Tabla Origen en Vista de diseño, ya que puede que afecte a otros Objetos y no lo puedas controlar facilmente.

2.- Vamos a suponer que un ListBox (Como ya tienes uno sabes su estructura), lo quiero llenar con unos datos de una Tabla y quiero personificar los Nombres que van a aparecer.

Espero que fuera esa tu duda. Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas