Macro que busque y modifique valores
La situación normal es que las finales de un día sean las iniciales del día siguiente, pero al realizar un cambio de equipo, el valor ya no será el mismo. El problemas es cómo programar una macro que busque en un rango el número del equipo cambiado y modifique su valor inicial del día siguiente de manera automática. Ojalá me haya explicado bien. Adjunto libro
1 respuesta
Podrías poner varios ejemplos con datos reales y también en qué celdas pones las fechas, los equipos, etc.
Puedes enviarme el archivo a mi correo.
O bien puedes subir imagen de la pantalla de excel a
subeimagenes.com
Saludos. Dam
En la celda I5 tienes la fórmula
=E5
Cámbiala por esta:
=SI(ESERROR(BUSCARV(H5,$H$12:$J$16,3,0)),E5,(BUSCARV(H5,$H$12:$J$16,3,0)))
Y copia esta fórmula en todas tus celdas Inicial
Saludos. DaM
Gracias, pero no entiendo la sintaxis. Hice lo que me dices, pero no me da resultado? No será mejor con una macro? Aunque si así funciona esta bien, pero necesito entender para adaptarla a lo que quiero.
Coloqué un cambio en el equipo 1 y los valores de todos los equipos cambiaron, cuando la idea era que cambiara sólo la inicial del 1. Pero lo hice con el 4 y lo cambio bien. Por eso te pregunto la lógica que usaste.
Gracias de nuevo.
Perdona, me equivoqué de fórmula, en la celda I5 pon la siguiente :
=SI(ESERROR(BUSCARV(H5,C$12:E$16,3,0)),E5,(BUSCARV(H5,C$12:E$16,3,0)))
Después de ponerla en I5, copiala en todas tus celdas "Inicial".
Lo que hace la fórmla es:
Primero te explico que la siguiente función
La función ESERROR regresa VERDADERO si existe error, es decir, si te regresa un valor #N/A o #NOMBRE, etc.
Entonces la fórmula hace:
Busca H5 (equipo), en C12 a E16 (Cambio de equipo) del día anterior, si no encuentra el equipo, excel envía un error, por eso le antepuse la pregunta "ESERROR", entonces si no lo encuentra, que ponga el valor de la celda E5. Si no es error, entonces le pido que haga nuevamente la búsqueda, ya que la primera búsqueda sirvió para comprobar si era Error, hace la búsqueda y le pido que me regrese el valor de la 3ra columna, para eso es el número 3 que ves en la fórmula, es decir, le pido que me traiga el valor de la columna final.
Espero que me haya podido explicar.
Aplica la nueva fórmula que te estoy enviando para que la entiendas.
Para la macro, necesito que me envíes tu archivo completo, porque supongo que tienes más de 4 equipos, entonces, ni la fórmula ni la macro funcionarían, por ejemplo, para el equipo 5 ó 6 ó 7, etc. Tal vez tendrías que cambiar el diseño de tu hoja, para tener más equipos hacia abajo y que los cambio de equipos, no estén justo abajo, de lo contrario vamos a batallar para hacer algo automático.
Si por el momento te funciona la fórmula, por favor, cierra la pregunta, y crea una nueva con la funcionalidad para poder manejar más equipos.
Saludos. Dam
Épale!! Disculpa la tardanza, pero no tenía Internet.
Entiendo la lógica, pero aún no funciona.
Te enviaré un archivo más completos como sugieres.
Gracias pana.
Ayudame con lo siguiente:
1. ¿Este título “Cambio de Equipo / Equipo Colocado” siempre dice lo mismo en cada día?
2. Tus hojas, siempre se llaman “lunes”, “¿martes”?, necesito que me digas los nombres correctos de todas tus hojas de toda la semana
3. ¿Qué pasa con los siguientes meses?
4. ¿Tienes varios libros?
Hola!1. Si dice Cambio de Equipo / Equipo Colocado todos los días.
2. Realmente son 7 hojas, con los nombres de cada día.
3. Los valores iniciales pasan de hoja a hoja y de libro a libro al final de la semana, es decir, de domingo de un libro a lunes de otro libro.
4. Se hace tantos libros como semanas tiene cada mes.
Gracias
Pero necesito los nombres, para decirle a la macro exactamente que del libro "semana 2" hoja "lunes" tome el valor del libro "semana 1" hoja "domingo".
Si no es posible que me des los nombre o que los nombres sean muy variados, entonces cuando inicie la macro que te pida: cuáles son los libros y las hojas.
Saludos. Dam
Son Variados, pero ponle al libro 1 "semana_01" y al 2 "semana_02" y yo le cambio el nombre en la macro. Para que no me lo pregunte cada vez que lo abra.
Te anexo una macro, por favor revisa lo siguiente:
1. Tus libros de la semana y del mes, deberán estar en la misma carpeta
1.1 Los nombres del libro y la hoja de ayer los pones al inicial la macro.
1.2 Los nombres del libro y la hoja de hoy también los pones al iniciar la macro
2. En todas tus hojas de la semana (lun, mar … dom), los números de equipo deberán empezar en la columna D, (no importa que esté combinada la celda)
3. La lectura final, deberá estar en la columna I (no importa que esté combinada la celda)
4. No importa cuantos equipos tengas.
5. No importa cuantos equipos en la sección de “Cambio de Equipo” tengas.
6. Lo importante es que la sección siempre empiece con la frase “Cambio de Equipo”
7. Deberás crear un archivo que se llame “control eq”
8. Sigue las siguientes instrucciones para ejecutar la macro:
8.1. Abre el libro “control eq”
8.2. Para abrir Vba-macros y poder pegar la macro, Presiona ALt + F11
8.3. En el menú elige Insertar / Módulo
8.4. En el panel del lado derecho copia la macro
8.5. Tienes que cambiar la siguiente
8.5. Para ejecutarla presiona F5
9. Si quieres cambiar el directorio inicial cambia esta línea:
"CARPETA EQUIPOS", 0, "C:"). Items. Item. Path
Por ejemplo por esta
"CARPETA EQUIPOS", 0, "C: \Documents and Settings"). Items. Item. Path
'***Macro*** Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public libroayer, librohoy, hojaayer, hojahoy, wcontrol As String Public eqhoy As Long Public ufilaCt As Integer Sub lasultimassonlasprimeras() 'Por.dam On Error Resume Next Dim wBook As Workbook Dim RngEquipo As Range Dim lecturafinal As Variant Application.StatusBar = "Procesando semanas" Application.ScreenUpdating = False wError = 0 wcontrol = "control eq" Workbooks(wcontrol).Activate Worksheets("Hoja1").Select ufilaCt = Range("A" & Rows.Count).End(xlUp).Row Set navegador = CreateObject("shell.application") carpeta = navegador.browseforfolder(0, _ "CARPETA EQUIPOS", 0, "C:").items.Item.Path ChDir carpeta & "\" enumber = Err.Number libroayer = InputBox("Libro Ayer : ") hojaayer = InputBox("Hoja Ayer : ") librohoy = InputBox("Libro Hoy : ") hojahoy = InputBox("Hoja Hoy : ") Application.ScreenUpdating = True 'Workbooks(wcontrol).Activate 'Worksheets("Hoja1").Select ponerror ("inicio") Application.ScreenUpdating = False Set wBook = Workbooks(libroayer) If wBook Is Nothing Then Workbooks.Open Filename:=libroayer Err.Number = 0 Else Workbooks(libroayer).Activate End If If Err.Number = 0 Then Worksheets(hojaayer).Select If Err.Number = 0 Then ufilaayer = ActiveCell.SpecialCells(xlLastCell).Row 'La hoja si existe Range("D:F").Select Set Rangoayer = Selection.Find(What:="Cambio de Equipo", _ After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , SearchFormat:=False) If Not Rangoayer Is Nothing Then 'El renglón existe PUEDE procesar fila_inter_ayer = Rangoayer.Row wError = 0 Range("D1").Select Else 'El renglón no existe ponerror ("err_renglon") wError = 1 End If Else 'La hoja no existe ponerror ("err_hoja") wError = 1 End If Else 'El libro producto no se pudo activar MsgBox (Err.Number) ponerror ("err_libroproducto") wError = 1 MsgBox (Err.Number) End If If wError = 0 Then 'Abre hoja de hoy para pegar los nuevos datos Set wBook = Workbooks(librohoy) If wBook Is Nothing Then Workbooks.Open Filename:=librohoy Else Workbooks(librohoy).Activate End If If Err.Number = 0 Then Worksheets(hojahoy).Select If Err.Number = 0 Then ufilahoy = ActiveCell.SpecialCells(xlLastCell).Row Range("D:F").Select Set Rangohoy = Selection.Find(What:="Cambio de Equipo", _ After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , SearchFormat:=False) If Not Rangohoy Is Nothing Then 'El renglón existe inicia proceso Range("D1").Select fila_inter_hoy = Rangohoy.Row wError = 0 For i = 6 To fila_inter_hoy Worksheets(hojahoy).Select If Cells(i, 4) > 0 Then eqhoy = Val(Cells(i, 4)) Workbooks(libroayer).Activate Worksheets(hojaayer).Select 'Busca equipo en cambio de equipo Set RngEquipo = Range("D" & fila_inter_ayer + 1 & ":I" & ufilaayer - 1) lecturafinal = Application.WorksheetFunction.VLookup(eqhoy, RngEquipo, 6, False) If Not lecturafinal = "" Then 'lectura_final = Cells(RngEquipo.Row, 9) Workbooks(librohoy).Activate Worksheets(hojahoy).Select Cells(i, 7) = lecturafinal lecturafinal = "" Else 'Busca equipo en normal Set RngEquipo = Range("D5:I" & fila_inter_ayer - 1) lecturafinal = Application.WorksheetFunction.VLookup(Val(eqhoy), RngEquipo, 6, False) If Not lecturafinal = "" Then Workbooks(librohoy).Activate Worksheets(hojahoy).Select Cells(i, 7) = lecturafinal lecturafinal = "" Else ponerror ("err_equipo") End If End If End If Next Else ponerror ("err_renglon") End If Else ponerror ("err_hoja") wError = 1 End If Else ponerror ("err_libro") wError = 1 End If End If 'Fin de error <> 0 'Termino un libro ponerror ("terminado") Application.ScreenUpdating = True Worksheets(wcontrol).Select MsgBox ("Proceso Terminado " & vbNewLine & "Revisar Control") Application.StatusBar = False End Sub Sub ponerror(tipo) ufilaCt = ufilaCt + 1 Workbooks(wcontrol).Activate Cells(ufilaCt, 1).Value = Date Cells(ufilaCt, 2).Value = libroayer Cells(ufilaCt, 3).Value = hojaayer Cells(ufilaCt, 4).Value = librohoy Cells(ufilaCt, 5).Value = hojahoy Cells(ufilaCt, 6).Value = eqhoy Select Case tipo Case "inicio" Cells(ufilaCt, 7).Value = "En proceso" Case "err_hoja" Cells(ufilaCt, 7).Value = "Hoja no se pudo activar" Case "err_renglon" Cells(ufilaCt, 7).Value = "No se encontró la frase: Cambio de Equipo / Equipo Colocado" Case "err_equipo" Cells(ufilaCt, 7).Value = "El equipo no se encuentra en ayer" Case "terminado" Cells(ufilaCt, 7).Value = "Terminado" End Select End Sub '***Macro***
Revisa la macro, si te funciona, por favor, podrías cerrar la pregunta.
Si tiene fallas con gusto la reviso.
Cualquier mejora, deberás abrir una nueva pregunta.
Saludos. Dam
Bárbaro!! No pensé que sería un código tan largo.
Cree el Libro, ejecuté la macro, cambié la ubicación de las lecturas tal como lo indicaste.
No se consiguieron los objetivos, sólo me copia los datos de los InputBox en el libro control eq, además de colocar si el proceso termino.
Así que no se chamo!
Parece difícil.
Si funcionó! Era un error de mi parte, pero el problema es que todo este
proceso debe ser automático, sin que el usuario final tenga la
necesidad de ejecutar una macro en otro libro o de colocar los nombres
de los libros, ya que a pesar de que varían, sería bueno cambiar la dirección del libro dentro del código o actualizar un vinculo.
De verdad te felicito por la agilidad desarrollada en excel y VBA.
Esta pregunta la doy como finalizada, pero si crees conveniente abrir otra para conseguir el resultado, me avisas.
Gracias
- Compartir respuesta