# Ejecutar Macro con el cambio de color de una celda



## DOL54 (May 31, 2016)

Hola amigos.
En una hoja excel, hago la conciliación bancaria y pinto cada celda de un rango ("k14:L4000") que coincide con el resumen del banco. Quisiera que la celda adjunta (M14:M4000) marque una "x" *en el momento que pinto la celda*. Así, de esta forma puedo filtrar todos los cambio ("x") para poder encontrar las diferencias.


----------



## sergioMabres (Jun 1, 2016)

Hola Dol
Para hacer esto vas a necesitar una mezcla de VBA en una UDF (Función definida por el usuario) y una formula, la formula es:
M14=SI(cellbgcolor(K14)<>-4142;"X";"")
Y la UDF es muy simple es:

```
Function cellbgcolor(r As Range) As Integer
'
' Devuelve elcolor del fondo como integer
'
  cellbgcolor = r.Cells(1, 1).Interior.ColorIndex
End Function
```

Saludos
Sergio


----------



## DOL54 (Jun 1, 2016)

Gracias Sergio por tu respuesta.
No soy un experto en programación. Solo intento agilizar mi trabajo y carezco de muchos conocimientos.
Intuyo que la formula condicional irá en cada celda de la columna "M" del rango ("M14:M4000") y que la función al igual que VB en la misma hoja (etiqueta > ver codigo ...).

Así lo hice pero :
En la columna "M" queda la formula como texto : *=SI(cellbgcolor(K14)<>-4142;"X";"") *y no me funciona al cambiar de color la celda *"k14". *Además te recuerdo, que la celda ("M"), deberá marcar una "X" tanto si coloreo la celda *"M" *como la* "L" *del rango ("*L14:M4000*")*

*
Saludos y perdón por la ignorancia.
Daniel


<colgroup><col width="22"></colgroup><tbody>

</tbody>


----------



## Greg Truby (Jun 2, 2016)

Daniel,

Un par de cosas:

1. No existe manera de hacer exactamente lo que usted pide.  Cambiar el color de una celda no "levanta un evento" (does not "Raise an Event").  Por eso no existe manera de "atrapar" un evento y resolverlo en el momento de cambiar el color.  La solución que le ofrece Sergio es más o menos lo más cerca que podrías llegar.  Hay otras soluciones muchas más complejas y no brindarán resultados mucho mejores que la de Sergio.

2. Edite la función de Sergio un poquito:

```
Function cellbgcolor(r As Range) As Integer
'
' Devuelve elcolor del fondo como integer
  Application.Volatile True
  cellbgcolor = r.Cells(1, 1).Interior.ColorIndex
End Function
```


Con poner eso de "volatile true", cada vez que usted cambia el VALOR (no el COLOR) que cualquiera celda, todas las celdas con su función vuelven a calcular.


----------



## sergioMabres (Jun 2, 2016)

Hola Daniel
Muy bueno el comentario del MVP, gracias Greg!

Para que la formula evalúe mas que la celda K14 y pruebe la L14 también, podes cambiar la formula (no la UDF) a:

*M14=SI(o(cellbgcolor(K14)<>-4142;cellbgcolor(L14)<>-4142);"X";"")*

Para que la formula se reevalue despues de que se cambian los colores de fondo habria por lo menos dos formas para forzar el recalculo:

- Cambiando un valor, usando la UDF modificada por Grag
- O haciendo una macro que pegue la formula =si(... en toda la columna M, esto fuerza el recalculo

Saludos
Sergio


----------



## Greg Truby (Jun 2, 2016)

Pero de cualquier forma, nada va a cambiar en el momento que usted *cambia el color*.  La hoja se actualiza solamente el momento de *cambiar un valor.*


----------



## DOL54 (Jun 3, 2016)

Muy amable. Muchas gracias a Ud. y a Sergio.


----------



## Truiz (Jun 3, 2016)

DOL54 said:


> Hola amigos.
> En una hoja excel, hago la conciliación bancaria y pinto cada celda de un rango ("k14:L4000") que coincide con el resumen del banco. Quisiera que la celda adjunta (M14:M4000) marque una "x" *en el momento que pinto la celda*. Así, de esta forma puedo filtrar todos los cambio ("x") para poder encontrar las diferencias.



Que celda estas pintando?
Donde quieres que se ponga la "x"?
Necesitas que la "x" aparesca en el siguiente instante despues de pintar la celda o una vez pintadas todas las celdas hacer apareceer las "x"


----------

