Exportar tabla a Excel con VBA

Siguiendo un ejemplo de Neckkito cuyo código expongo a continuación:

Private Sub cmdExportar_Click()
'**Ejemplo de Neckkito programado el 20/06/18
Const laQry As String = "CListaExport"
Dim miExcel As String
Dim miQry As DAO.QueryDef
miExcel = CurrentProject.Path & "\MiLista.xlsx"
Set miQry = CurrentDb.CreateQueryDef(laQry, Me.miLista.RowSource)
DoCmd.TransferSpreadsheet acExport, , laQry, miExcel, True
DoCmd.DeleteObject acQuery, laQry
Set miQry = Nothing
MsgBox "Hecho"
' Application.FollowHyperlink miExcel
End Sub

Neckkito exporta una tabla (Tabla1) que tiene en su BD (Soporteje. Lista. Accdb). Donde tiene un formulario que contiene un Cuadro de lista (miLista) y un Botón de comando (cmdExportar).

En el Cuadro de lista, en Origen de la fila tiene establecido: SELECT [Tabla1].[Id], [Tabla1].[Nombre], [Tabla1].[Edad] FROM [Tabla1];

Pretendo cambiar el cuadro de lista por un Cuadro combinado en el que selecciono la tabla que quiero exportar a Excel.

Neckkito llama al fichero Excel MiLista.xlsx y yo pretendo que se llame igual que la tabla elegida en el combobox con extensión .xlsx

El listado de las tablas en el Cuadro combinado ya lo tengo resuelto.

Respuesta
2

Cambia esta línea:

miExcel = CurrentProject.Path & "\MiLista.xlsx"

por esta otra:

miExcel = CurrentProject.Path & "\" & Me.nombreCuadroCombinado & ".xlsx"

Donde tendrás que cambiar lo que está en negrita por el nombre de tu cuadro combinado.

Un saludo.


Muchas gracias Sveinbjorn, por tu rápida respuesta. 

La solución que propones me da error en el siguiente párrafo:

Set miQry = CurrentDb.CreateQueryDef(laQry, Me.miLista.RowSource)

He cambiado Me.miLista.RowSource por Me.Cuadrocombinado0.RowSource y me da error

"3129" en tiempo de ejecución.

"Instrucción SQL no válida; se esperaba 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', 'UPDATE' "

Que crees que puede ser. 

A RowSource también le he añadido RowSourceType, pero sigue el error.

Un saludo.

Tu cuadro combinado tiene que tener como origen una SQL, no el nombre de una tabla o una lista lista de valores. Es lo que se me ocurre por ese mensaje de error.

Buenos días:

Sveinbjorn,  y eso ¿si es posible?, ¿Cómo se hace?

Yo había pensado, crear, en el mismo formulario donde tengo el cuadro combinado un cuadro de lista y darle como RowSource el RecordSource del cuadro combinado, pero no se hacerlo y tampoco se si eso soluciona el problema.

Ante este problema, crees que sería mejor, por ser mas fácil, tratar de seguir otro ejemplo para exportar la tabla de Access a Excel.

Muchas gracias

Un saludo.

Si sacas las propiedades de tu cuadro combinado, y te vas a la pestaña "Datos", ¿qué te pone en la propiedad "origen de la fila"? Por lo que comentas, ahí intuyo que tienes el nombre de una tabla y no una sentencia SQL. Lo que tienes que hacer es borrar el nombre de esa tabla y en su lugar poner una SQL del tipo "SELECT * FROM TABLA" o "SELECT campo1, campo2... FROM TABLA", tal como tenías antes en tu cuadro de lista.

En origen de la fila del cuadro combinado no tengo nada, está vacio.

Lo que tengo es en el formulario donde está el cuadro combinado, en el evento Al cargar:

Private Sub Form_Load()

Dim Tbl As AccessObject
'Dim Qry As AccessObject   'Se suprimen las consultas
Dim miDB As DAO.Database
Set miDB = CurrentDb
For Each Tbl In CurrentData.AllTables
If Not Tbl.Name Like "MSys*" Then Me.Cuadrocombinado0.AddItem Tbl.Name
Next Tbl

miDB.Close
'Set miDB = Nothing
End Sub

Esto hace que al cargar el formulario en el cuadro combinado aparezcan todas las tablas de la BD.

Porque en el evento del cuadro combinado Después de actualizar tengo el siguiente código:

Private Sub Cuadrocombinado0_AfterUpdate()
Dim vartabla As String
vartabla = Me.Cuadrocombinado0 'Pillamos el nombre de la tabla del cuadro combinado

'Ponemos la variable a las tablas y le asignamos recordsource al formulario
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
End Sub

Este código es una aportación tuya a mi consulta a este foro: "Error 3075 en código vba Access"

Ahora te tengo que dejar pues me voy de viaje, estaré operativo antes de las 20 h.

Un saludo.

Como te decía en mi respuesta anterior, para usar el código tal como lo tienes (Set miQry = CurrentDb.CreateQueryDef(laQry, Me.Cuadrocombinado0.RowSource)), el cuadro combinado tiene que tener como "origen de fila" (RowSource) una SQL, y en tu caso, es una lista de valores (los que cargas con el código del Form_Load)

Una forma de solucionarlo es utilizar la misma solución que en el otro código, es decir:

Set miQry = CurrentDb.CreateQueryDef(laQry, "SELECT * FROM [" & Me.Cuadrocombinado0 & "]")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas