Saltar al contenido

Worksheet_calculate + condicionales para formas


Emasd

Recommended Posts

publicado

Hola a todos!

Mi primer tema acá, espero sean comprensivos si se me pasa por alto alguna normativa y desde ya muchas gracias por la ayuda!

Paso a comentarles:

Estoy trabajando sobre unos indicadores de métricas de la empresa y necesito colorear según el resultado de una fórmula en una celda, una forma (en este caso, un círculo).

Ya estuve intentando solucionarlo, usando el evento Worksheet_Change, como estuve viendo en otros post que trataban el tema de una manera similar y en realidad, no era 100% como lo necesito yo, ya que el dato proviene del resultado de una fórmula.

El problema que se me presentó, es que cada vez que quiero que se modifiquen los indicadores, tengo que seleccionar la celda que tiene la fórmula y presionar "Enter" para que se actualice.

El ejemplo de la secuencia sería así:

*Las celdas x, y, z reciben los resultados de sus correspondientes fórmulas que puede variar entre 0 y 1.

*Si el resultado para x es 1, la autoforma correspondiente a la celda, se debería colorear de verde.

*Si el resultado para x es , la autoforma correspondiente a la celda, se debería colorear de rojo.

*Si el resultado para y es 1, la autoforma correspondiente a la celda, se debería colorear de verde.

*Si el resultado para y es , la autoforma correspondiente a la celda, se debería colorear de rojo.

*Si el resultado para z es 1, la autoforma correspondiente a la celda, se debería colorear de verde.

*Si el resultado para z es , la autoforma correspondiente a la celda, se debería colorear de rojo.

Reitero mi agradecimiento, espero que me puedan ayudar y haber sido lo suficientemente claro con la descripción del problema. En caso de que necesiten mas especificaciones, estoy atento para darlas.

Saludos!

publicado

@[uSER=143023]Riddle[/uSER], justamente, en ese ejemplo no habría mucha diferencia entre la celda con formato condicional y la autoforma. Por eso es que en realidad lo hice para que vean a los efectos como es que mas o menos sería. En el trabajo real, si o si necesito que sea una autoforma.

Saludos!

publicado

amigo Emasd, revisando lo que quieres, la solución del amigo (un saludo) Riddle es interesante, sin embargo no me parece muy buena idea tener una macro ejecutandose constatemente buscando cambios que posiblemente ni se den, bueno es mi opinion.

ahora te pregunto, esa formula por lo que veo se va actualizar siempre que se realice un cambio en la hoja 2 (sea de la forma que sea), pues bien, por que no adaptas la macro del amigo Riddle para que se ejecute en el evento Worksheet_Change de la hoja 2?, pienso que sería lo más fácil según lo que quieres; aunque mas fácil es la primera opcion que él planteo pero no te sirve ya que tiene que ser obligatorio una autoforma; suerte y esperemos que el amigo Macro Antonio te aporte una solucion satisfactoria

publicado

_____________________________________________________________________

Pues aquí estamos.

En el adjunto, cada vez que cambies un valor en cualquier celda de las columnas "E" o "G" de la Hoja1, se actualizará la autoforma.

Te dejo una hoja con los códigos de la autoformas por si quieres cambiarla.

También hay una pequeña macro que recompone todas las autoformas.

_____________________________________________________________________

Formato condicional con autoforma.xls

publicado

Muchísimas gracias a todos! La solución con el timer si bien es válida, quizás al ejecutarse un macro cada 1 segundo afecte de alguna manera el desempeño, pero desde ya te agradezco mucho igualmente @[uSER=143023]Riddle[/uSER]

P.D: Muy útil el anexo con los códigos de las autoformas.

publicado

buenas, excelente la solucion Macro Antonio (no podia ser de otra manera jejejeje), sin embargo veo un pequeño problema, según lo que dice el amigo Emasd la columna G (¿Pagó?) es una formula que se actualiza de otra hoja, y si es así, esta solución funcionara solamente si se cambia la info en la hoja2 y luego se hace algun cambio en la columna 5 de la hoja1; si se hace al contrario, se actualiza la hoja1 y luego la hoja2, los colores de las autoformas NO cambiaran, me equivoco??.

ahora, si el dato de la columna G se coloca manualmente, perfecto, la solución funcionara perfectamente cada vez que se haga un cambio sobre la columna G sin problemas.

por eso yo platie en mi mensaje anterior que se podía usar el evento Worksheet_Change de la hoja 2, así cuando se actualice la columna 2 de esa hoja, se hace el proceso de actualizar las autoformas.

nota: excelente los codigos de las autoformas y las forma de agregarla, yo lo hacia de una manera diferente jejeje, gracias nuevamente amigo Macro Antonio

publicado

Tal cual, me quedé observando bien la fórmula una vez que comenté, y acá se me presenta el mismo problema que tenía antes. Que es que para actualizar las autoformas se tiene que hacer "Enter" en la celda de la que la autoforma toma el valor.

Gracias @[uSER=133908]bigpetroman[/uSER] por notar ese detalle!

publicado

De hecho, me gustaría agregar, que en lo que estuve investigando yo, mas que el evento "worksheet_change" se necesitaría el de "worksheet_calculate" que técnicamente, cada vez que se realiza un cálculo nuevo en la hoja, se dispara.

Saludos!

publicado

.

@[uSER=164605]Emasd[/uSER], la solución no pasa por usar el evento Calculate, si no, que debería ir en la línea que apunta @bigpetroman, es decir, utilizar el evento Change de la Hoja2.

Ya tienes la macro que genera la autoforma, solo debes adaptarla.

Saludos a todos

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      29

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    2    1

  • Crear macros Excel

  • Mensajes

    • Que tal nuevamente,  adjunto una solución alternativa: =MAX(A:.A)-BYROW(F4:.AK20,LAMBDA(r,BUSCAR(2,1/(r=0),F3:.AK3))) Cabe mencionar que esta solución requiere funciones nuevas como RECORTAR.RANGO. CONTADOR FINAL (Solucion).xlsb
    • Buenos días,  espero se encuentren bien de salud compañeros, Favor me podrían ayuda con lo siguientes como se podría hacer cuando tengo una tabla dinámica que  amedida que se aumente las columnas fechas con data un formula que se coloco al final busque o analice siempre la ultima fila y columna de la fecha. Coloco un ejemplo
    • @JSDJSD Excelentes, GRACIAS POR TU SOPORTE , me ayudo demasiado es exactamente lo que quería. 5 ESTRELLAS
    • 'Opción 1 Sub FiltrarSKUPorFecha(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim diccionarioSKU As Object Dim listaEliminar As Object Dim fechaActual As String, fechaSiguiente As String Dim f As Variant With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Crear diccionarios para comparar SKU y almacenar filas a eliminar Set diccionarioSKU = CreateObject("Scripting.Dictionary") Set listaEliminar = CreateObject("Scripting.Dictionary") ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then diccionarioSKU.RemoveAll ' Limpiar el diccionario antes de llenarlo ' Guardar los SKU de la fecha siguiente (solo de la siguiente) For f = fila + 1 To ultimaFila If .Cells(f, 1).Value <> fechaSiguiente Then Exit For diccionarioSKU(.Cells(f, 2).Value) = 1 Next f ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Solo eliminar si el SKU no está en la fecha siguiente If Not diccionarioSKU.exists(.Cells(f, 2).Value) Then listaEliminar(f) = 1 ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar.keys .Rows(f).Delete Next End With MsgBox "Completado correctamente.", vbInformation End Sub 'Opción 2 Sub FiltrarSKUPorFecha1(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim listaEliminar As Collection Dim fechaActual As String, fechaSiguiente As String Dim f As Variant, i As Long Dim SKUExiste As Boolean With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Inicializar la colección para marcar las filas a eliminar Set listaEliminar = New Collection ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Comprobar si el SKU está en la fecha siguiente SKUExiste = False For i = fila + 1 To ultimaFila If .Cells(i, 1).Value <> fechaSiguiente Then Exit For If .Cells(i, 2).Value = .Cells(f, 2).Value Then SKUExiste = True Exit For End If Next i ' Si el SKU no se encuentra en la fecha siguiente, marcar para eliminar If Not SKUExiste Then listaEliminar.Add f ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar .Rows(f).Delete Next f End With MsgBox "Completado correctamente.", vbInformation End Sub   TABLA ELIMINAR.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.