Fragmentación de formato condicional de Excel

22

A menudo, creo una hoja con formato condicional y establezco los rangos de celdas para que las reglas de formato condicional solo se apliquen una vez a un rango de celdas, por ejemplo

Make $A$1:$A$30 red and
Make $B$1:$B$30 blue.

Después de insertar / eliminar varias filas y / o columnas, el conjunto de reglas de formato condicional se fragmenta mucho, repitiéndose las mismas reglas para diferentes rangos. p.ej

Make $A$1:$A$2 red 
Make $A$3:$A$4 red 
Make $A$5:$A$9 red
Make $A$10:$A$20 red 
Make $A$21:$A$30 red
...
Make $B$1:$B$2 blue 
Make $B$3:$B$4 blue
Make $B$5:$B$9 blue
Make $B$10:$B$20 blue 
Make $B$21:$B$30 blue
....

¿Hay alguna forma práctica de prevenir esto, o estoy condenado a limpiar los conjuntos de reglas manualmente cuando se vuelven demasiado desordenados?

Rhys Gibson
fuente

Respuestas:

13

Insertar y eliminar filas no hace que el formato condicional se fragmente.

La causa es copiar / pegar entre celdas o filas utilizando el estándar copiar / pegar. La solución es usar siempre el valor de pegar o la fórmula de pegar. En el destino, haga clic derecho y la sección Opciones de pegado ofrecerá 123 (valores) yf (fórmulas). No copie / pegue el formato, ya que las condiciones se copiarán / pegarán y, a veces, se fragmentarán.

Cuando realiza una copia / pegado estándar, también copia las fórmulas condicionales de la celda. Digamos que tiene dos reglas:
1) Hacer $ A $ 1: $ A $ 30 rojo
2) Hacer $ B $ 1: $ B $ 30 azul
Ahora seleccione A10: B10 y cópielo / péguelo en A20: B20. Lo que Excel hará es eliminar el formato condicional para A20: B20 de las reglas que se aplicaron a esas celdas y agregar nuevas reglas que tengan el formato para A20: B20. Terminas con cuatro reglas.
1) Marca = $ A $ 20 rojo
2) Marca = $ B $ 20 azul
3) Marca = $ A $ 1: $ A $ 19, $ A $ 21: $ A $ 30 rojo
4) Marca = $ B $ 1: $ B $ 19, $ B $ 21: $ B $ 30 azul
Si hubiera copiado / pegado solo A10 a A20, Excel habría notado que la misma regla se aplica tanto al origen como al destino y no fragmenta las reglas. Excel no es lo suficientemente inteligente como para descubrir cómo evitar la fragmentación cuando su copia / pegado impacta dos o más formatos condicionales.

Insertar y eliminar filas no causa fragmentación, ya que Excel simplemente expande o reduce las reglas de condición que cubren el área donde insertó o eliminó la fila.

Alguien sugirió usar $ Q: $ Q en lugar de $ Q $ 1: $ Q $ 30. Eso no ayuda y aún obtendrá fragmentación cuando copie / pegue el formato de celda como se indicó anteriormente.

usuario3347790
fuente
También tenga en cuenta que Cut <kbd> ctrl-x <kbd> eliminará el formato condicional del corte de celda (ahora la celda no tiene formato) y pegará el formato en la nueva celda. ¿Apuesto a que alguien sabe cómo prevenir esto?
user5389726598465
@ user135711 Depende de lo que intente hacer. Por defecto, copie y corte, ambos recogen las fórmulas, el formato y los enlaces de la celda de origen con el corte que también elimina la misma de la celda de origen. Si la intención es eliminar la fórmula / valor de la fuente pero mantener el formato, copiaré / pegaré las cosas en el destino y luego eliminaré la fuente. Eliminar (la tecla Supr) solo borra la fórmula o el valor. Deja el formato y los enlaces en su lugar.
user3347790
1
La función INDIRECTO () votada como una respuesta en otra versión de esta pregunta no funciona porque se evalúa en las celdas cuando se usa en el campo aplica a, como si ingresara las celdas manualmente.
user5389726598465
superuser.com/a/1113566/79488 tiene una buena solución para limpiar las reglas fragmentadas si usaste copy / pase
Fabian Schmied
5

Tuve el mismo problema al aplicar el formato condicional a una columna de la tabla. Al agregar filas, descubrí que funciona mejor aplicar la regla a toda la columna usando $A:$A, o cualquier columna.

ingrese la descripción de la imagen aquí

CharlieRB
fuente
En mi experiencia, cuando la hoja de trabajo se hace un poco más grande, esto hará que los formatos condicionales se hinchen y los cálculos se puedan reducir a un rastreo.
rohrl77
3

(Esta es una solución, por lo que iba a ponerlo como un comentario, pero no tengo suficiente reputación).

Desafortunadamente, parece que estás condenado a limpiar conjuntos de reglas cuando se vuelven desordenados.

Una manera fácil de hacer esto es crear una hoja de trabajo que contenga el formato que necesita, pero sin datos. Puede estar en el mismo libro de trabajo que su hoja de trabajo original, o en otro libro de trabajo que tenga como plantilla.

Cuando necesite limpiar, vaya a esta hoja de trabajo, haga clic con el botón derecho en el botón Seleccionar todo , elija el pintor de formato , luego haga clic en el botón Seleccionar todo en su hoja de trabajo original. Los formatos se sobrescriben con la versión no contaminada.


fuente
2

Copiar / pegar / cortar / insertar celdas manualmente causa el problema y es difícil evitarlo.

Problema resuelto a través de la macro VBA.

En lugar de copiar / pegar / cortar / insertar celdas manualmente, lo hago a través de una macro de Excel, que conserva los rangos de celdas (activados mediante un botón).

Sub addAndBtnClick()
    Set Button = ActiveSheet.Buttons(Application.Caller)
    With Button.TopLeftCell
        ColumnIndex = .Column
        RowIndex = Button.TopLeftCell.Row
    End With
    currentRowIndex = RowIndex
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.ListRows.Add (currentRowIndex)
    Set currentCell = Table.DataBodyRange.Cells(currentRowIndex, Table.ListColumns("Column name").Index)
    currentCell.Value = "Cell value"
    Call setCreateButtons
End Sub

Sub removeAndBtnClick()
    Set Button = ActiveSheet.Buttons(Application.Caller)
    With Button.TopLeftCell
        ColumnIndex = .Column
        RowIndex = Button.TopLeftCell.Row
    End With
    currentRowIndex = RowIndex
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.ListRows(currentRowIndex - 1).Delete
End Sub

Sub setCreateButtons()
    Set Table = ActiveSheet.ListObjects("Table name")
    ActiveSheet.Buttons.Delete
    For x = 1 To Table.Range.Rows.Count
        For y = 1 To Table.Range.Columns.Count

            If y = Table.ListColumns("Column name").Index Then
                Set cell = Table.Range.Cells(x, y)
                If cell.Text = "Some condition" Then
                    Set btn = ActiveSheet.Buttons.Add(cell.Left + cell.Width - 2 * cell.Height, cell.Top, cell.Height, cell.Height)
                    btn.Text = "-"
                    btn.OnAction = "removeAndBtnClick"
                    Set btn = ActiveSheet.Buttons.Add(cell.Left + cell.Width - cell.Height, cell.Top, cell.Height, cell.Height)
                    btn.Text = "+"
                    btn.OnAction = "addAndBtnClick"
                End If
            End If
        Next
    Next
End Sub

Para restablecer el formato (no es realmente necesario):

Sub setCondFormat()
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.Range.FormatConditions.Delete
    With Table.ListColumns("Column name").DataBodyRange.FormatConditions _
        .Add(xlExpression, xlEqual, "=ISTLEER(A2)") 'Rule goes here
        With .Interior
            .ColorIndex = 3 'Formatting goes here
        End With
    End With
    ...
End Sub
Peter Gerhat
fuente
3
No publique la misma respuesta a varias preguntas. Si la misma información realmente responde ambas preguntas, entonces una pregunta (generalmente la más nueva) debería cerrarse como un duplicado de la otra. Puede indicar esto votando para cerrarlo como un duplicado o, si no tiene suficiente reputación para eso, levante una bandera para indicar que es un duplicado. De lo contrario, adapte su respuesta a esta pregunta y no solo pegue la misma respuesta en varios lugares.
DavidPostill