Ejecucion automatica de un procedimiento

26/04/2005 - 10:00 por Rantamplan | Informe spam
Buenas,
quiero que a las 22:00h, diariamente, se guarde el libro abierto con un
nombre específico (con formato dd.mm.yyyy).
Para ello he realizado dos procedimientos:

Public Sub Grabacion_Diaria()
Application.OnTime TimeValue("22:00:00"),"GuardarComo"
End Sub

Public Sub GuardarComo()
dia_actual = Format(Date,"d.mmmm.yyyy")
fichero = "c:\"+dia_actual+".xls"
Application.ActiveWorkok.ActiveSheet.SaveAs Filename:=fichero
End Sub

El problema lo tengo es que no se donde ubicar ese codigo (dentro de una
hoja, ThisWorkBook, un modulo... etc etc) para que se ejecute cuando llegue
la hora indicada.
Por lo que he leido el evento OnTime no está asociado a ningun objeto, se
accede a ellos medianto métodos del objeto Application, pero no acabo de
pillarle el puntillo y no se muy bien donde ubicar el codigo o como
enlazarlo.

Gracias,
Salu2!.



"los videojuegos no tienen ninguna influencia sobre los niños.
Quiero decir, si el Pac-Man hubiese influenciado a nuestra generación,
estaríamos todos corriendo en salas oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989

Preguntas similare

Leer las respuestas

#6 KL
26/04/2005 - 13:17 | Informe spam
Hola Rantamplan,

Claro, es que no me habia fijado en tu codigo principal (crei que ya estaba
testado). Es que intentas usar el metodo SaveAs con el objeto Sheet cuando
deberias hacerlo con el objeto Workbook, algo asi:

ActiveWorkbook.SaveAs Filename:=fichero

Si lo que quieres conseguir es guardar solo la hoja activa, podrias hacer lo
siguiente:

ActiveSheet.Copy
ActiveWorkbook.SaveAs Filename:=fichero

Saludos,
KL

Lo que si me indica es el siguiente fallo cuando llega la hora que le
asigno para que se ejecute:

Se ha producido el error '438' en tiempo de ejecución:
El objeto no admite esta propiedad o método.

Situándose el cursor sobre el procedimiento GuardarComo() y más
concretamente sobre la línea:
Application.ActiveWorkBook.ActiveSheet.SaveAs Filename:=fichero

creo que hace referencia al '.SaveAs' que no lo reconoce.(hasta el punto
del ActiveSheet si me aparece el autocompletado, pero par el SaveAs
nop!).
Respuesta Responder a este mensaje
#7 Rantamplan
26/04/2005 - 13:47 | Informe spam
"KL" Escribió el día mar 26 abr
2005 01:17:46p:

Hola Rantamplan,

Claro, es que no me habia fijado en tu codigo principal (crei que ya
estaba testado). Es que intentas usar el metodo SaveAs con el objeto
Sheet cuando deberias hacerlo con el objeto Workbook, algo asi:

ActiveWorkbook.SaveAs Filename:=fichero

Si lo que quieres conseguir es guardar solo la hoja activa, podrias
hacer lo siguiente:

ActiveSheet.Copy
ActiveWorkbook.SaveAs Filename:=fichero

Saludos,
KL

Lo que si me indica es el siguiente fallo cuando llega la hora que le
asigno para que se ejecute:

Se ha producido el error '438' en tiempo de ejecución:
El objeto no admite esta propiedad o método.

Situándose el cursor sobre el procedimiento GuardarComo() y más
concretamente sobre la línea:
Application.ActiveWorkBook.ActiveSheet.SaveAs Filename:=fichero

creo que hace referencia al '.SaveAs' que no lo reconoce.(hasta el
punto del ActiveSheet si me aparece el autocompletado, pero par el
SaveAs nop!).








Perfecto!
ya me suponía que el objeto Sheet no admtía esa propiedad al no
aparecerme el autocompletar llegados a ese punto. Al cambiar la propiedad
al objeto Workbook funciona perfectamente.
Resumiedo y para quedarme con la idea (por favor corrígeme si me he
equivocado en algún paso) el código general hace esto:

1. Se abre el fichero.
2. ThisWorBook:
Workbook_Open() --> se llama al procedimiento 'IniciarGrabacion'
3. Módulo_Grabación:
IniciarGrabación() --> se llama al procedimiento 'GuardarComo'
GuardarComo() --> Se crea una copia del fichero con el nombre y
la ruta especificada.
4. Hago un pequeño inciso:
La copia del fichero se tiene que realizar todas las noches a las
22h. de forma automática. ¿El evento Workbook_Open se ejcuta sólo una vez
o estará en background y cuando llegue la hora lanzará el resto de
código??
Digamos que el día '0' empezaremos con el fichero plantilla.xls, cuando
llegue las 22h se debe efectuar todo el proceso y se hará una copia de
'plantilla.xls' con el nombre '26.abril.2005.xls', al día siguiente a la
misma hora se creará '27.abril.2005.xls' y así sucesivamente.
Es que me lío con el nombre del evento 'Worbook_open()' que creo que solo
se ejecuta una unica vez, al abrir el archivo, y después o vuelve a
ejecutarse! (soy algo cabezota jeje y no me acaba de entrar en la mollera
:-)

Gracias!.
Salu2.



"los videojuegos no tienen ninguna influencia sobre los niños.
Quiero decir, si el Pac-Man hubiese influenciado a nuestra generación,
estaríamos todos corriendo en salas oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989
Respuesta Responder a este mensaje
#8 KL
26/04/2005 - 14:40 | Informe spam
Hola Rantamplan,

Antes que nada fe de erratas - la ultima version del codigo que te postee no
era correcta, al final te pongo el codigo correcto.

Ahora paso a paso:

2. ThisWorBook:
Workbook_Open() --> se llama al procedimiento 'IniciarGrabacion'



No exactamente, se programa el procedimiento 'IniciarGrabacion' para ser
llamado a la hora preestablecida

3. Módulo_Grabación:
IniciarGrabación() --> se llama al procedimiento 'GuardarComo'
GuardarComo() --> Se crea una copia del fichero con el nombre y
la ruta especificada.



Casi correcto, solo te has olvidado de la tercera accion que ocurre en el
tercer paso: se vuelve a programar el procedimiento 'IniciarGrabacion' para
ser llamado a la hora preestablecida.

La copia del fichero se tiene que realizar todas las noches a las
22h. de forma automática. ¿El evento Workbook_Open se ejcuta sólo una vez
o estará en background y cuando llegue la hora lanzará el resto de
código??



Tienes razon Workbook_Open se ejecuta solo una vez, pero una vez ejecutado
no nos importa, porque habra provocado una "reaccion en cadena". Como ya te
he dicho antes Workbook_Open programara 'IniciarGrabacion' para ser llamado
a las 22:00. Cada vez que se dispare 'IniciarGrabacion' volvera a programar
la proxima ejecucion de si mismo, hasta que ejecutemos el macro
'DetenerGrabacion'

Digamos que el día '0' empezaremos con el fichero plantilla.xls, cuando
llegue las 22h se debe efectuar todo el proceso y se hará una copia de
'plantilla.xls' con el nombre '26.abril.2005.xls', al día siguiente a la
misma hora se creará '27.abril.2005.xls' y así sucesivamente.



Tal como tu dices, a las 22:00 horas de hoy se ejecutara 'IniciarGrabacion'
y por lo consiguiente 'GuardarComo' y se guardara el fichero con el nombre
'26.abril.2005.xls'. Se cerrara automaticamente el fichero anterior (cuyo
OnTime se deshabilitara automaticamente). Al mismo tiempo el recien creado
'26.abril.2005.xls' seguira abierto con la programacion OnTime en curso. Y
asi hasta que cierres el fichero o ejecutes 'DetenerGrabacion'

Y ahora el codigo depurado:

'--Modulo ThisWorkbook
Private Sub Workbook_BeforeClose(Cancel As Boolean)
DetenerGrabacion
End Sub

Private Sub Workbook_Open()
Application.OnTime TimeValue(Hora), _
"IniciarGrabacion"
End Sub
'--Modulo ThisWorkbook

'--Modulo1
Public Const Hora = "22:00:00"

Sub IniciarGrabacion()
GuardarComo
Application.OnTime TimeValue(Hora), _
"IniciarGrabacion"
Saltar = False
End Sub

Sub DetenerGrabacion()
Application.OnTime TimeValue(Hora), _
"IniciarGrabacion", schedule:=False
End Sub

Public Sub GuardarComo()
dia_actual = Format(Date, "d.mmmm.yyyy")
fichero = "c:\" + dia_actual + ".xls"
ThisWorkbook.SaveAs Filename:=fichero
End Sub
'--Modulo1

Un saludo,
KL
Respuesta Responder a este mensaje
#9 Rantamplan
26/04/2005 - 16:04 | Informe spam
"KL" Escribió el día mar 26 abr
2005 02:40:27p:

Hola Rantamplan,

Antes que nada fe de erratas - la ultima version del codigo que te
postee no era correcta, al final te pongo el codigo correcto.

Ahora paso a paso:

2. ThisWorBook:
Workbook_Open() --> se llama al procedimiento 'IniciarGrabacion'



No exactamente, se programa el procedimiento 'IniciarGrabacion' para
ser llamado a la hora preestablecida

3. Módulo_Grabación:
IniciarGrabación() --> se llama al procedimiento 'GuardarComo'
GuardarComo() --> Se crea una copia del fichero con el nombre
y
la ruta especificada.



Casi correcto, solo te has olvidado de la tercera accion que ocurre en
el tercer paso: se vuelve a programar el procedimiento
'IniciarGrabacion' para ser llamado a la hora preestablecida.

La copia del fichero se tiene que realizar todas las noches a las
22h. de forma automática. ¿El evento Workbook_Open se ejcuta sólo una
vez o estará en background y cuando llegue la hora lanzará el resto
de código??



Tienes razon Workbook_Open se ejecuta solo una vez, pero una vez
ejecutado no nos importa, porque habra provocado una "reaccion en
cadena". Como ya te he dicho antes Workbook_Open programara
'IniciarGrabacion' para ser llamado a las 22:00. Cada vez que se
dispare 'IniciarGrabacion' volvera a programar la proxima ejecucion
de si mismo, hasta que ejecutemos el macro 'DetenerGrabacion'

Digamos que el día '0' empezaremos con el fichero plantilla.xls,
cuando llegue las 22h se debe efectuar todo el proceso y se hará una
copia de 'plantilla.xls' con el nombre '26.abril.2005.xls', al día
siguiente a la misma hora se creará '27.abril.2005.xls' y así
sucesivamente.



Tal como tu dices, a las 22:00 horas de hoy se ejecutara
'IniciarGrabacion' y por lo consiguiente 'GuardarComo' y se guardara
el fichero con el nombre '26.abril.2005.xls'. Se cerrara
automaticamente el fichero anterior (cuyo OnTime se deshabilitara
automaticamente). Al mismo tiempo el recien creado '26.abril.2005.xls'
seguira abierto con la programacion OnTime en curso. Y asi hasta que
cierres el fichero o ejecutes 'DetenerGrabacion'

Y ahora el codigo depurado:

'--Modulo ThisWorkbook
Private Sub Workbook_BeforeClose(Cancel As Boolean)
DetenerGrabacion
End Sub

Private Sub Workbook_Open()
Application.OnTime TimeValue(Hora), _
"IniciarGrabacion"
End Sub
'--Modulo ThisWorkbook

'--Modulo1
Public Const Hora = "22:00:00"

Sub IniciarGrabacion()
GuardarComo
Application.OnTime TimeValue(Hora), _
"IniciarGrabacion"
Saltar = False
End Sub

Sub DetenerGrabacion()
Application.OnTime TimeValue(Hora), _
"IniciarGrabacion", schedule:=False
End Sub

Public Sub GuardarComo()
dia_actual = Format(Date, "d.mmmm.yyyy")
fichero = "c:\" + dia_actual + ".xls"
ThisWorkbook.SaveAs Filename:=fichero
End Sub
'--Modulo1

Un saludo,
KL






Ok, ahora ya entiendo perfectamente como funciona el codigo (no me gusta
incluir codigo que no se como funciona ;-)
La duda que tenía era la forma de volver a invocar el procedimiento
IniciarGrabacion, pero despues de tu explicacion se han despejado las
dudas que tenia.
Estoy empezando a descubrir la programacion en Excel y la verdad es que
merece la pena ver todo el potencial que tiene Excel junto con VB, se
pueden hacer autenticas maravillas :-D
A buen seguro que visitare este grupo muy frecuentemente.
Gracias!

Salu2.

"los videojuegos no tienen ninguna influencia sobre los niños.
Quiero decir, si el Pac-Man hubiese influenciado a nuestra generación,
estaríamos todos corriendo en salas oscuras, masticando píldoras
mágicas y escuchando músicas electrónicas repetitivas".
Kristian Wilson, Nintendo Inc., 1989
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida