# Cómo una macro corre tomando valor de otras celdas?



## josevaldesv (Nov 10, 2004)

mmhh  hungry for knowledge!!!

Tengo una macro que cambia de color la celda en la columna A si pongo, por ejemplo, CORRECTO o INCORRECTO en A1 y doy Enter.
CORRECTO lo pone en verde e INCORRECTO en rojo.
Esto lo hace perfecto.

Pero ahora pongo en A1 una fórmula
=IF(B1=100,"CORRECTO","INCORRECTO")
y cada vez que cambio el valor de B1 NO SE CAMBIA automáticamente el color de A1, sino hasta que me voy a A1, presiono la tecla F2 y doy Enter.

Desgraciadamente no puedo poner formato condicional porque ya tengo otros 3 colores usados en la misma columna.

Alguna idea? Ni con autoopen lo logré...


----------



## Juan Pablo González (Nov 10, 2004)

En el evento _Change, en vez de usar A1, se debe usar B1... con la condición de

If Range("B1").Value = 100 Then
    'Cambiar a verde
Else
    'Cambiar a rojo
End If


----------



## josevaldesv (Nov 10, 2004)

De plano no puedo....
no me sale el ejemplo....
de todos modos necesito hacer el trigger de la macro aprentado ENTER...

Está más claro mi problema en la expilcación que puse 3 o 4 mensajes abajo en el foro.

Mmmhhhh, de plano no logro descifrar.


----------



## Greg Truby (Nov 10, 2004)

José,

Yo haría algo así:

<font face=Courier New><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Change(<SPAN style="color:#00007F">ByVal</SPAN> Target <SPAN style="color:#00007F">As</SPAN> Range)
    <SPAN style="color:#00007F">If</SPAN> Target.Column <> 2 _
    <SPAN style="color:#00007F">Or</SPAN> Target.Count <> 1 <SPAN style="color:#00007F">Then</SPAN> <SPAN style="color:#00007F">Exit</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
    <SPAN style="color:#00007F">With</SPAN> Target.Offset(, -1)
        <SPAN style="color:#00007F">If</SPAN> UCase(.Value) = "INCORRECTO" <SPAN style="color:#00007F">Then</SPAN>
            .Interior.ColorIndex = 3
        <SPAN style="color:#00007F">ElseIf</SPAN> UCase(.Value) = "CORRECTO" <SPAN style="color:#00007F">Then</SPAN>
            .Interior.ColorIndex = 4
        <SPAN style="color:#00007F">Else</SPAN>
            .Interior.ColorIndex = xlColorIndexNone
        <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN>
    <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">With</SPAN>
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>

</FONT>


----------



## josevaldesv (Nov 10, 2004)

Muchas gracias... 
ya me siento muy apenado   
porque todavía no sale como quiero que salga...
aún necesito darle Enter o F2-Enter a otras celdas...
aunque ya no a las originales, ahora sí a las otras...

creo que lo mejor es complementar con una macro que presione F2 y luego Enter automáticamente a todo para que ya salgan los colores....

Si tienen otra idea, please let me know...

gracias


----------



## Greg Truby (Nov 10, 2004)

Lo siento José.  Creía que asi era lo que querría.  ¿Entonces usted desea que con cualquier cambio a cualquiera celda en la hoja, los colores en columna A se refresquen?


----------



## josevaldesv (Nov 11, 2004)

Efectivamente, eso es lo que quiero.

Digamos que quiero que funcione exáctamente igual que el formato condicional... el cual cambia por el valor de la celda, incluso sin dar ENTER y a través de fórmulas (sin presionar F2 y luego Enter).

Gracias.


----------



## Juan Pablo González (Nov 11, 2004)

Se puede usar el evento _Calculate, aunque no lo recomendaría mucho, porque puede afectar la "eficiencia" de la hoja....


----------



## Greg Truby (Nov 11, 2004)

Se puede adaptar el macro un poco para que no se fija en cual celda fue cambiado y poner el código en la rutina para _Calculate como indica JPG.  Pero como dice JPG, aunque uno usa algo como .SpecialCells para minimizar la cantidad de celdas tocadas siempre va a tener un impacto en la eficiencia de la hoja.

<font face=Courier New>

<SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Calculate()
    <SPAN style="color:#00007F">Dim</SPAN> rngFormulasInA <SPAN style="color:#00007F">As</SPAN> Range, rngCell <SPAN style="color:#00007F">As</SPAN> Range
    <SPAN style="color:#00007F">On</SPAN> <SPAN style="color:#00007F">Error</SPAN> <SPAN style="color:#00007F">Resume</SPAN> <SPAN style="color:#00007F">Next</SPAN>
    <SPAN style="color:#00007F">Set</SPAN> rngFormulasInA = Range("A:A").SpecialCells(xlCellTypeFormulas)
    <SPAN style="color:#00007F">If</SPAN> rng<SPAN style="color:#00007F">For</SPAN>mulasInA <SPAN style="color:#00007F">Is</SPAN> <SPAN style="color:#00007F">Nothing</SPAN> <SPAN style="color:#00007F">Then</SPAN> <SPAN style="color:#00007F">Exit</SPAN> <SPAN style="color:#00007F">Sub</SPAN>
    For <SPAN style="color:#00007F">Each</SPAN> rngCell <SPAN style="color:#00007F">In</SPAN> rngFormulasInA.Cells
        <SPAN style="color:#00007F">With</SPAN> rngCell
            <SPAN style="color:#00007F">If</SPAN> UCase(.Value) = "INCORRECTO" <SPAN style="color:#00007F">Then</SPAN>
                .Interior.ColorIndex = 3
            <SPAN style="color:#00007F">ElseIf</SPAN> UCase(.Value) = "CORRECTO" <SPAN style="color:#00007F">Then</SPAN>
                .Interior.ColorIndex = 4
            <SPAN style="color:#00007F">Else</SPAN>
                .Interior.ColorIndex = xlColorIndexNone
            <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN>
        <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">With</SPAN>
    <SPAN style="color:#00007F">Next</SPAN> rngCell
<SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN>


</FONT>


----------



## josevaldesv (Nov 11, 2004)

cheers mate!!!!

efectivamente lo hace un poco más lento...
pero está excelente esto! :D

3 meses de fórmulas se acaban de resumir a estas líneas, hahahha

gracias


----------



## josevaldesv (Nov 10, 2004)

mmhh  hungry for knowledge!!!

Tengo una macro que cambia de color la celda en la columna A si pongo, por ejemplo, CORRECTO o INCORRECTO en A1 y doy Enter.
CORRECTO lo pone en verde e INCORRECTO en rojo.
Esto lo hace perfecto.

Pero ahora pongo en A1 una fórmula
=IF(B1=100,"CORRECTO","INCORRECTO")
y cada vez que cambio el valor de B1 NO SE CAMBIA automáticamente el color de A1, sino hasta que me voy a A1, presiono la tecla F2 y doy Enter.

Desgraciadamente no puedo poner formato condicional porque ya tengo otros 3 colores usados en la misma columna.

Alguna idea? Ni con autoopen lo logré...


----------



## josevaldesv (Nov 13, 2004)

Me encuentro en un sábado aburrido y dije "por qué no? sigamos aprendiendo!"

Al hacer esto, no me permite Excel utilizar la función Ctrl-Z (deshacer o undo).
Asumo que es por la Macro que está aquí arriba.

Existe una manera de "habilitar" Ctrl-Z por si me equivoco al meter un dato?

Saludos, buen fin


----------



## Greg Truby (Nov 15, 2004)

Que interesante.  ¿Cuántos macros he escrito que son "Event Handlers" y hasta ahora me doy cuenta que hacer esto deshabilita "Undo"?  Traté de cambiarlo del __Calculate_ al __Change_ pero no ayuda.  Al menos que otra persona sabe algo, yo diría que habría que probar hacer su propio Undo.  Tal vez JPG u otra persona conozcan otros ejemplos pero personalmente el único ejemplo que he visto es él de Ole Erlandsen.  "Scroll" (o use "find") hacia abajo hasta que encuentre las palabras "Create your own custom undo macro".

{Edit}Ay, y puede ser que para hacer su propio UnDo, sería necesario cambiar el evento usado del __Calculate_ al __Change_ porque __Calculate_ no tiene "target".{EndEdit}
Saludos,


----------



## Juan Pablo González (Nov 16, 2004)

Otro ejemplo, en la página de John Walkenbach:

http://www.j-walk.com/ss/excel/tips/tip23.htm


----------

