Fragmentation de la mise en forme conditionnelle Excel

22

Souvent, je crée une feuille avec une mise en forme conditionnelle et je définis les plages de cellules de sorte que les règles de mise en forme conditionnelle ne soient appliquées qu'une seule fois à une plage de cellules, par exemple

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

Après avoir inséré / supprimé un certain nombre de lignes et / ou de colonnes, l'ensemble de règles de mise en forme conditionnelle devient très fragmenté, avec les mêmes règles répétées pour des plages différentes. par exemple

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
....

Existe-t-il une bonne pratique pour empêcher cela, ou suis-je condamné à nettoyer manuellement les jeux de règles lorsqu'ils deviennent trop salissants?

Rhys Gibson
la source

Réponses:

13

L'insertion et la suppression de lignes n'entraînent pas la fragmentation du formatage conditionnel.

La cause est le copier / coller entre les cellules ou les lignes en utilisant le copier / coller standard. Le correctif consiste à toujours utiliser la valeur de collage ou la formule de collage. Sur la destination, faites un clic droit et la section Options de collage offrira 123 (valeurs) et f (formules). Ne copiez / collez pas le formatage car cela entraînerait la copie / le collage des conditions et parfois elles seront fragmentées.

Lorsque vous effectuez un copier / coller standard, il copie également les formules conditionnelles de la cellule. Disons que vous avez deux règles:
1) Faire $ A $ 1: $ A $ 30 rouge
2) Faire $ B $ 1: $ B $ 30 bleu
Maintenant, sélectionnez A10: B10 et copiez / collez cela dans A20: B20. Ce que fera Excel, c'est de supprimer la mise en forme conditionnelle pour A20: B20 des règles qui s'appliquent à ces cellules et d'ajouter de nouvelles règles ayant la mise en forme pour A20: B20. Vous vous retrouvez avec quatre règles.
1) Marque = $ A $ 20 rouge
2) Marque = $ B $ 20 bleu
3) Marque = $ A $ 1: $ A $ 19, $ A $ 21: $ A $ 30 rouge
4) Marque = $ B $ 1: $ B $ 19, $ B 21 $: B $ 30 $ bleu
Si vous aviez copié / collé uniquement A10 vers A20, Excel aurait remarqué que la même règle était appliquée à la fois à la source et à la destination et ne fragmentait pas les règles. Excel n'est pas assez intelligent pour comprendre comment éviter la fragmentation lorsque votre copier / coller affecte deux ou plusieurs formats conditionnels.

L'insertion et la suppression de lignes ne provoquent pas de fragmentation, car Excel développe ou réduit simplement les règles de condition qui couvrent la zone où vous avez inséré ou supprimé la ligne.

Quelqu'un a suggéré d'utiliser $ Q: $ Q plutôt que $ Q $ 1: $ Q $ 30. Cela n'aide pas et vous obtiendrez toujours la fragmentation lorsque vous copiez / collez le formatage des cellules comme indiqué ci-dessus.

user3347790
la source
Notez également que Couper <kbd> ctrl-x <kbd> supprimera la mise en forme conditionnelle de la coupure de cellule (maintenant la cellule n'a plus de mise en forme) et collez la mise en forme dans la nouvelle cellule. Je parie que quelqu'un sait comment empêcher cela?
user5389726598465
@ user135711 Cela dépend de ce que vous essayez de faire. Par défaut, copier et couper ramassent tous les deux les formules, la mise en forme et les liens de la cellule source, couper les supprimant également de la cellule source. Si l'intention est de supprimer la formule / valeur de la source mais de conserver la mise en forme, je vais copier / coller le contenu vers la destination, puis supprimer la source. Supprimer (la touche Suppr) efface uniquement la formule ou la valeur. Il laisse la mise en forme et les liens en place.
user3347790
1
La fonction INDIRECT () votée comme réponse dans une autre version de cette question ne fonctionne pas car elle est évaluée dans les cellules lorsqu'elle est utilisée dans le champ s'applique à comme si vous aviez entré les cellules manuellement.
user5389726598465
superuser.com/a/1113566/79488 a une bonne solution de contournement pour nettoyer les règles fragmentées si vous avez utilisé copier / coller
Fabian Schmied
5

A eu le même problème lors de l'application du format conditionnel à une colonne de table. Lors de l'ajout de lignes, j'ai trouvé qu'il était préférable d'appliquer la règle à toute la colonne à l'aide de $A:$A, ou à n'importe quelle colonne.

entrez la description de l'image ici

CharlieRB
la source
D'après mon expérience, lorsque la feuille de calcul devient un peu plus grande, cela entraînera un gonflement des formats conditionnels et des calculs pouvant être réduits à une analyse.
rohrl77
3

(C'est une solution de contournement, donc j'allais le mettre en commentaire, mais je n'ai pas assez de réputation.)

Malheureusement, il semble que vous soyez voué à vider les jeux de règles lorsqu'ils deviennent désordonnés.

Un moyen simple de le faire consiste à créer une feuille de calcul contenant la mise en forme dont vous avez besoin, mais pas de données. Cela peut être dans le même classeur que votre feuille de calcul d'origine, ou dans un autre classeur que vous conservez comme modèle.

Lorsque vous devez nettoyer, accédez à cette feuille de calcul, cliquez avec le bouton droit sur le bouton Sélectionner tout , choisissez le Reproduire la mise en forme , puis cliquez sur le bouton Sélectionner tout dans votre feuille de calcul d'origine. Les formats sont remplacés par la version vierge.


la source
2

Copier / coller / couper / insérer des cellules manuellement provoque le problème et il est difficile de l'éviter.

Problème résolu grâce à la macro VBA.

Au lieu de copier / coller / couper / insérer des cellules manuellement, je le fais via une macro Excel, qui préserve les plages de cellules (activées via un bouton).

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

Pour réinitialiser le formatage (pas vraiment nécessaire):

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
la source
3
Veuillez ne pas poster la même réponse à plusieurs questions. Si la même information répond vraiment aux deux questions, alors une question (généralement la plus récente) doit être fermée en double de l'autre. Vous pouvez l'indiquer en votant pour le fermer comme doublon ou, si vous n'avez pas assez de réputation pour cela, lever un drapeau pour indiquer qu'il s'agit d'un doublon. Sinon, adaptez votre réponse à cette question et ne collez pas simplement la même réponse à plusieurs endroits.
DavidPostill