| |||
guardar archivos cada determinado tiempo Hola de nuevo foreros necesito que me den una idea ya que estoy haciendo un sistema en vba y quiero que en cada determinado tiempo por ejemplo cada 8 hrs. "jale" un archivo que esté guardado en alguna ruta que yo pueda especificarle para poder así guardar una copia de éste en otra ruta esto claro mediante mi sistema y de esta manera tener actualizada esa información otra de mis dudas es si cada vez que guarde el archivo reemplazaria el anterior ??o si se puede hacer una carpeta nueva cada vez que se guarde?. |
| ||||
Respuesta: guardar archivos cada determinado tiempo Lo puedes hacer con un Timer, y sí, con MkDir puedes crear una carpeta nueva por cada archivo copiado.
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
![]() Hola y gracias por sus ideas apenas pude ver sus comentarios asi que empezé por tratar de poner un Timer pero resulta que no lo veo por ninguna parte este control(uso vba access 2003) lo mas parecido que encontré fue un control activex el de Date and Timer Picker Control , o tiene un nombre diferente en vba ??? |
| ||||
![]() No, en VBA de Access no existe el control Timer, solo podrás hacer un Timer con la API, pero para que funcione deberías tener abierto tu archivo Access todo el tiempo, lo cual no sé si es lo mejor.
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
![]() Gracias por tu aclaración David,pues con razón , y referente al API que me comentas encontré : http://www.recursosvisualbasic.com.ar/htm/listado-api/175-timer-con-el-api.htm un código el cual probé y agregé además en el evento Load esto: FileCopy "D:\x.doc", "D:\x (2).doc" y ahí mismo en la parte de milisegundos establecí 3000 por poner un ejemplo el caso es que si se cierra pero antes de eso marca un error '424' se requiere un objeto (modulo --->Form1.Caption = "Valor de x : -->> " & CStr(x)) y después checo y si hace la copia (omití la parte del código donde aparece Cls porque igual marcaba error) tienes alguna idea porqué???Ahh y con lo que comentas de que el archivo debe estar abierto ,te refieres que después de que en mi caso se cumplan las 8hrs guardaría la copia y se cerraría aut. entonces lo tendría que volver a abrir pasan de nuevo las 8 hrs y volvería a hacer la otra copia y así sucesiv. o hay alguna manera de que no se cierre sino simplemente haga las copias en ese tiempo aunque lo tenga que tener abierto ? |
| ||||
![]() No necesitas cerrar para que haga la copia cada 8 hs., puedes hacerlo teniendo abierta todo el tiempo, pero para eso no debes hacer el KillTimer() después de la copia, solo debes volver a iniciar el contador... ¿Podrías poner el código porque así nomás no se me ocurre por qué será el error?
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo Si aquí está ![]() módulo1: Option Compare Database 'Option Explicit 'Declaraciones para implemntar el timer con el Api '************************************************* ********* Función que crea un timer Declare Function SetTimer Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As Long) As Long ' Función que detiene el timer iniciado Declare Function KillTimer Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nIDEvent As Long) As Long ' Función Callback que se dispara al iniciar el timer Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long, ByVal lpTimerFunc As Long) Static x As Long Form1.Value = "Valor de x : -->> " & CStr(x) x = x + 1 End Sub 'Inicia Sub Iniciar_Timer(Hwnd_Form As Long, Intervalo As Long, ID As Long) SetTimer Hwnd_Form, ID, Intervalo, AddressOf TimerProc End Sub 'Detiene Sub Detener_Timer(Hwnd_Form As Long, ID As Long) KillTimer Hwnd_Form, ID End Sub -------------------------------- y en el Form1: load Private Sub Form_Load() Milisegundos = 2000 'Me.AutoRedraw = True 'Me.Print " Valor actual del intervalo: " & _ CStr(Milisegundos) & " Milisegundos" Comando0.Caption = " Iniciar " Comando1.Caption = " Detender " Comando2.Caption = " especificar " FileCopy "D:\x.doc", "D:\x (2).doc" End Sub -------------------------------- y en los botones Option Compare Database Dim Form1 As String Dim Milisegundos As Long Private Sub Comando0_Click() ' Inicia el timer Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) ' Imprime en el form el valor de los milisegundos 'Cls 'Me.Print " Valor actual del intervalo: " & _ CStr(Milisegundos) & " Milisegundos" End Sub Private Sub Comando1_Click() ' Detiene la ejecución del timer que se iniciado Call Detener_Timer(Me.hwnd, 0) End Sub Private Sub Comando2_Click() On Error Resume Next ' Para Especificar los milisegundos Milisegundos = InputBox(" Intervalo ", _ " Indicar los milisegundos para el intervalo ") ' Si se presiona cancelar o no es un número sale If Err.Number = 13 Then MsgBox " el valor ingresado no es un válido", vbCritical Exit Sub End If ' Limpia el controlador de error On Error GoTo 0 ' Cambia el intervalo Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) ' Esto solo muestra el valor de los milisegundos en el form ' Cls 'Me.Print " Valor actual del intervalo: " & _ CStr(Milisegundos) & " Milisegundos" End Sub ---------------------------------- y en el unload Private Sub Form_Unload(Cancel As Integer) ' Mata el timer y finaliza el programa Call Detener_Timer(Me.hwnd, 0) End End Sub **una duda más en la parte de Option Compare Database es este o este Option Explicit como es?? |
| ||||
![]() Option Compare es para definir el tipo de comparación que se usará en el Módulo. Option Explicit es para obligar a declarar todas las variables que serán usadas. Lo que me parece que está mal en tu código es esto: Código PHP: Además, se supone que la copia debería hacerse en el Timer y no en el Form_Load().
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo si tienes razón con lo del form1 , ya se lo quité y es que el error marca en el form1 del módulo: Form1.Value = "Valor de x : -->> " & CStr(x) x = x + 1 ---------- y lo de la copia se supone que es así entonces,en lugar del load?? Private Sub Comando0_Click() Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) FileCopy "D:\x.doc", "D:\x.doc" End Sub |
| ||||
![]() Sí, así debe ser ya que se supone que la copia quieres hacerla cada cierto tiempo. Para hacer referencia a la ventana, intenta poner: Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
![]() Si gracias ,probé con Forms("Form1").Caption = "Ejemplo" y funcionó ,mi duda aqui es en que parte del código le digo que quiero que se realicen las copias por ejemplo cada 7 seg (7000 miliseg) del archivo FileCopy "D:\x.doc", "D:\x (2).doc" ,porque con esto solo hago que se vayan guardando las copias sobre el mismo archivo D:\x (2).doc que se creó y lo que necesito es que del D:\x.doc se haga un archivo nuevo cada vez ,después de los 7 seg es decir una copia independiente del anterior(copia (3),(4) etc.) El tiempo lo puse como lo siguiente pero veo que si hace la copia pero no en el tiempo que especifiqué: Form1: load Private Sub Form_Load() Milisegundos = 7000 |
| ||||
Respuesta: guardar archivos cada determinado tiempo El código para la copia debes colocarlo en el procedimiento del Timer. Para que cree una nueva copia (no reemplace el archivo existente) puedes hacer un bucle que con Dir pruebe si existe el archivo, luego ir sumando valores: x (1), x(2), x(3)... hasta que encuentre uno vacío y copiar en él...
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo Ok muchas gracias David pero podrias decirme como hacer el bucle busque y encontré algo como lo siguiente sería algo asi, es que no entiendo eso de ir sumando valores es decir como lo interpreto dentro del bucle?? Private Sub Comando0_Click() Dim archivo As String archivo = Dir("c:\ejemplo.doc") While archivo <> "" archivo = Dir Wend Inicia el timer Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) End Sub |
| ||||
![]() Bueno, para empezar el bucle debes estar en el procedimiento del Timer y no en el evento Click del botón. El bucle sería algo así como esto: Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo En el procedimiento del timer?? es que en donde hace referencia al timer es en esto que es cuando se inicia por eso creía que ahí: Private Sub Comando0_Click() ' Inicia el timer Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) Dim FileName As String Dim Count As Integer FileName = Dir("C:\ejemplo.doc") Do While FileName <> "" Count = Count + 1 FileName = Dir("C:\ejemplo (" & Count & ").doc") Loop End Sub pero pues no funciona |
| ||||
![]() El procedimiento del Timer es este: Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo Tienes razón,ya habia probado ponerlo ahí pero de igual manera hace la copia pero no agrega las siguientes copias y es que me doy cuenta que se hace la copia con tan solo hacer clic en el primer boton osea en cualquier momento y es que actualmente el código está asi: *módulo1 -------------------------------- Option Compare Database Option Explicit ' Función que crea un timer Declare Function SetTimer Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As Long) As Long ' Función que detiene el timer iniciado Declare Function KillTimer Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nIDEvent As Long) As Long ------------------------------------------------------------- ' Función Callback que se dispara al iniciar el timer Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long, ByVal lpTimerFunc As Long) Static x As Long Forms("Form1").Caption = "Tiempo transcurrido: -->> " & CStr(x) x = x + 1 Dim FileName As String Dim Count As Integer FileName = Dir("c:\ejemplo.doc") Do While FileName <> "" Count = Count + 1 FileName = Dir("c:\ejemplo (" & Count & ").doc") Loop End Sub -------------------------------------------------------- 'Inicia Sub Iniciar_Timer(Hwnd_Form As Long, Intervalo As Long, ID As Long) SetTimer Hwnd_Form, ID, Intervalo, AddressOf TimerProc End Sub ----------------------------------------- 'Detiene Sub Detener_Timer(Hwnd_Form As Long, ID As Long) KillTimer Hwnd_Form, ID End Sub -------------------------------------------- *formulario -------------------------------- Private Sub Form_Load() Milisegundos = 250 Command1.Caption = " Iniciar " Command2.Caption = " Detender " Command3.Caption = " Especificar Intervalo " End Sub ---------------------------------- Private Sub Form_Unload(Cancel As Integer) ' Mata el timer y finaliza el programa Call Detener_Timer(Me.hwnd, 0) End End Sub ---------------------------------- botones -------------------------------------- Private Sub Comando0_Click() ' Inicia el timer Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) On Error Resume Next MkDir "c:\MI_CARPETA" FileCopy "c:\ejemplo.doc", "c:\ejemplo (2).doc" End Sub ---------------------------------------------------- Private Sub Comando1_Click() ' Detiene la ejecución del timer que se iniciado Call Detener_Timer(Me.hwnd, 0) End Sub ------------------------------------------ Private Sub Comando2_Click() On Error Resume Next ' Para Especificar los milisegundos Milisegundos = InputBox(" Intervalo ", _ " Indicar los milisegundos para el intervalo ") ' Si se presiona cancelar o no es un número sale If Err.Number = 13 Then MsgBox " el valor ingresado no es un válido", vbCritical Exit Sub End If ' Limpia el controlador de error On Error GoTo 0 ' Cambia el intervalo Call Iniciar_Timer(Me.hwnd, Milisegundos, 0) End Sub Última edición por forketina; 21/07/2008 a las 14:52 Razón: faltaba código botones |
| ||||
![]() Y es que no estás poniendo el código para copiar ![]() Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo Ah es que esa parte del código la tengo en el botón primero al hacer click cómo te muestro en el código anterior pero voy a checar de esta manera...... ![]() ya probé pero hace lo mismo crea el archivo en cualquier momento y no hace otras copias Última edición por forketina; 21/07/2008 a las 15:04 |
| ||||
![]() El código debe estar allí y no en el botón, y debes usar la variable FileName para copiar el archivo, coloca un MsgBox después de la copia para saber si se está ejecutando.
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo Gracias, mira volví a probar y en la parte del formulario al cargar puse 9000milis ( 9seg) para que en ese tiempo fuera haciendo las copias que era lo que no me salia y ahora si las hace en ese tiempo que le especifiqué ahora el detalle es que me doy cuenta que una vez que creó la copia, la siguiente copia la hace sobre la misma es decir no crea la siguiente copia: "ejemplo2","ejemplo3",etc etc sino solo se va actualizando la misma. ------------------------código formulario Private Sub Form_Load() Milisegundos = 9000 ------------------------módulo1 Sub TimerProc......................... código................... Dim FileName As String Dim Count As Integer FileName = Dir("c:\ejemplo.doc") Do While FileName <> "" Count = Count + 1 FileName = Dir("c:\ejemplo (" & Count & ").doc") Loop FileCopy "c:\ejemplo.doc", "c:\ejemplo (2).doc End Sub Así es como está mi código......o como sería en la parte de FileCopy?? Última edición por forketina; 22/07/2008 a las 09:58 Razón: modifiqué código |
| ||||
![]() El código debería ser: Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| ||||
![]() Ejecuta paso a paso y mira qué valor te está devolviendo en FileName...
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: guardar archivos cada determinado tiempo ok lo checaré, una duda mas quisiera saber cual función podría utilizar ya que me pidieron además que por ejemplo tenga una carpeta llamada "documentos" y en ella 3 archivos "archivo1","archivo2" y "archivo3" y que igual cada detrminado tiempo pero aqui sería que se cortara esa carpeta es decir con todos los archivos dentro y se le diera otra ubicación se puede???? Última edición por forketina; 23/07/2008 a las 05:21 |
| ||||
Respuesta: guardar archivos cada determinado tiempo Puedes usar esto para mover: Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| ||||
![]() Lo del Name As solo funciona cuando quieres moverla a la misma unidad, si quieres moverla a otra unidad puedes hacer FileCopy y luego borrar con Kill y RmDir. Había otra forma por ahí, voy a buscarla y te cuento.
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |