Tengo un problemita tengo unos datos en la hoja1 en el libro1 datos como tipo seri colo etc quiero que estos datos me los copie a otro libro cuando yo ponga la palabra libre en alguna celda pero me los elimine del libro uno y si en 36 horas el estatus no cambia ha apartado me los vuelva a regresar a libro1 espero me haya dado a entender ójala me puedas ayudar ya que me urge un poquito saludos y gracias de antemano
1 respuesta
Respuesta de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
Hubiese sido de mucha ayuda (obviamente, para ti) que hubieras dado datos específicos de, por ejemplo, en qué rango están los datos a llevar al otro libro, si están dispuestos en un rango continuo o discontinuo, en qué celda estará la palabra "Libre" o "Apartado", cómo se llama el libro a donde van los datos, etc. Dado tu apuro, no voy a esperar que me des esa información sino que la asumiré yo. Luego tendrás que reemplazar los rangos por los tuyos propios. Así, los datos que consideré para tu ejemplo serán: Hoja de datos de origen = "Hoja1" Rango donde se encuentran los datos a transferir "C14:C21" Celda donde está la palabra clave ("Libre" o "Apartado") = "F1" Archivo de Destino = "C:\Mis Documentos\xdead\Provisorio.XLS" Hoja donde se copia los datos = "HojaProv" En la Celda "B8" Asumiendo que tu archivo estará constantemente abierto (para poder controlar las 36 horas transcurridas): Celda con la hora de la transferencia de datos = "Z1" Como podrás ir notando, no es un procedimiento sencillo el que planteaste... Para que funcione, activa el editor de Visual Basic (presiona Alt+F11) y busca la hoja donde estará aquella palabra clave. Da doble click sobre ella. Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic: Private Sub Worksheet_Change(ByVal Target As Excel.Range) '=== Modifica aquí si es distinto a lo tuyo: CeldaClave = "F1" If UCase(Trim(Range(CeldaClave).Value)) = "LIBRE" Then SacaDatos End Sub Esto hará que, cuando algo cambie en esta hoja, controle si la celda indicada contiene la palabra "Libre". EN tal caso disparará la macro (SacaDato) que copia los datos al archivo externo. Inserta, entonces, un nuevo módulo ("Insertar", "Módulo") y pega los siguientes códigos: Sub SacaDatos() ' Se dispara a pedido o automáticamente si la celda F1 dice "Libre" '=== Modifica aquí si es distinto a lo tuyo: HojaOrig = "Hoja1" RangoOrig = "C14:C21" 'Rango donde se encuentran los datos a transferir CeldaHora = "Z1" ArchivoDestino = "C:\Mis Documentos\xdead\Provisorio.XLS" 'Se supone cerrado al momento de dispararse la macro HojaDest = "HojaProv" CeldaDest = "B8" 'CELDA a partir de la cual se pegarán los datos tomados del archivo original Application.ScreenUpdating = True Workbooks.Open FileName:=ArchivoDestino ActiveWindow.ActivatePrevious Sheets(HojaOrig).Activate Range(RangoOrig).Copy ActiveWindow.ActivateNext Sheets(HojaDest).Select With Range(CeldaDest) .PasteSpecial Paste:=xlValues .PasteSpecial Paste:=xlFormats End With Application.DisplayAlerts = False With ActiveWorkbook .Save .Close False End With Application.DisplayAlerts = True Range(RangoOrig).ClearContents Application.CutCopyMode = False Range(CeldaHora).Value = Now Application.OnTime Now + TimeValue("00:45:00"), "ControlTiempo" Application.ScreenUpdating = True End Sub Sub TraeDatos() ' Se dispara a pedido o automáticamente si la celda F1 no dice "Apartado" y transcurrieron más de 36 hs '=== Modifica aquí si es distinto a lo tuyo: HojaOrig = "Hoja1" RangoOrig = "C14" 'Rango donde pegará los datos transferidos CeldaHora = "Z1" ArchivoDestino = "C:\Mis Documentos\xdead\Provisorio.XLS" 'Se supone cerrado al momento de dispararse la macro HojaDest = "HojaProv" CeldaDest = "B8:B15" 'RANGO que traerá al libro original Application.ScreenUpdating = True Workbooks.Open FileName:=ArchivoDestino ' ActiveWindow.ActivatePrevious Sheets(HojaDest).Activate Range(CeldaDest).Copy ActiveWindow.ActivatePrevious Sheets(HojaOrig).Select With Range(RangoOrig) .PasteSpecial Paste:=xlValues .PasteSpecial Paste:=xlFormats End With Application.DisplayAlerts = False ActiveWindow.ActivateNext With ActiveWorkbook .Close False End With Application.DisplayAlerts = True Application.CutCopyMode = False Range(CeldaHora).ClearContents End Sub Private Sub ControlTiempo() '=== Modifica aquí si es distinto a lo tuyo: CeldaHora = "Z1" CeldaClave = "F1" If Range(CeldaHora).Value <> 0 Then TiempoTrans = 24 * (Now - Range(CeldaHora).Value) If TiempoTrans > 36 And UCase(Trim(Range(CeldaClave).Value)) <> "APARTADO" Then TraeDatos Application.OnTime Now + TimeValue("00:45:00"), "ControlTiempo" End If End Sub '---- hasta la linea superior (End Sub) Verás que hay tres macros aquí. - SacaDatos (lleva los datos del rango indicado al archivo externo y los borra de éste) - TraeDatos (Ejecuta el proceso inverso) - ControlTiempo (Controla el tiempo transcurrido si supera las 36 horas y encuentra la la palabra "Apartado", dispara la macro TraeDatos que restituye los valores del archivo externo. Finalmente, para lograr que el control de tiempo esté activo al abrir el libro, busca la hoja que dice "ThisWorkbook" (o "EsteLibro" según la versión") y pega este código: Private Sub Workbook_Open() Application.OnTime Now + TimeValue("00:45:00"), "ControlTiempo" End Sub Como verás este control se disparará 45 minutos despues de iniciado. <descanso> Que conste que fuiste tu quien pidió esto. Con la (poca) información que diste creo que te será útil. Espero que esto ayude a resolver tu problema. Si así fuera, agradeceré un comentario y que la finalices. (Recuerda que mantener cierto número de respuestas pendientes impide que otros usuarios puedan consultarme) aclarando qué entendí mal o qué faltó.
El libro de donde salen los datos se llama febrero y a donde van asesor los datos empiezan desde A3 a k3 y son uno tras otro la palabra libre va a ir al final de cada fila para indicar si ese articulo esta libre o no y así ver si se puede pasar a el libro asesor espero me haya explicado bien si no dame tu mail y te mando un ejemplo muchas gracias por todo
Insisto, me he tomado el trabajo de desarrollar esta macro dotándola de variables donde deberás colocar los datos de tu estructura. Vamos, es la parte más simple. Donde veas: RangoOrig = "C14:C21" 'Rango donde se encuentran los datos a transferir Coloca RangoOrig = "A3:K3" Tampoco esta vez dijiste dónde está el archivo y cómo se llama el libro "asesor", sólo diste el nombre del archivo de origen que -a los efectos de la macro- no es útil. Pero creo que serás capaz de completar ese dato. Algo así como: ArchivoDestino = "C:\Mis Documentos\xdead\ASESOR.XLS Y así con los otros rangos indicados en las variables. Asumo que tendrás un manejo mínimo de VBA como para darte cuenta cuales son las variables (además coloqué mensajes dentro del código). Lo que no puedo hacer, por falta de tiempo, es diseñarte un programa a medida, particularmente por lo escasa que es la información que das. Y, créeme, no es mala voluntad de mi parte.