Anónimo
Actualizar excel automáticamente desde Access
Me gustaría hacerte otra pregunta que me urge un poco y que le pregunté a otro experto pero no me ha contestado todavía.
Necesitaría ayuda para poder actualizar automáticamente varios archivos excel, después de ejecutar unas consultas en Access. Lo perfecto sería poder hacerlo sin abrir los archivos excel y que se modificaran los nombres de los archivos para saber si se han actualizado o no.
Necesitaría ayuda para poder actualizar automáticamente varios archivos excel, después de ejecutar unas consultas en Access. Lo perfecto sería poder hacerlo sin abrir los archivos excel y que se modificaran los nombres de los archivos para saber si se han actualizado o no.
1 respuesta
Respuesta de Neckkito Nck
1
1
Paso a contestar tu pregunta basándome en los siguientes supuestos:
- Lo que quieres exportar es una consulta
- El dato que te va a dar la actualización es la fecha del sistema.
- El código está asociado a un botón de comando, de manera que cuando hagas click sobre él te ejecute el proceso.
Te pongo el código utilizando muchas variables, lo cual no es estrictamente necesario. Pero así, además de que podrás manipular más claramente las "partes", te podré ir explicando qué hace cada cosa. Te marco en negrita las cosas que tienes que cambiar, y tras el código las equivalencias.
El proceso es el siguiente:
1.- Creas un botón de comando y le asignas el siguiente código
---
Private Sub Comando0_Click()
Dim vPath As String
Dim vNombre As String
Dim vVersion As String
Dim vArchivo As String
vPath = "c:\"
vNombre = "Libro_"
vVersion = CStr(Format(Date, "ddmmyy"))
'Construimos el nombre del archivo
vArchivo = vPath & vNombre & vVersion & ".xlsx"
'Lo sacamos a Excel con las siguientes características:
'Origen, una consulta; Libro de Excel xlsx; sin autoinicio;
'sin plantilla y calidad de salida "Imprimir"
DoCmd.OutputTo acOutputQuery, "Consulta1", "ExcelWorkbook(*.xlsx)", _
vArchivo, False, "", 0, acExportQualityPrint
MsgBox "Archivos actualizados correctamente", vbInformation, "OK"
End Sub
---
Variable vPath-> Tienes que poner la ruta de las carpetas, y debe acabar siempre en contrabarra. Por ejemplo, c:\MisExcel\ExcelActualizados\
Variable vNombre-> Tienes que poner el nombre que quieres para el Excel, seguido de un subguión para hacer más legible el nombre del archivo.
Variable VArchivo-> Podrás ver cómo construimos el nombre completo del archivo, junto con su ruta.
Consulta1-> Debes poner el nombre de tu consulta
Y eso es todo. Si tienes cualquier duda me la comentas.
Ya me dirás qué tal te ha ido.
- Lo que quieres exportar es una consulta
- El dato que te va a dar la actualización es la fecha del sistema.
- El código está asociado a un botón de comando, de manera que cuando hagas click sobre él te ejecute el proceso.
Te pongo el código utilizando muchas variables, lo cual no es estrictamente necesario. Pero así, además de que podrás manipular más claramente las "partes", te podré ir explicando qué hace cada cosa. Te marco en negrita las cosas que tienes que cambiar, y tras el código las equivalencias.
El proceso es el siguiente:
1.- Creas un botón de comando y le asignas el siguiente código
---
Private Sub Comando0_Click()
Dim vPath As String
Dim vNombre As String
Dim vVersion As String
Dim vArchivo As String
vPath = "c:\"
vNombre = "Libro_"
vVersion = CStr(Format(Date, "ddmmyy"))
'Construimos el nombre del archivo
vArchivo = vPath & vNombre & vVersion & ".xlsx"
'Lo sacamos a Excel con las siguientes características:
'Origen, una consulta; Libro de Excel xlsx; sin autoinicio;
'sin plantilla y calidad de salida "Imprimir"
DoCmd.OutputTo acOutputQuery, "Consulta1", "ExcelWorkbook(*.xlsx)", _
vArchivo, False, "", 0, acExportQualityPrint
MsgBox "Archivos actualizados correctamente", vbInformation, "OK"
End Sub
---
Variable vPath-> Tienes que poner la ruta de las carpetas, y debe acabar siempre en contrabarra. Por ejemplo, c:\MisExcel\ExcelActualizados\
Variable vNombre-> Tienes que poner el nombre que quieres para el Excel, seguido de un subguión para hacer más legible el nombre del archivo.
Variable VArchivo-> Podrás ver cómo construimos el nombre completo del archivo, junto con su ruta.
Consulta1-> Debes poner el nombre de tu consulta
Y eso es todo. Si tienes cualquier duda me la comentas.
Ya me dirás qué tal te ha ido.
Hola!, me gustaría hacerte otra pregunta que me urge un poco y que le pregunté a otro experto pero no me ha contestado todavía.
Necesitaría ayuda para poder actualizar automáticamente varios archivos excel, después de ejecutar unas consultas en Access. Lo perfecto sería poder hacerlo sin abrir los archivos excel y que se modificaran los nombres de los archivos para saber si se han actualizado o no.
Muchas gracias!
Necesitaría ayuda para poder actualizar automáticamente varios archivos excel, después de ejecutar unas consultas en Access. Lo perfecto sería poder hacerlo sin abrir los archivos excel y que se modificaran los nombres de los archivos para saber si se han actualizado o no.
Muchas gracias!
Muchas gracias por la ayuda pero hay un supuesto que no se cumple:
Los archivos excel (tengo 7 archivos) que quiero actualizar tienen 6 hojas cada uno y cada hoja depende de una consulta o tabla de access.
¿No existe la opción de hacer un "Actualizar Todo" en el archivo Excel sin la necesidad de abrirlo?
Te detallo los pasos que doy yo haciéndolo manualmente:
1)Cargo diariamente toda la información en Access y ejecuto las consultas.
2)Voy a la carpeta C:\cobra\incidencias y entro en los 6 archivos.
3)Al abrir cada archivo le doy a "Actualizar Todo" y guardo el archivo como p.e.: 2011_06_03_Incidencias gestión
Espero haber aclarado más mi caso.
Muchas gracias por el interés!
Los archivos excel (tengo 7 archivos) que quiero actualizar tienen 6 hojas cada uno y cada hoja depende de una consulta o tabla de access.
¿No existe la opción de hacer un "Actualizar Todo" en el archivo Excel sin la necesidad de abrirlo?
Te detallo los pasos que doy yo haciéndolo manualmente:
1)Cargo diariamente toda la información en Access y ejecuto las consultas.
2)Voy a la carpeta C:\cobra\incidencias y entro en los 6 archivos.
3)Al abrir cada archivo le doy a "Actualizar Todo" y guardo el archivo como p.e.: 2011_06_03_Incidencias gestión
Espero haber aclarado más mi caso.
Muchas gracias por el interés!
¿Me podrías, por favor, indicar cómo tienes linkada la información entre las hojas del Excel y la BD? Quiero decir, si lo sabes, ¿qué sistema utilizas?
Ya me dirás.
Ya me dirás.
Hola!
Yo para "linkear" un excel con una tabla o consulta de Access, en el excel le doy a Datos - Desde Access - Selecciono la tabla/consulta y aceptar.
No se si esto era lo que querías que te aclarase.
Muchas gracias!
Yo para "linkear" un excel con una tabla o consulta de Access, en el excel le doy a Datos - Desde Access - Selecciono la tabla/consulta y aceptar.
No se si esto era lo que querías que te aclarase.
Muchas gracias!
Lamento comentarte que, hasta donde yo sé, con el sistema que utilizas, no se puede hacer desde Access.
No te he contestado antes porque he estado haciendo pruebas y buscando información por Internet, pero no he podido lograr hacer que funcionara en el primer caso, ni encontrar "algo" útil en el segundo.
El problema que me encuentro es que cuando llamo a Excel desde la BD me lo abre sin problema, pero cuando intenta refrescar los datos la hoja de cálculo se encuentra con que la BD de origen está abierta, y es cuando me salta el error de que un usuario tiene abierta la base de datos y bloquea el acceso a los datos, y que las hojas se actualizarán en cuanto cierre la BD. Y claro, si cierro la BD no se ejecuta la parte del código que haría que el Excel se guardase con otro nombre.
Puedo darte una solución alternativa, pero pasa también por abrir todos los Excel manualmente. El proceso para crearlo sería un "poco trabajoso", pero una vez creado ya estaría. Funcionaría así:
- Abres el Excel "madre"
- Te pide si quieres actualizar datos. Si le dices que no pues te deja el Excel abierto para poder trabajar. Si le dices que sí te actualiza los datos, cambia el nombre del archivo (le añade la fecha del sistema para saber cuándo se actualizó) y te lo cierra.
Lamento no poder darte una respuesta que satisfaga exactamente tus necesidades. Si te interesa el procedimiento alternativo que te he indicado me lo dices y te lo explico. Si no... :(
Ya me dirás.
Un saludo,
---
Neckkito
http://neckkito.eu5.org
No te he contestado antes porque he estado haciendo pruebas y buscando información por Internet, pero no he podido lograr hacer que funcionara en el primer caso, ni encontrar "algo" útil en el segundo.
El problema que me encuentro es que cuando llamo a Excel desde la BD me lo abre sin problema, pero cuando intenta refrescar los datos la hoja de cálculo se encuentra con que la BD de origen está abierta, y es cuando me salta el error de que un usuario tiene abierta la base de datos y bloquea el acceso a los datos, y que las hojas se actualizarán en cuanto cierre la BD. Y claro, si cierro la BD no se ejecuta la parte del código que haría que el Excel se guardase con otro nombre.
Puedo darte una solución alternativa, pero pasa también por abrir todos los Excel manualmente. El proceso para crearlo sería un "poco trabajoso", pero una vez creado ya estaría. Funcionaría así:
- Abres el Excel "madre"
- Te pide si quieres actualizar datos. Si le dices que no pues te deja el Excel abierto para poder trabajar. Si le dices que sí te actualiza los datos, cambia el nombre del archivo (le añade la fecha del sistema para saber cuándo se actualizó) y te lo cierra.
Lamento no poder darte una respuesta que satisfaga exactamente tus necesidades. Si te interesa el procedimiento alternativo que te he indicado me lo dices y te lo explico. Si no... :(
Ya me dirás.
Un saludo,
---
Neckkito
http://neckkito.eu5.org
Hola!
Por ahora puede que me sea útil, si me puedes ayudar a hacer el proceso como tú idces te lo agradecería.
Muchas gracias!
Por ahora puede que me sea útil, si me puedes ayudar a hacer el proceso como tú idces te lo agradecería.
Muchas gracias!
OK. Te explico dos maneras de hacerlo para que puedas elegir la que más te convezca. A modo de resumen la idea es la siguiente:
Forma 1: abres el Excel madre, te pide si quieres actualizar la información: si le das al botón "sí" te actualiza, cambia el nombre, guarda y cierra. Si le das "no" pues te deja el Excel abierto con la información que haya para poder trabajar.
Forma 2: abres el Excel madre, pero no te pide nada. Tu habrás creado una combinación de teclas para realizar el proceso. Si pulsas tu combinación de teclas el funcionamiento es como el "sí" de la forma 1.
Vamos allá:
PROCEDIMIENTO COMÚN
1.- Abres el Excel que vayas a utilizar como "madre". Lo "guardas como" y seleccionas el tipo de archivo "libro de Excel habilitado para macros (*.xlsm)". Evidentemente le pones el nombre que quieras.
2.- Con el Excel con este nuevo tipo abierto presionas las teclas ALT+F11. Se te abrirá el VBE
FORMA 1
1.- En el VBE verás que tienes, a la izquierda, las hojas que componen el libro. El último elemento te pone ThisWorkbook
2.- Haces doble click sobre ese elemento ThisWorkbook
3.- Arriba, en el "centro-izquierda", te aparece un combo que pone (General). Lo despliegas y seleccionas ThisWorkbook. Verás que ahora te aparece una línea en el propio editor de código que pone "Private Sub Workbook_Open(), y la línea End Sub
4.- En medio de estas líneas le escribes el siguiente código:
---
Private Sub Workbook_Open()
Dim resp As Integer
resp = MsgBox("¿Actualizar y guardar?", vbQuestion + vbYesNo, "CONFIRMACIÓN")
If resp = vbNo Then Exit Sub
Dim vFecha As Variant
Dim nuevoNombre As String
Dim i As Integer
Dim nomSinExtension, nomActual As String
vFecha = Date
vFecha = Format(CStr(vFecha), "ddmmyy")
nomActual = Application.ActiveWorkbook.Name
i = Len(nomActual) - 5
nomSinExtension = Left(nomActual, i)
Application.ActiveWorkbook.RefreshAll
nuevoNombre = Application.ActiveWorkbook.Path & "\" & _
nomSinExtension & "_" & vFecha
Application.DisplayAlerts = False
Application.ActiveWorkbook.SaveAs nuevoNombre, xlExcel8
Application.DisplayAlerts = True
Application.Quit
End Sub
---
5.- Guardas los cambios y haces la prueba, a ver si te funciona correctamente.
FORMA 2
1.- En el editor de VBE te vas al menú Insertar y le dices que quieres insertar módulo.
2.- Te creará el Módulo1. Ahí pones el siguiente código:
---
Public Sub subActualiza()
Dim vFecha As Variant
Dim nuevoNombre As String
Dim i As Integer
Dim nomSinExtension, nomActual As String
vFecha = Date
vFecha = Format(CStr(vFecha), "ddmmyy")
nomActual = Application.ActiveWorkbook.Name
i = Len(nomActual) - 5
nomSinExtension = Left(nomActual, i)
Application.ActiveWorkbook.RefreshAll
nuevoNombre = Application.ActiveWorkbook.Path & "\" & _
nomSinExtension & "_" & vFecha
Application.DisplayAlerts = False
Application.ActiveWorkbook.SaveAs nuevoNombre, xlExcel8
Application.DisplayAlerts = True
Application.Quit
End Sub
---
3.- Ahora haces doble click sobre ThisWorkbook. En el combo donde pone (General) seleccionas Workbook y te aparecerá eso de Private Sub Workbook_Open()...End Sub
4.- Entre esas dos líneas escribes la siguiente línea de código
---
Private Sub Workbook_Open()
subActualiza
End Sub
---
5.- Ese módulo, cuando te lo pida, puedes guardarlo con el nombre por defecto.
6.- Vuelves al Excel y te vas a la cinta de opciones de Programador. Si no la tienes (Access 2007) tienes que irte al botón de inicio de Office->Opciones de Excel->Más Frecuentes-> Y marcar el check que pone "Mostrar ficha Programador en la cinta de opciones. Para Access 2010 tienes que irte a Archivo->Opciones de Excel->Personalizar cinta de opciones-> Y en el cuadro de más a la derecha marcas el check "Programador"
7.- En esa cinta de opciones el segundo botón pone Macros. Haces click sobre él
8.- Ahí te aparece una macro llamada "subActualiza". Le das al botón "Opciones..."
9.- En la nueva pantalla le puedes poner la tecla de método abreviado (ojo, que hay combinaciones reservadas, como CTRL+C, CTRL+V, etc.). También puedes elegir la "letra" pulsando la tecla mayúsculas, con lo que la combinación será CTRL+Mayusc+Letra.
Guardas el archivo. Ahora, cuando abras el Excel, no hará nada hasta que no pulses la combinación de teclas que hayas elegido.
Ya me dirás qué tal te ha ido.
Forma 1: abres el Excel madre, te pide si quieres actualizar la información: si le das al botón "sí" te actualiza, cambia el nombre, guarda y cierra. Si le das "no" pues te deja el Excel abierto con la información que haya para poder trabajar.
Forma 2: abres el Excel madre, pero no te pide nada. Tu habrás creado una combinación de teclas para realizar el proceso. Si pulsas tu combinación de teclas el funcionamiento es como el "sí" de la forma 1.
Vamos allá:
PROCEDIMIENTO COMÚN
1.- Abres el Excel que vayas a utilizar como "madre". Lo "guardas como" y seleccionas el tipo de archivo "libro de Excel habilitado para macros (*.xlsm)". Evidentemente le pones el nombre que quieras.
2.- Con el Excel con este nuevo tipo abierto presionas las teclas ALT+F11. Se te abrirá el VBE
FORMA 1
1.- En el VBE verás que tienes, a la izquierda, las hojas que componen el libro. El último elemento te pone ThisWorkbook
2.- Haces doble click sobre ese elemento ThisWorkbook
3.- Arriba, en el "centro-izquierda", te aparece un combo que pone (General). Lo despliegas y seleccionas ThisWorkbook. Verás que ahora te aparece una línea en el propio editor de código que pone "Private Sub Workbook_Open(), y la línea End Sub
4.- En medio de estas líneas le escribes el siguiente código:
---
Private Sub Workbook_Open()
Dim resp As Integer
resp = MsgBox("¿Actualizar y guardar?", vbQuestion + vbYesNo, "CONFIRMACIÓN")
If resp = vbNo Then Exit Sub
Dim vFecha As Variant
Dim nuevoNombre As String
Dim i As Integer
Dim nomSinExtension, nomActual As String
vFecha = Date
vFecha = Format(CStr(vFecha), "ddmmyy")
nomActual = Application.ActiveWorkbook.Name
i = Len(nomActual) - 5
nomSinExtension = Left(nomActual, i)
Application.ActiveWorkbook.RefreshAll
nuevoNombre = Application.ActiveWorkbook.Path & "\" & _
nomSinExtension & "_" & vFecha
Application.DisplayAlerts = False
Application.ActiveWorkbook.SaveAs nuevoNombre, xlExcel8
Application.DisplayAlerts = True
Application.Quit
End Sub
---
5.- Guardas los cambios y haces la prueba, a ver si te funciona correctamente.
FORMA 2
1.- En el editor de VBE te vas al menú Insertar y le dices que quieres insertar módulo.
2.- Te creará el Módulo1. Ahí pones el siguiente código:
---
Public Sub subActualiza()
Dim vFecha As Variant
Dim nuevoNombre As String
Dim i As Integer
Dim nomSinExtension, nomActual As String
vFecha = Date
vFecha = Format(CStr(vFecha), "ddmmyy")
nomActual = Application.ActiveWorkbook.Name
i = Len(nomActual) - 5
nomSinExtension = Left(nomActual, i)
Application.ActiveWorkbook.RefreshAll
nuevoNombre = Application.ActiveWorkbook.Path & "\" & _
nomSinExtension & "_" & vFecha
Application.DisplayAlerts = False
Application.ActiveWorkbook.SaveAs nuevoNombre, xlExcel8
Application.DisplayAlerts = True
Application.Quit
End Sub
---
3.- Ahora haces doble click sobre ThisWorkbook. En el combo donde pone (General) seleccionas Workbook y te aparecerá eso de Private Sub Workbook_Open()...End Sub
4.- Entre esas dos líneas escribes la siguiente línea de código
---
Private Sub Workbook_Open()
subActualiza
End Sub
---
5.- Ese módulo, cuando te lo pida, puedes guardarlo con el nombre por defecto.
6.- Vuelves al Excel y te vas a la cinta de opciones de Programador. Si no la tienes (Access 2007) tienes que irte al botón de inicio de Office->Opciones de Excel->Más Frecuentes-> Y marcar el check que pone "Mostrar ficha Programador en la cinta de opciones. Para Access 2010 tienes que irte a Archivo->Opciones de Excel->Personalizar cinta de opciones-> Y en el cuadro de más a la derecha marcas el check "Programador"
7.- En esa cinta de opciones el segundo botón pone Macros. Haces click sobre él
8.- Ahí te aparece una macro llamada "subActualiza". Le das al botón "Opciones..."
9.- En la nueva pantalla le puedes poner la tecla de método abreviado (ojo, que hay combinaciones reservadas, como CTRL+C, CTRL+V, etc.). También puedes elegir la "letra" pulsando la tecla mayúsculas, con lo que la combinación será CTRL+Mayusc+Letra.
Guardas el archivo. Ahora, cuando abras el Excel, no hará nada hasta que no pulses la combinación de teclas que hayas elegido.
Ya me dirás qué tal te ha ido.
Hola! Muchas gracias por la respuesta!
Necesito solo una pequeña aclaración más:
En la opción 1 que me has mandado, ¿cómo hago para guardar el archivo en una carpeta que yo le indique? (p.e. C:\Cobra)
Muchas gracias!
Necesito solo una pequeña aclaración más:
En la opción 1 que me has mandado, ¿cómo hago para guardar el archivo en una carpeta que yo le indique? (p.e. C:\Cobra)
Muchas gracias!
Vaya, vaya... veo que esta es la "consulta" de las opciones... je, je...
Digo lo de las opciones porque tienes dos. Te comento las dos, pero te explico la fácil. Si quieres la "difícil" me lo dices, porque requiere un poco más de trabajo.
Opción1: Indicar directamente, en el código, la ruta del archivo.
Opción2: Que se te abra un cuadro de diálogo y te permita seleccionar la carpeta donde guardar el archivo.
Vamos a por la opción1
Simplemente tienes que cambiar ligeramente el código que tienes por este otro. Te marco en negrita los cambios:
---
Private Sub Workbook_Open()
Dim resp As Integer
resp = MsgBox("¿Actualizar y guardar?", vbQuestion + vbYesNo, "CONFIRMACIÓN")
If resp = vbNo Then Exit Sub
Dim vFecha As Variant
Dim nuevoNombre As String
Dim i As Integer
Dim nomSinExtension, nomActual As String
Dim miRuta As String
miRuta= "c:\Cobra"
vFecha = Date
vFecha = Format(CStr(vFecha), "ddmmyy")
nomActual = Application.ActiveWorkbook.Name
i = Len(nomActual) - 5
nomSinExtension = Left(nomActual, i)
Application.ActiveWorkbook.RefreshAll
nuevoNombre = miRuta & "\" & _
nomSinExtension & "_" & vFecha
Application.DisplayAlerts = False
Application.ActiveWorkbook.SaveAs nuevoNombre, xlExcel8
Application.DisplayAlerts = True
Application.Quit
End Sub
---
Evidentemente, en la variable miRuta tienes que escribir la ruta que quieras. ¡Ojo! La carpeta destino debe estar creada, porque si no te saltará un error.
Bueno. Ya me dirás cosas.
Digo lo de las opciones porque tienes dos. Te comento las dos, pero te explico la fácil. Si quieres la "difícil" me lo dices, porque requiere un poco más de trabajo.
Opción1: Indicar directamente, en el código, la ruta del archivo.
Opción2: Que se te abra un cuadro de diálogo y te permita seleccionar la carpeta donde guardar el archivo.
Vamos a por la opción1
Simplemente tienes que cambiar ligeramente el código que tienes por este otro. Te marco en negrita los cambios:
---
Private Sub Workbook_Open()
Dim resp As Integer
resp = MsgBox("¿Actualizar y guardar?", vbQuestion + vbYesNo, "CONFIRMACIÓN")
If resp = vbNo Then Exit Sub
Dim vFecha As Variant
Dim nuevoNombre As String
Dim i As Integer
Dim nomSinExtension, nomActual As String
Dim miRuta As String
miRuta= "c:\Cobra"
vFecha = Date
vFecha = Format(CStr(vFecha), "ddmmyy")
nomActual = Application.ActiveWorkbook.Name
i = Len(nomActual) - 5
nomSinExtension = Left(nomActual, i)
Application.ActiveWorkbook.RefreshAll
nuevoNombre = miRuta & "\" & _
nomSinExtension & "_" & vFecha
Application.DisplayAlerts = False
Application.ActiveWorkbook.SaveAs nuevoNombre, xlExcel8
Application.DisplayAlerts = True
Application.Quit
End Sub
---
Evidentemente, en la variable miRuta tienes que escribir la ruta que quieras. ¡Ojo! La carpeta destino debe estar creada, porque si no te saltará un error.
Bueno. Ya me dirás cosas.
- Compartir respuesta
- Anónimo
ahora mismo