Anónimo
Enviar datos de Access a Excel
Antes de nada muchas gracias de antemano por la ayuda que prestas la los intentamos aprender un poco de Access.
Mi pregunta es si existe alguna forma de enviar los datos de una tabla de Access a una hoja Excel que tenga ya preparado para recoger los datos. Es decir poder colocar ciertos campos de una tabla de Access en la celda que yo desee de mi hoja de Excel (g7, k9, o cualquiera que sea la elegida).
La tabla se llama hotel y contiene 6 seis campos.
Mi pregunta es si existe alguna forma de enviar los datos de una tabla de Access a una hoja Excel que tenga ya preparado para recoger los datos. Es decir poder colocar ciertos campos de una tabla de Access en la celda que yo desee de mi hoja de Excel (g7, k9, o cualquiera que sea la elegida).
La tabla se llama hotel y contiene 6 seis campos.
Respuesta de María Celia Ibarra
1
1
María Celia Ibarra, Calculista Científica (Universidad Nacional de La Plata)
Te paso un esquema de trabajo. Con este esquema podes guardar lo que quieras del formulario copiando campo por campo.
Dim strLibro as string
' abro una instancia de Excel
Set xls = CreateObject("Excel.Application")
' con ella abro el libro ExportaraExcel
strLibro = CurrentProject.Path & "\PadronMasculino.xls"
xls.Workbooks.Open (strLibro)
' lo hago visible o no
xls.Visible = False ' o false
' activo la Hoja 2 en mi caso la hoja se llama "Masc 1"
xls.Worksheets("Masc 1").Activate
'Supongo que los campos a grabar son Campo1 y Campo2
'Copio Campo1 a la celda de la fila1 y columna1 (fila1 y columna2 son vaiables que tienen el número de fila y columna respectivamente
xls.ActiveSheet.Cells(fila1, columna1) = Campo1
'Copio Campo2 a la celda C2 (fila=2, columna C)
xls.ActiveSheet.Cells(2, 3) = Campo2
y así copio dato por dato en la celda que quiero y en la hoja que quiero
para terminar
' guardo los datos
xls.ActiveWorkbook.Save
' cierro excel
xls.Application.Quit
Set xls = Nothing
Siempre repetí los pasos:
1)
Abro una instancia de Excel
Con ella abro el libro ExportaraExcel
Lo hago visible o no
2) Seleccionar la hoja de Excel
3) Por cada campo asignás el dato a la celda
Los pasos 2 y 3 tantas veces como quieras para distintas hojas
4) Para terminar
Guardar los datos y cerrar excel
Dim strLibro as string
' abro una instancia de Excel
Set xls = CreateObject("Excel.Application")
' con ella abro el libro ExportaraExcel
strLibro = CurrentProject.Path & "\PadronMasculino.xls"
xls.Workbooks.Open (strLibro)
' lo hago visible o no
xls.Visible = False ' o false
' activo la Hoja 2 en mi caso la hoja se llama "Masc 1"
xls.Worksheets("Masc 1").Activate
'Supongo que los campos a grabar son Campo1 y Campo2
'Copio Campo1 a la celda de la fila1 y columna1 (fila1 y columna2 son vaiables que tienen el número de fila y columna respectivamente
xls.ActiveSheet.Cells(fila1, columna1) = Campo1
'Copio Campo2 a la celda C2 (fila=2, columna C)
xls.ActiveSheet.Cells(2, 3) = Campo2
y así copio dato por dato en la celda que quiero y en la hoja que quiero
para terminar
' guardo los datos
xls.ActiveWorkbook.Save
' cierro excel
xls.Application.Quit
Set xls = Nothing
Siempre repetí los pasos:
1)
Abro una instancia de Excel
Con ella abro el libro ExportaraExcel
Lo hago visible o no
2) Seleccionar la hoja de Excel
3) Por cada campo asignás el dato a la celda
Los pasos 2 y 3 tantas veces como quieras para distintas hojas
4) Para terminar
Guardar los datos y cerrar excel
Hola Marciana, que tal. Antes de nada agradecerte la prontitud con la que respondiste.
Me ha ido muy bien, lo he probado y me ha funcionado pero solo en parte, porque hay algunos campos que no me colocan los datos, a partir de una segunda fila porque es un subformulario, ¿Sabes cómo solucionarlo?
Muchas gracias de nuevo por todo
Me ha ido muy bien, lo he probado y me ha funcionado pero solo en parte, porque hay algunos campos que no me colocan los datos, a partir de una segunda fila porque es un subformulario, ¿Sabes cómo solucionarlo?
Muchas gracias de nuevo por todo
Tu problema debe ser la forma en que hacés referencia al valor que querés enviar a Excel. Es decir, tu problema está en Access, no en excel.
En la primer consulta mencionás "tabla" en el más reciente "subformulario" deberías ser más preciso. El código que escribiste dónde lo ubicaste, es muy diferene si lo ubicaste en un módulo a si lo ubicaste en el módulo del formulario o del subformulario (3 posibilidades)
Te doy una respuesta suponiendo que el código está en el formulario principal y el campo que querés enviar en el subformulario.
Si el formulario está abierto hay una forma de hacer referencia (da trabajo) a un control tanto de formulario como de subformulario. Esta forme depende desde donde se hace la referencia(el form principal, subformulario, otro subformulario, un módulo, también importa la versión) lo mejor es usar el Asistente de expresiones. En general es una de estas
Forms![Principal]![Secundario]. Form!Cantidad
Formularios!Principal![Secundario]. Formulario!Cantidad
La primera está en inglés (yo escribo los nombres de propiedades, funciones u objetos siempre en inglés, el sistema los traduce)
Atención a los puntos y signo de admiración, atención a los nombres de formulario, subformulario y control
Los nombres están en negrita.
Principal debe ser reemplazado por el nombre del formulario principal
Secundario debe ser reemplazado por el nombre del subformulario
Cantidad debe ser reemplazado por el nombre del control (cuadro de texto, por ejemplo)
Contame cómo te fue. M
En la primer consulta mencionás "tabla" en el más reciente "subformulario" deberías ser más preciso. El código que escribiste dónde lo ubicaste, es muy diferene si lo ubicaste en un módulo a si lo ubicaste en el módulo del formulario o del subformulario (3 posibilidades)
Te doy una respuesta suponiendo que el código está en el formulario principal y el campo que querés enviar en el subformulario.
Si el formulario está abierto hay una forma de hacer referencia (da trabajo) a un control tanto de formulario como de subformulario. Esta forme depende desde donde se hace la referencia(el form principal, subformulario, otro subformulario, un módulo, también importa la versión) lo mejor es usar el Asistente de expresiones. En general es una de estas
Forms![Principal]![Secundario]. Form!Cantidad
Formularios!Principal![Secundario]. Formulario!Cantidad
La primera está en inglés (yo escribo los nombres de propiedades, funciones u objetos siempre en inglés, el sistema los traduce)
Atención a los puntos y signo de admiración, atención a los nombres de formulario, subformulario y control
Los nombres están en negrita.
Principal debe ser reemplazado por el nombre del formulario principal
Secundario debe ser reemplazado por el nombre del subformulario
Cantidad debe ser reemplazado por el nombre del control (cuadro de texto, por ejemplo)
Contame cómo te fue. M
Hola Marciana gracias por contestar de nuevo.
He aplicado la expresión que me enviaste y no hace hace nada y he pegado la expresión que me enviaste y sustituido después los campos que pusiste en negrita.
De cualquier forma creo que es verdad que te he liado un poco, así que voy a intentar explicarme de nuevo partiendo de cero.
Tengo una tabla llamada Tabla1 que contiene 6 campos que son Código, FechaInicio, FechaFin, Cod_H, Cod_R y Importe. Partiendo de ahí hice un formulario con el campo Código y el cual contiene un subformulario con los otros campos restantes, saliendo alrededor de unas 15 o 20 filas en dicho subformulario. Mi objetivo es conseguir enviar a una plantilla diseñada de Excel los datos de esas filas del subformulario en las celdas de excel que yo deseo.
No se si es me has comprendido ahora o si debería una muestra de lo que tengo y de lo que quiero obtener.
Muchas gracias por tu paciencia.
Saludos.
He aplicado la expresión que me enviaste y no hace hace nada y he pegado la expresión que me enviaste y sustituido después los campos que pusiste en negrita.
De cualquier forma creo que es verdad que te he liado un poco, así que voy a intentar explicarme de nuevo partiendo de cero.
Tengo una tabla llamada Tabla1 que contiene 6 campos que son Código, FechaInicio, FechaFin, Cod_H, Cod_R y Importe. Partiendo de ahí hice un formulario con el campo Código y el cual contiene un subformulario con los otros campos restantes, saliendo alrededor de unas 15 o 20 filas en dicho subformulario. Mi objetivo es conseguir enviar a una plantilla diseñada de Excel los datos de esas filas del subformulario en las celdas de excel que yo deseo.
No se si es me has comprendido ahora o si debería una muestra de lo que tengo y de lo que quiero obtener.
Muchas gracias por tu paciencia.
Saludos.
Me genera duda lo siguiente: Decís que de una tabla con un campo hacés el formulario principal y con los otros campos el subformulario. En general se arma formulario con subformulario cuando hay dos tablas relacionadas entre sí en una relación de 1 a muchos, por ejemplo tengo una tabla Personas entre los datos localidad y tengo otra tabla Localidades. Estas dos tablas hay que relacionarlas por el campo Localidad, el lado 1 es la tabla Localidad y el lad muchos la tabla Personas. Si armo un formulario/subformulario usando esa relación tendría en el Principal Localidad con todos sus detalles y en el subformulario Personas. Elijo una Localidad y veo todas las personas de esa localidad.
Entonces lo tuyo no es un subformulario/subformulario, si no un formulario simple con un campo de búsqueda. Entonces la forma de hacer referencia que te expliqué no se aplica.
Ahora para ayudarte necesito más información, decime exactamente
1) Los nombres de los campos que no pasaron a Excel,
2) Los nombres de campos que sí pasan a Excel
3) Qué tipo de error se produce con los que no pasan (mensaje, etc)
4) La Propiedad Origen del Formulario (ficha Datos) decime si es una tabla o consulta
5) Qué hay de diferente entre los campos que sí pasan a Excel y los que no.
6) Finalmente pegá acá el código que estás usando para exportar a Excel
Entonces lo tuyo no es un subformulario/subformulario, si no un formulario simple con un campo de búsqueda. Entonces la forma de hacer referencia que te expliqué no se aplica.
Ahora para ayudarte necesito más información, decime exactamente
1) Los nombres de los campos que no pasaron a Excel,
2) Los nombres de campos que sí pasan a Excel
3) Qué tipo de error se produce con los que no pasan (mensaje, etc)
4) La Propiedad Origen del Formulario (ficha Datos) decime si es una tabla o consulta
5) Qué hay de diferente entre los campos que sí pasan a Excel y los que no.
6) Finalmente pegá acá el código que estás usando para exportar a Excel
1) Nombres de los campos que no pasaron a Excel.
Los nombres de los campos que no pasaron a Excel son los campos que están dentro del subformulario desde la segunda fila, los de la primera fila si los pone.
2) Nombres que si pasan a Excel
Pasan bien a Excel los campos del Formulario.
3)Que tipo de error se produce con los que no pasan.
Ninguno.
4) La Propiedad Origen del Formulario (ficha Datos) decime si es una tabla o consulta
Es una consulta.
5)Qué hay de diferente entre los campos que sí pasan a Excel y los que no
Más que diferente, el problema proviene en que quiero ordenar datos en algunos campos que están por filas en columnas y otros dejarlos tal y como están.
6)Finalmente pegá acá el código que estás usando para exportar a Excel
Como veras son los datos que me enviaste al principio.
Private Sub Comando4_Click()
Dim strLibro As String
' abro una instancia de Excel
Set xls = CreateObject("Excel.Application")
' con ella abro el libro ExportaraExcel
strLibro = CurrentProject.Path & "\TABLAS.xls"
xls.Workbooks.Open (strLibro)
' lo hago visible o no
xls.Visible = True ' o false
' activo la Hoja 2 en mi caso la hoja se llama "Masc 1"
xls.Worksheets("Masc 1").Activate
'Supongo que los campos a grabar son Campo1 y Campo2
'Copio Campo1 a la celda de la fila1 y columna1 (fila1 y columna2 son vaiables que tienen el número de fila y columna respectivamente
xls.ActiveSheet.Cells(1, 1) = Campo1
'Copio Campo2 a la celda C2 (fila=2, columna C)
xls.ActiveSheet.Cells(2, 3) = Campo2
'y así copio dato por dato en la celda que quiero y en la hoja que quiero
xls.ActiveSheet.Cells(2, 1) = Campo3
'y así copio dato por dato en la celda que quiero y en la hoja que quiero
End Sub
Muchas gracias por tu paciencia.
Saludos.
Los nombres de los campos que no pasaron a Excel son los campos que están dentro del subformulario desde la segunda fila, los de la primera fila si los pone.
2) Nombres que si pasan a Excel
Pasan bien a Excel los campos del Formulario.
3)Que tipo de error se produce con los que no pasan.
Ninguno.
4) La Propiedad Origen del Formulario (ficha Datos) decime si es una tabla o consulta
Es una consulta.
5)Qué hay de diferente entre los campos que sí pasan a Excel y los que no
Más que diferente, el problema proviene en que quiero ordenar datos en algunos campos que están por filas en columnas y otros dejarlos tal y como están.
6)Finalmente pegá acá el código que estás usando para exportar a Excel
Como veras son los datos que me enviaste al principio.
Private Sub Comando4_Click()
Dim strLibro As String
' abro una instancia de Excel
Set xls = CreateObject("Excel.Application")
' con ella abro el libro ExportaraExcel
strLibro = CurrentProject.Path & "\TABLAS.xls"
xls.Workbooks.Open (strLibro)
' lo hago visible o no
xls.Visible = True ' o false
' activo la Hoja 2 en mi caso la hoja se llama "Masc 1"
xls.Worksheets("Masc 1").Activate
'Supongo que los campos a grabar son Campo1 y Campo2
'Copio Campo1 a la celda de la fila1 y columna1 (fila1 y columna2 son vaiables que tienen el número de fila y columna respectivamente
xls.ActiveSheet.Cells(1, 1) = Campo1
'Copio Campo2 a la celda C2 (fila=2, columna C)
xls.ActiveSheet.Cells(2, 3) = Campo2
'y así copio dato por dato en la celda que quiero y en la hoja que quiero
xls.ActiveSheet.Cells(2, 1) = Campo3
'y así copio dato por dato en la celda que quiero y en la hoja que quiero
End Sub
Muchas gracias por tu paciencia.
Saludos.
Creo que la lista de preguntas dio su resultado:
Primero: aunque veas muchos registros en el subformulario hay uno solo activo. Estimo que si activaras uno que no sea primero notarías que pasan los datos de ése.
segundo: para pasar todos los registros del subformulario deberías hacerlo por código con un bucle for o Do while
Para hacerlo hay que obtener la sentencia exacta (una expresión SQL) que corresponde al conjunto de registros. Para eso te sugiero lo siguiente:
1) Abrí el formulario en modo diseño
2) Seleccioná el subformulario (clic en la esquina superior izquierda del subformulario, un cuadrado que al estar seleccionado muestra un punto en el centro)
3) Clic en Propiedades, ficha Datos y fíjate la sentencia que aparece, si no ves algo como
Select * from ...... (o parecido) hacé clic en los tres puntos que se ven más a la derecha y te abre la consulta correspondiente, en esa consulta en modo diseño hacé clic en Ver/Vista SQL y copiate esa sentencia que es la que buscamos.
Miro el código y me pregunto tus campos se llaman "Campo1", "¿Campo2" etc? Me parece que lo que pegaste es lo que yo te mandé y no lo que está funcionando en tu aplicación. Entonces te doy las directivas generales.
En el código tendrías que agregar lo siguiente:
Dim rst as New ADODB.Recordset
rst.Open "acá la sentencia SQL", CurrentProject.Connection, adOpenDynamic, adLockPessimistic
if rst.eof or rst.bof then
'no hay registros para el subformulario hay que definir qué se hace
end if
rst.MoveFirst
Do while not rst.eof
'acá copiar los registros del sub a Excel
rst.MoveNext
Loop
Yo tengo mi tiempo cada vez más complicado, seguramente podré ver alguna consulta del Foro la semana que viene. Yo escribí el código de memoria, puede haber algún error. Ese bucle Do ... Loop es el que recorre todos los registros del recordset que conforma tu subformulario, deberás escribir las líneas de código (donde está el comentario) para que pase campo por campo a Excel. Se me ocurre también que deberás hacer un control en excel de la fila que irá avanzando en la medida en que recorrés los registros, deberás agregar lo que corresponda.
Suerte, M
Primero: aunque veas muchos registros en el subformulario hay uno solo activo. Estimo que si activaras uno que no sea primero notarías que pasan los datos de ése.
segundo: para pasar todos los registros del subformulario deberías hacerlo por código con un bucle for o Do while
Para hacerlo hay que obtener la sentencia exacta (una expresión SQL) que corresponde al conjunto de registros. Para eso te sugiero lo siguiente:
1) Abrí el formulario en modo diseño
2) Seleccioná el subformulario (clic en la esquina superior izquierda del subformulario, un cuadrado que al estar seleccionado muestra un punto en el centro)
3) Clic en Propiedades, ficha Datos y fíjate la sentencia que aparece, si no ves algo como
Select * from ...... (o parecido) hacé clic en los tres puntos que se ven más a la derecha y te abre la consulta correspondiente, en esa consulta en modo diseño hacé clic en Ver/Vista SQL y copiate esa sentencia que es la que buscamos.
Miro el código y me pregunto tus campos se llaman "Campo1", "¿Campo2" etc? Me parece que lo que pegaste es lo que yo te mandé y no lo que está funcionando en tu aplicación. Entonces te doy las directivas generales.
En el código tendrías que agregar lo siguiente:
Dim rst as New ADODB.Recordset
rst.Open "acá la sentencia SQL", CurrentProject.Connection, adOpenDynamic, adLockPessimistic
if rst.eof or rst.bof then
'no hay registros para el subformulario hay que definir qué se hace
end if
rst.MoveFirst
Do while not rst.eof
'acá copiar los registros del sub a Excel
rst.MoveNext
Loop
Yo tengo mi tiempo cada vez más complicado, seguramente podré ver alguna consulta del Foro la semana que viene. Yo escribí el código de memoria, puede haber algún error. Ese bucle Do ... Loop es el que recorre todos los registros del recordset que conforma tu subformulario, deberás escribir las líneas de código (donde está el comentario) para que pase campo por campo a Excel. Se me ocurre también que deberás hacer un control en excel de la fila que irá avanzando en la medida en que recorrés los registros, deberás agregar lo que corresponda.
Suerte, M
- Compartir respuesta
- Anónimo
ahora mismo