none
[Excel] Colorear una celda con VB

    Question

  • Buenas,

    estoy intentandto colorear una celda de una hoja excel con una macro, en función del valor que contenga. navegando, he encontrado la propiedad Interior.Color , que tienen todas las celdas de una hoja y sirve para colorearlas, no se si me equivoco...

    si es así, no entiendo porque me está fallando el siguiente código, y de nuevo recurro al foro por si a alguien se le ocurre alguna sugerencia.

    En la celda (p.e.: "G3 "), que ha de colorearse, tengo la llamada "=GetValorPrioridad(E3;F3;G3) ", que lanza la siguiente función:

    Function GetValorPrioridad(Tprob As Range, timpact As Range, cella As Range)
        Dim res As Variant
        res = GetValorProbabilidad(Tprob.Value) * GetValorImpacto(timpact.Value)
        
        If res <= 0.03 Then
            res = "Tolerable"        
            '    Probé con esto...
            'With cella.Interior.ColorIndex = xlColorIndexNone
    '''' >>> esta es la linea que me produce el error
                 cella.Interior.Color = RGB(0, 255, 255)
            'End With
    
    ''' (...) aqui hay mas condiciones
    
        Else
            res = "Intolerable"
        End If
        GetValorPrioridad = res
    End Function
    
    

    este código multiplica los valores que devuelven la funciones GetValorXXX y nos devuelve una 'Prioridad' que se traduce en un texto entendible. Si quito la linea donde se pinta la celda funciona perfectamente (en el ejemplo de mas arriba, la celda "G3 " se estableceria a "Tolerable " y el fondo seria cian ). Pero cuando la añado:
     - Si estoy depurando, simplemente el debugger no sigue a partir de es linea
     - Mientras, en la hoja de cálculo, se establece el valor; "#¡VALOR! "



    cualquier sugerencia será bienvenida,

    gracias de antemano,
    un saludo.
    Thursday, December 03, 2009 8:31 AM

All replies

  • hola, Robert !

    (solo como informacion "de partida")...

    - el "motor" de una hoja de calculo electronica, es llevar la pista de las dependencias de formulas/celdas
    - las formulas/funciones solo pueden devolver un resultado, pero no modificar las propiedades de los objetos
    - por esta razon es que el codigo falla en la linea que intenta modificar el color de cualquier celda

    te sugiero buscar alternativas para colorear usando los formatos condicionales ;)

    si cualquier duda (o informacion adicional)... comentas ?
    saludos,
    hector.
    Friday, December 04, 2009 9:51 PM
  • buenas,
    gracias por responder, perdón por no haber aparecido hasta ahora, pero he estado fuera y no he podido conectarme.

    Vaya, no sabía lo del motor de búsqueda, mi idea era intentar "seleccionar" la celda para, a la vez que le cambio el valor, colorearla, pero entiendo lo que comentas. Así pues, sí he conseguido con evento WorksheetChange alterar el color de una celda, cuando se modifica "a mano", pero no cuando se modifica por medio de macro (es decir con el método de mas arriba, se modifica el valor pero el manejador de eventos no responde).

    Entonces se me plantean un par de dudas:
     - puedo usar formatos condicionales con varias condiciones? ahora son 5, pero puede que se amplíen.
     - Si no, hay algún modo de lanzar el evento WorksheetChange o de activarlo desde una macro?

    gracias de antemano,
    un saludo.
    Monday, December 14, 2009 2:50 PM
  • hola, Robert !

    para el color de la celda usando los formatos condicionales...

    -> en la version 2007 tienes diponibles hasta 64 condiciones de formato

    -> en las versiones 97 a 2003...
        a) dispones de 3 formatos diferentes MAS el formato que tengas ya aplicado
        b) podrias utilizar macros... o hacer "compartidas" algunas condiciones (si fuera convenientey posible)
        c) podrias instalar un complemento de terceros:
            -> http://www.xldynamic.com/source/xld.CFPlus.Download.html

    si quieres administrar el evento '_change'... es necesario conocer las condiciones (y lo que ya has intentado)

    si cualquier duda (o informacion adicional)... comentas ?
    saudos,
    hector.

    Tuesday, December 15, 2009 3:08 AM
  • Buenas, gracias por la respuesta,
    hola, Robert !
    para el color de la celda usando los formatos condicionales...
    -> en la version 2007 tienes diponibles hasta 64 condiciones de formato
    -> en las versiones 97 a 2003...
        a) dispones de 3 formatos diferentes MAS el formato que tengas ya aplicado   
    estoy desarrollando este excel bajo 2007, pero ha de ser compatible con 2003. Así como tenemos 5 condiciones distintas estas sugerencias no me valen, pero seguiré investigando la potencia de los condicionales
    b) podrias utilizar macros... o hacer "compartidas" algunas condiciones (si fuera convenientey posible)   
    mmm, estoy intentando hacerlo por macros, pero ya me avisaste que no era posible, no? Entiendo lo de compartir las condiciones, pero por desgracia esto no es lo que me piden :(
    c) podrias instalar un complemento de terceros:
            -> http://www.xldynamic.com/source/xld.CFPlus.Download.html
    esto lo miraré mas a fondo. Sólo me surje una duda: la hoja excel estará compartida para que los usuarios se la bajen y trabajen con ella, ellos han de tener instalado el complemento también?
    si quieres administrar el evento '_change'... es necesario conocer las condiciones (y lo que ya has intentado
    Finalmente, lo que preparé es un manejador que cuando modificas el valor de ciertas celdas, estas cambian de color en función del valor que contienen. El problema es sólo funciona si "a mano" me situo en la celda y actualizo su valor. En cambio si el valor de esta celda lo modifico via macro, el manejador del evento no responde. Hay alguna solución con esto?

    gracias de antemano,
    un saludo.
    Wednesday, December 16, 2009 9:50 AM
  • hola, Robert !

    1) lo que NO se puede hacer "por macros", es cuando el procedimiento esta definido como funcion, cuya intencion es utilizarla como cualquier otra funcion de hoja de calculo

    2) con relacion a "las otras" macros, tambien te comentaba que se pueden manejar a traves del modulo de codigo de "la hoja" donde se controlan los eventos (como el '_change' entre otros)

    3) con relacion al complemento (suponiendo que lo usas), si es necesario que tambien sea instalado en cualquier equipo donde se planee usar ese archivo (por cuestiones logicas)

    4) con respecto del "manejador" que comentas haber implementado, (probablemente) lo habras definido dentro de las reglas de validacion de (in)determinada/s celda/s ?, solo considera que las reglas de validacion funcionan exclusivamente para "entradas/modificaciones/... DIRECTAS" (por parte del usuario) y no tienen efecto cuando "el cambio" sucede por codigo/macros/..., ni cuando se hace un copy/paste desde otro rango

    la solucion, para que funcione cuando lo cambias por macros, es (precisamente) utilizar los eventos en el modulo "de clase" de ESA hoja, para lo cual (como te comentaba tambien), es necesario conocer (si comentas) cuales son "las condiciones" (y cuales las celdas aplicables, y que es lo que ya has intentado, y ???)

    saludos,
    hector.
    Thursday, December 17, 2009 6:37 AM
  • Buenas,
    muchas gracias Héctor por tu ayuda y paciencia, al final quizá consiga entender las hojas excel :-P
    2) con relacion a "las otras" macros, tambien te comentaba que se pueden manejar a traves del modulo de codigo de "la hoja" donde se controlan los eventos (como el '_change' entre otros)
    esto creo que me interesa, pero no tengo nada claro el tema las clases en Excel. Más abajo te expongo el código que he usado y se corresponde con el evento OnChange(), mi idea era que se lanzara después de haber modificado el contenido de la celda (con el código que ya expuse)
    3) con relacion al complemento (suponiendo que lo usas), si es necesario que tambien sea instalado en cualquier equipo donde se planee usar ese archivo (por cuestiones logicas)
    eso me parecía, como es lógico no me sirve :(
    4) con respecto del "manejador" que comentas haber implementado, (probablemente) lo habras definido dentro de las reglas de validacion de (in)determinada/s celda/s ?, solo considera que las reglas de validacion funcionan exclusivamente para "entradas/modificaciones/... DIRECTAS" (por parte del usuario) y no tienen efecto cuando "el cambio" sucede por codigo/macros/..., ni cuando se hace un copy/paste desde otro rango
    mmm no exactamente, te lo cuento por si te sirve para orientarme, pero lo que comentas de las entradas directas es justo lo que suponía. A ver, el siguiente código comprueba qué columna de celdas ha lanzado el evento, si es la columna que se ha de colorear (la 7 o la 12), comprueba el valor y la pinta adequadamente;

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Columns.Count = 1 And Target.Rows.Count = 1 Then
        If Target.Column = 7 Or Target.Column = 12 Then
            If Target.Value <> "" Then
                Select Case Target.Value
                    Case "Tolerable": Target.Interior.Color = RGB(0, 255, 255)
                    Case "Baja":  Target.Interior.Color = RGB(255, 0, 255)
                    Case "Media":  Target.Interior.Color = RGB(0, 255, 0)
                    Case "Alta":  Target.Interior.Color = RGB(255, 255, 0)
                    Case "Intolerable":  Target.Interior.Color = RGB(255, 0, 0)
                End Select
            End If
        End If
    End If
    End Sub

    Este código y el de más arriba funcionan bien por separado, pero no hay modo de que trabajen ¡conjuntamente!

    alguna sugerencia?
    gracias de antemano,
    un saludo.
    Thursday, December 17, 2009 10:16 AM
  • hola, Robert !

    por el codigo que expones en esta continuacion, asumo que ya sabes lo que las instrucicones realizan

    por lo que respecta a que trabajen "conjuntamente"... (solo recordarte que)
    no habra forma de ello, mientras "el codigo de mas arriba" siga siendo un procedimiento "Function", cuya intencion es que sea llamado desde celdas como cualquier otra funcion de hoja de calculo

    (son acciones prohibidas a procedimientos function, AUN si intentan hacerlo por procedimientos Sub "auxiliares")

    saludos,
    hector.
    Friday, December 18, 2009 3:53 AM
  • Buenas,
    gracias por responder Héctor
    hola, Robert !
    por el codigo que expones en esta continuacion, asumo que ya sabes lo que las instrucicones realizan
    jeje, casi mejor asume mi completa ignorancia con el excel ;-P
    por lo que respecta a que trabajen "conjuntamente"... (solo recordarte que)
    no habra forma de ello, mientras "el codigo de mas arriba" siga siendo un procedimiento "Function", cuya intencion es que sea llamado desde celdas como cualquier otra funcion de hoja de calculo
    (son acciones prohibidas a procedimientos function, AUN si intentan hacerlo por procedimientos Sub "auxiliares")

    mi gozo en un pozo pues.
    Pero me has dado una idea que quizá funcione, a ver que te parece:

    el primer código sólo sirve para cambiar el valor numérico por un texto entendible, de dos columnas de tipo lista de selección (E y F), y el segundo responde correctamente a los cambios en las celdas 7 y 12 (columnas G y L), para actualizar sus propiedades. Voy a intentar manejar el evento _change() desde las columnas de datos (E y F) para restablecer las propiedades de G (con Offset ¿?), y si no se puede pues cierro "el caso."

    voy a intentarlo y os cuento,
    un saludo.
    Monday, December 21, 2009 12:36 PM