web-dev-qa-db-fra.com

Excel - Mise en forme conditionnelle - Insérer une ligne

L'utilisation de décalage ou d'indirect dans 'S'applique à' ne semble pas fonctionner. Existe-t-il un autre moyen d'empêcher la mise en forme conditionnelle de la mise en forme conditionnelle après avoir inséré row/s

J'ai un format conditionnel pour une plage, par exemple. 19 $: 105 $. La condition est "si la valeur de la cellule est> 10", elle est formatée en rouge.

Le problème est que, lorsque j'insère une ligne dans Excel, cette plage de formatage se scinde et j'obtiens 2 règles de formatage. Par exemple les 2 règles avec une fourchette de $ O $ 19, $ O $ 21: $ O $ 105 & $ O $ 20 respectivement, si j'insère une nouvelle ligne à la 20ème ligne.

Généralement, dans le cas d'une condition semblable à celle décrite ci-dessus, peu importe si les règles sont divisées en plusieurs plages. Mais pour des conditions telles que «mettre en évidence le top 10», cela entraîne des résultats non souhaités.

J'ai essayé ce qui suit sans trop de chance:

  1. Essayé d'utiliser indirect - mais Excel semble résoudre la formule et enregistre la règle de formatage et ne fonctionne donc pas avec les insertions comme prévu
  2. Essayé d’utiliser le décalage - ici encore, Excel résout la plage comme ci-dessus.

Tout le monde sait comment écrire un format conditionnel qui ne rompt pas avec les insertions de lignes?

[EDIT] Je me suis rendu compte que l’insertion de ligne n’entraînait pas le fractionnement des règles de mise en forme conditionnelle. Je copie également une ligne et colle cette dernière dans la ligne insérée. Si j'opte pour une pâte spéciale et que je choisis uniquement des formules, cela fonctionne bien.

17
ssp

C'est un problème général avec les formats conditionnels. Si vous insérez des lignes ou modifiez des éléments, Excel suppose que vous souhaitez que le format conditionnel soit modifié avec les cellules et que vous souhaitez insérer des cellules avec leur mise en forme d'origine (ou aucune).

Il essaie donc de diviser la plage formatée en fonction des modifications. Malheureusement, "son meilleur" n'est pas très bon. Dans des cas chanceux, vos règles de formatage sont dupliquées sans que vous vous en rendiez compte; dans les cas malheureux, ils cassent pour tout ou partie de la plage appliquée.

Ceci est particulièrement un problème si vous travaillez avec ListObjects (a.k.a. "Tableaux Excel"). Insérez des lignes, réorganisez-les un peu, faites glisser des valeurs et la prochaine fois que vous consulterez votre liste de mise en forme conditionnelle, vous aurez des dizaines à des centaines de règles en double. (exemple: http://blog.contextures.com/archives/2012/06/21/Excel-2010-conditional-formatting-nightmare/ )

D'après mon expérience, le moyen le plus rapide de remédier au désordre consiste à supprimer toutes les règles et à les recréer (ou non).

Quelques notes:

  • La plage applicable à est toujours absolue. Il n'y a pas de chemin aux alentours.
  • Pour aggraver les choses, les formats conditionnels sont traités comme des formules volatiles, ce qui signifie qu’ils sont recalculés à de nombreuses reprises (ouvrir un autre fichier, faire défiler la liste, etc.). Si vous ne remarquez pas les scissions, celles-ci peuvent considérablement ralentir l’ensemble de l’application au bout d’un certain temps.
  • Si vous optez pour VBA, vous voudrez probablement utiliser l'événement Worksheet_Calculate, du moins si vos formules font référence à d'autres feuilles de calcul (soyez conscient des noms!)
6
Torben Klein

Je sais que c'est un vieux fil, mais voici une autre solution très simple et qui fonctionne très bien.

Insérez simplement une nouvelle ligne ou colonne comme vous le souhaitez. Ensuite, sélectionnez et copiez une ligne/colonne ayant la mise en forme conditionnelle correcte. Après spécial dans la nouvelle ligne/colonne que vous venez de créer et sélectionnez l'option "Tous les formats conditionnels de fusion". Vos règles de mise en forme conditionnelle devraient maintenant être automatiquement mises à jour.

Heureux Excel-ing =)

6
user3641891

J'avais ce problème en essayant de créer des rapports - une fois qu'ils ont fini, ils n'ont pas besoin de changer, mais pendant que je les crée, j'ajoute de nouvelles lignes et chaque nouvelle ligne supprime la mise en forme conditionnelle.

Ce n’est certes pas une bonne solution, mais c’était le meilleur que je pouvais trouver sans recourir à VBA - qui consistait à:

a) Faire en sorte que les règles de mise en forme conditionnelles s'appliquent à une colonne entière ou à plusieurs à la fois

par exemple, au lieu de définir la mise en forme conditionnelle sur C2 et C17, insérez une colonne supplémentaire et écrivez "celle-ci" dans les lignes 2 et 17, puis définissez la mise en forme de toute la colonne C sur "si l'autre colonne indique 'ceci on applique ensuite ce format "

b) Changer le s'applique à seulement $ C $ 1: $ C $ 2.

c) Apporter des modifications et insérer des rangées et des trucs

d) Ensuite, revenez en arrière et changez le paramètre S'applique à être $ C: $ C

Ainsi, si vous changez des choses et ajoutez des choses, la mise en forme conditionnelle n’existe pas, mais vous la remettez ensuite à plus tard.

Si, à une date ultérieure, vous devez ajouter quelques lignes supplémentaires, modifiez-le d'abord de $ C: $ C à $ C $ 1: $ C $ 2, puis apportez les modifications nécessaires, puis remettez-le à $ C: $ C. . De cette façon, vous n'avez pas à réécrire complètement toutes les règles de formatage comme vous le feriez si vous faisiez ce que j'ai déjà fait, à savoir tout effacer, maudire et recommencer;)

Évidemment, si vous prévoyez d’insérer des rangées en haut dans les rangées 1 ou 2, cela ne fonctionnera pas, mais vous pouvez toujours le définir sur d’autres rangées que vous savez que vous ne modifierez pas.

2
Simon Taylor

Bien que ce sujet soit relativement ancien, mes feuilles Excel souffraient également de la duplication de la mise en forme conditionnelle lors de l'insertion d'une nouvelle ligne.

J'ai pu contourner ce problème. Laissez-moi le partager avec d'autres, cela pourrait aussi aider.

Dans mon cas, toutes mes règles de mise en forme conditionnelle ont été appliquées à l'ensemble du tableau. J'ai réalisé que seules certaines règles sont dupliquées lors de l'insertion d'une nouvelle ligne. Ces règles sont basées sur des formules et comparent des valeurs de différentes lignes.

Dans mon cas, je voulais rendre une bordure horizontale lorsque les valeurs de deux lignes adjacentes diffèrent, par exemple:

=$A2 <> $A1

Si j'utilise OFFSET pour faire référence à la ligne précédente, tout est correct, aucune règle de mise en forme conditionnelle dupliquée.

=$A2<>OFFSET($A2; -1; 0)

En fait, je mets ces formules de mise en forme conditionnelle dans une colonne masquée, mais le résultat devrait être identique.

2
CraZ

Ce qui fonctionne pour moi est que, lorsque vous insérez une ligne, ne copiez pas la mise en forme d'une autre ligne. Copier-spécial seulement coller les formules. La mise en forme conditionnelle n'est alors pas divisée.

1
Thomas Frenzel

J'ai réalisé que la ligne d'insertion n'entraînait pas le fractionnement des règles de mise en forme conditionnelles. Je copie également une ligne et colle cette dernière dans la ligne insérée. Si j'opte pour une pâte spéciale et que je choisis uniquement des formules, cela fonctionne bien.

Cependant, je me demande s'il ne serait jamais nécessaire d'utiliser 'INDIRECT' ou 'OFFSET' dans le champ 'S'applique à' de la mise en forme conditionnelle. Si oui, ça va être un problème.

1
ssp

Je me rends compte que c’est un vieux billet, mais j’avais le même problème et j’ai depuis compris comment ne pas obtenir les règles de format conditionnelles fractionnées.

Dans ma feuille de calcul Excel 2010, je saisis les dates dans la colonne B. Parfois, je saisis la date avec le doigt, c'est pourquoi je voulais les formater de manière conditionnelle. Au départ, je sélectionnais une plage (B2: B1960). Par conséquent, ma formule dans la règle de mise en forme conditionnelle serait "= B2: B1960> TODAY ()". 

Cela a bien fonctionné jusqu'à ce que j'insère de nouvelles lignes entre les lignes existantes. Les règles seraient scindées exactement comme le décrivait le PO. Il m'est arrivé de consulter plusieurs sites Web et de trouver un site Microsoft Office qui m’a orienté vers la réponse. Il a été indiqué de mettre en évidence la plage que vous souhaitez formater, mais changez la formule en "= B2> TODAY ()".

Depuis que j'ai modifié la formule, je peux maintenant insérer de nouvelles lignes entre des lignes existantes sans obtenir les règles de division comme avant. Voici le lien vers cette page Web. http://office.Microsoft.com/en-us/Excel-help/use-a-formula-to-apply-conditional-formatting-HA102809768.aspx

1
Mike T

Ma solution à ce problème précis consistait à effacer le formatage de la copie source . Étapes:

  1. Copier la source sur le presse-papier
  2. Ouvrir un nouveau document Excel
  3. Collage spécial, sélectionnez une formule (copie les valeurs et les formules et omet la mise en forme)
  4. Copier ceci dans le presse papier
  5. Vous pouvez maintenant coller à la source avant de l'utiliser ou insérer des lignes vides dans la feuille avec la mise en forme conditionnelle (il suffit d'insérer des lignes ne modifiera pas la plage des règles de mise en forme conditionnelle) et de coller le contenu du presse-papiers dans les nouvelles lignes.

Cela a fonctionné pour moi avec MS Excel 2016

1
Pr1nz

En 2013, une fois que vos règles de formatage ont été fractionnées/dupliquées, définissez une nouvelle plage nommée pour chaque format. Ensuite, définissez le s'applique sur = [Plage nommée]. Excel remplacera la plage nommée par la plage réelle. Supprimez ensuite les formats en double.

0
JBAbbott

Voici un fil de discussion similaire qui pourrait vous amener sur la bonne voie:

Comment utiliser l'événement Worksheet_Change pour la mise en forme conditionnelle?

Il décrit une solution de contournement à la mise en forme de style R1C1 qui peut ne pas être affectée par les insertions (non testées) ainsi que par l'approche VBA que j'ai mentionnée dans les commentaires.

0
danielpiestrak

Ce que vous devez faire est 1) insérer une nouvelle ligne 2) copier la ligne que vous voulez cloner 3) coller spécial "Fusionner la mise en forme conditionnelle"

Pas intuitif et une montagne de formation d'utilisateurs si vous voulez que d'autres partagent les classeurs que vous créez

0
Phil Wade

Cela a assez bien fonctionné pour moi ...

Sub ConditionalFormattingRefresh()
'
' ConditionalFormattingRefresh Macro
'

'Generales
Dim sh As Worksheet
Dim tbl As ListObject
Dim selectedCell As Range
Set sh = ActiveSheet
Set tbl = Range("Plan").ListObject
Set selectedCell = ActiveCell

'Rango a copiar
Dim copyRow As Range
Set copyRow = tbl.ListRows(1).Range

'Rango a restaurar
Dim startCell As Range
Dim finalCell As Range
Dim refreshRange As Range
Set startCell = tbl.DataBodyRange.Cells(2, 1)
Set finalCell = tbl.DataBodyRange.Cells(tbl.ListRows.Count, tbl.ListColumns.Count)
Set refreshRange = Range(startCell.Address, finalCell)

'Ocultar procesamiento
Application.ScreenUpdating = False
Application.EnableEvents = False

'Borrar formato corrupto
refreshRange.FormatConditions.Delete

'Copiar
copyRow.Copy
'Pegar formato
tbl.DataBodyRange.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

'Retornar a la normalidad
selectedCell.Select
    Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub
0
Esteban Antonio

J'ai trouvé un processus simple qui semble fonctionner de manière cohérente pour insérer de nouvelles lignes ou colonnes ET qui préserve la continuité des règles de mise en forme conditionnelle (au moins dans Office 2010), comme suit:

  1. Effectuez une simple "insertion" du nombre souhaité de nouvelles lignes ou colonnes au-dessus, au-dessous ou à gauche ou à droite d'une ligne ou d'une colonne contenant la mise en forme conditionnelle à conserver.

REMARQUE a) Votre mise en forme conditionnelle est automatiquement appliquée aux lignes ou aux colonnes insérées sans que vous ayez à faire autre chose. La mise en forme aurait dû être héritée de la rangée ou de la colonne voisine . b) Tout formatage de bordure doit également avoir été copié dans les cellules nouvellement insérées.

  1. Sélectionnez une ligne, une colonne ou une plage (en cliquant dessus) adjacente aux colonnes récemment insérées et contenant le formatage conditionnel (ainsi que les formules et les données, le cas échéant) à copier. 

  2. Passez votre souris sur le coin inférieur gauche ou inférieur droit de la plage sélectionnée jusqu'à ce que le signe plus "+" apparaisse (ne le confondez pas avec le gadget de redimensionnement des lignes, car ils se ressemblent). 

  3. Cliquez avec le bouton gauche de la souris et maintenez le bouton "+" enfoncé, puis faites glisser le curseur sur les lignes, les colonnes ou la plage à formater, puis relâchez.

REMARQUE: je crée des règles de mise en forme conditionnelle référençant une seule cellule: Exemple) dans le champ intitulé "Mettre en forme les valeurs pour lesquelles cette formule est vraie:", crée une règle telle que ... = AND ($ B8 = "", $ C8 = "", $ D8 = "", $ K8 <> ""), où cette règle s’applique à l’intervalle ... = $ B $ 8: $ D $ 121, $ J $ 8: M $ 121 $.

0
AuctionHalt

Je suis en train de construire une solution qui conviendra à d’autres qui possèdent des niveaux de compétences variés d’Excel. J’avais donc besoin de quelque chose de plus simple et cohérent que de leur rappeler de copier et de coller d’une certaine manière. 

Dans Excel 2016, vous pouvez insérer une table à partir d'une plage sélectionnée, ce qui vous permet ensuite d'utiliser des références structurées (exemple: tblTOP [Type] pour référencer des données dans la colonne Type de la table nommée tblTOP).

J'ai ensuite trouvé cette réponse sur le site de Microsoft qui montre un moyen efficace de référencer un tableau dans la partie formule de CF: mise en forme conditionnelle références structurées


Donc, avec cela établi ...

C'est ce que je travaille avec:

tblTop Columns

J'ai configuré ma mise en forme conditionnelle de sorte que, lorsque je modifie la valeur du type entre A et E, la ligne correspondante est modifiée. (Exemple illustré: B passe la ligne au vert)

Ceci a été accompli en utilisant la formule = INDIRECT ("tblTOP [Type]") = "B"

Cependant, lorsque je suis allé ajouter une ligne, le même formatage a été appliqué à cette deuxième ligne :(.

Cassé CF entre deux rangées

Formule CF qui a fonctionné

Pour résumer, la formule suivante est celle que j'ai proposée pour appliquer ma règle CF à cette ligne en particulier et ne pas affecter les lignes ajoutées ou supprimées:

= INDIRECT ("tblTOP [@Type]") = "B"

L'ajout du signe '@' devant la référence structurée permet de conserver le même comportement pour cette ligne. Agréable.

Alors maintenant, je peux parcourir ou utiliser le menu contextuel pour ajouter une nouvelle ligne et attend la sélection du type pour déterminer la couleur de cette ligne uniquement.

New Row ajouté propre

New Row fonctionne comme prévu

Je ne l'ai pas testé avec le collage de cellules, l'objectif de ce tableau étant de permettre à l'utilisateur final de saisir des données et d'ajouter/de supprimer des lignes si nécessaire. Je ne peux donc pas dire si cela fonctionnera avec le collage d'une ligne.

J'espère que cela aidera quelqu'un avec la mise en forme conditionnelle dans un tableau.

0
Russ W

Je suis d'accord avec ce qui a été posté précédemment. copier et coller des valeurs (ou des formules de collage) fonctionnera totalement pour ne pas diviser la mise en forme conditionnelle.

Je suis un peu paresseux pour ça. Et je ne veux pas que ceux qui utilisent mes tableurs soient obligés de le faire. Je ne pense pas non plus qu'ils se souviendront de copier/coller des valeurs. :(

Je ne sais pas si cette solution répondra à vos besoins, mais je me suis efforcé de supprimer toute la mise en forme conditionnelle et de réappliquer la mise en forme conditionnelle correcte chaque fois que le classeur est ouvert.

Étant donné que cette macro s'exécute chaque fois que le classeur est ouvert, l'utilisateur n'a pas besoin de modifier la façon dont ils copient et collent. Ils n'ont pas besoin de savoir que la macro est même là. Ils n'ont pas besoin d'exécuter manuellement la macro; c'est automatique. Je pense que cela crée une meilleure expérience utilisateur.

N'oubliez pas que ce code doit être copié et collé dans le module "Ce classeur"; pas un module régulier.

Private Sub Workbook_Open()
'This will delete all conditional formatting and reapply the conditional formatting properly.
'After copying and pasting the conditional formatting get split into two or more conditional formattings. After a few
'weeks there are so many conditional formattings that Excel crashes and has to recover.

Dim ws As Worksheet, starting_ws As Worksheet


Set starting_ws = ActiveSheet   'remember which worksheet is active in the beginning
Application.ScreenUpdating = False
For Each ws In ThisWorkbook.Worksheets
    If ws.Name <> "InvErr" Then
        ws.Activate
        Cells.FormatConditions.Delete
        ''Every Other Row Tan
        Range("A4:M203").FormatConditions.Add Type:=xlExpression, Formula1:="=ISODD(ROW(A4))"
        Range("A4:M203").FormatConditions(Range("A4:M203").FormatConditions.Count).SetFirstPriority
        Range("A4:M203").FormatConditions(1).Interior.PatternColorIndex = xlAutomatic
        Range("A4:M203").FormatConditions(1).Interior.ThemeColor = xlThemeColorDark2
        Range("A4:M203").FormatConditions(1).Interior.TintAndShade = 0
        Range("A4:M203").FormatConditions(1).StopIfTrue = False

        ''Highlight Duplicates Red
        Columns("B").FormatConditions.AddUniqueValues
        Columns("B").FormatConditions(Columns("B").FormatConditions.Count).SetFirstPriority
        Columns("B").FormatConditions(1).DupeUnique = xlDuplicate
        Columns("B").FormatConditions(1).Font.Color = -16383844
        Columns("B").FormatConditions(1).Font.TintAndShade = 0
        Columns("B").FormatConditions(1).Interior.PatternColorIndex = xlAutomatic
        Columns("B").FormatConditions(1).Interior.Color = 13551615
        Columns("B").FormatConditions(1).Interior.TintAndShade = 0
        Columns("B").FormatConditions(1).StopIfTrue = False
    End If
Next

starting_ws.Activate   'activate the worksheet that was originally active
Application.ScreenUpdating = True

End Sub
0
irockyoursocks