11
votes

Faire un formatage conditionnel statique

Y a-t-il un moyen de convertir le formatage conditionnel en formatage statique dans Excel?

J'essaie d'exporter une gamme de feuille Excel vers un nouveau classeur, avec une apparence identique, mais aucune formule, des liens, etc. Le problème ici est que j'ai un formatage conditionnel qui s'appuie sur des calculs extérieurs à la portée exportée.

J'ai essayé d'enregistrer le classeur à .html, assez curieusement, le formatage des spectacles dans IE mais pas lors de la réouverture dans Excel.


0 commentaires

7 Réponses :


8
votes

L'idée suivante a été prise d'ici , bien que modifié pour adapter de nouvelles structures de formatage conditionnel et votre Besoins.

Cela fonctionne comme ceci: Compte tenu d'un classeur avec une formatage conditionnel (effectuez une copie de la tienne), vous mettez dans Sub A () la gamme de cellules que vous souhaitez transformer de la mise en forme conditionnelle et droite et exécutez la macro. Après cela, supprimez simplement manuellement les formats conditionnels et Presto!

Désolé pour la longueur du code ... La vie est parfois comme ceci :( xxx


4 commentaires

Merci, je vais essayer que lundi. Jolie folle qu'il n'y a pas de propriété .isactive sur la formatCondition (ou une voie directe d'obtenir le format calculé d'une cellule).


@Martin, vous devriez vérifier la première fois que la réponse @chris n'est pas suffisante. C'est plus facile (mais vous êtes obligé de supprimer toutes vos formules de la gamme)


J'ai fini simplement à changer mes conditionnels pour créer uniquement un lien vers des cellules à l'intérieur de la zone que je veux exporter, ils devraient donc continuer à travailler. Votre réponse est la solution générique à ce problème, donc je l'ai sélectionnée comme la réponse correcte.


Je remarque qu'aucune des solutions ici ne semble fonctionner si le format conditionnel a été défini à l'aide d'une formule. -_- Ugh



3
votes

Je déteste-le quand les gens disent "Hey, pourquoi tu ne faisais-tu pas cela tout ce genre de choses", mais je vais juste le jeter là-bas: quand je voulais faire cela dans le passé, je ' Je l'ai fait en copiant la première fois la feuille de calcul en question, puis copier et coller les formules comme des valeurs (sans déplacer leur emplacement du tout). Cela gèlera évidemment le formatage conditionnel, mais signifie également que la recalisation du cahier du cahier ne vous laissera plus que des valeurs qui ne sont plus appropriées pour le formatage qui est assis sur eux.

Si cela ne fonctionne pas, le code de Belisarius semble super.


4 commentaires

Pas mal du tout s'il ne violait pas les besoins des autres OP. +1


THX - Les valeurs de copie font partie du plan. Un problème ici est que je n'ai besoin que d'une partie de la feuille et de supprimer les autres rangées / colonnes, mais la condition relie les cellules situées à l'extérieur de cette partie. Un autre problème (mineur) avec les valeurs de copie est qu'il tue n'importe quel formatage des sous-cellules dans les cellules de texte.


Je viens d'essayer cela dans Excel 2010 et cela ne semble pas fonctionner. Pouvez-vous détailler les étapes que vous prenez pour copier une gamme de cellules avec un formatage conditionnel dans une feuille de calcul différente. Quand je colle valeurs , le formatage est complètement perdu, lorsque je colle valeurs et formatage de source , le formatage conditionnel , les règles sont également copiées sur le nouveau feuille :(.


Désolé, en fait - je n'ai pas fait cela très clair. J'ai édité la réponse.



0
votes

Merci à Belisarius pour la réponse très utile! Cependant, il circule dans un bogue dans Excel 2003, où l'interrogation de la formule de formatage conditionnelle sur n'importe quelle cellule dans une sélection multiple / étendue renvoie la formule de la première cellule dans cette sélection! Pour contenter de cela, je devais annuler n'importe quelle sélection au début et le restaurer à la fin. J'ai également changé son sous-programme en une fonction qui prend une gamme et renvoie le nombre de cellules modifiées et ajouté un sous-programme d'enveloppe qui l'applique à la sélection actuelle et supprime tout formatage conditionnel (puisqu'il n'est plus nécessaire). Vous n'avez donc plus besoin de Pour la modifier à un code difficile de votre plage cible.

Option Explicit

Sub FreezeConditionalFormattingOnSelection()
    Call FreezeConditionalFormatting(Selection)
    Selection.FormatConditions.Delete
End Sub

Public Function FreezeConditionalFormatting(rng As Range)
Rem Originally posted by http://stackoverflow.com/users/353410/belisarius
Rem at http://stackoverflow.com/questions/4692918/excel-make-conditional-formatting-static
Rem Modified 2012-04-20 by gcl to:
Rem   (a) be a function taking target range as an argument, and
Rem   (b) to cancel any multiple selection before processing in order to work around a bug
Rem         in Excel 2003 wherein querying the formula on any cell in a multiple/extended selection
Rem         returns the conditional formatting on the first cell in that selection!
Rem   (c) return number of cells that it modified.

Dim iconditionno As Integer
Dim rgeCell As Range
Dim nCFCells As Integer
Dim rgeOldSelection As Range

Set rgeOldSelection = Selection 'new

nCFCells = 0
For Each rgeCell In rng
    rgeCell.Select  'new

   If rgeCell.FormatConditions.Count <> 0 Then
       iconditionno = ConditionNo(rgeCell)
       If iconditionno <> 0 Then
           rgeCell.Interior.ColorIndex = rgeCell.FormatConditions(iconditionno).Interior.ColorIndex
           rgeCell.Font.ColorIndex = rgeCell.FormatConditions(iconditionno).Font.ColorIndex
           nCFCells = nCFCells + 1
       End If
   End If
Next rgeCell

rgeOldSelection.Select 'new

FreezeConditionalFormatting = nCFCells
End Function

Private Function ConditionNo(ByVal rgeCell As Range) As Integer
Rem posted by http://stackoverflow.com/users/353410/belisarius
Rem at http://stackoverflow.com/questions/4692918/excel-make-conditional-formatting-static

Dim iconditionscount As Integer
Dim objFormatCondition As FormatCondition

    For iconditionscount = 1 To rgeCell.FormatConditions.Count
        Set objFormatCondition = rgeCell.FormatConditions(iconditionscount)
        Select Case objFormatCondition.Type
           Case xlCellValue
               Select Case objFormatCondition.Operator
                   Case xlBetween: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True And _
                                           Compare(rgeCell.Value, "<=", objFormatCondition.Formula2) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlNotBetween: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True And _
                                           Compare(rgeCell.Value, ">=", objFormatCondition.Formula2) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlGreater: If Compare(rgeCell.Value, ">", objFormatCondition.Formula1) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlEqual: If Compare(rgeCell.Value, "=", objFormatCondition.Formula1) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlGreaterEqual: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlLess: If Compare(rgeCell.Value, "<", objFormatCondition.Formula1) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlLessEqual: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True Then _
                                           ConditionNo = iconditionscount

                   Case xlNotEqual: If Compare(rgeCell.Value, "<>", objFormatCondition.Formula1) = True Then _
                                           ConditionNo = iconditionscount

                  If ConditionNo > 0 Then Exit Function
              End Select

          Case xlExpression
            If Application.Evaluate(objFormatCondition.Formula1) Then
               ConditionNo = iconditionscount
               Exit Function
            End If
       End Select

    Next iconditionscount
End Function

Private Function Compare(ByVal vValue1 As Variant, _
                         ByVal sOperator As String, _
                         ByVal vValue2 As Variant) As Boolean

   If Left(CStr(vValue1), 1) = "=" Then vValue1 = Application.Evaluate(vValue1)
   If Left(CStr(vValue2), 1) = "=" Then vValue2 = Application.Evaluate(vValue2)

   If IsNumeric(vValue1) = True Then vValue1 = CDbl(vValue1)
   If IsNumeric(vValue2) = True Then vValue2 = CDbl(vValue2)

   Select Case sOperator
      Case "=": Compare = (vValue1 = vValue2)
      Case "<": Compare = (vValue1 < vValue2)
      Case "<=": Compare = (vValue1 <= vValue2)
      Case ">": Compare = (vValue1 > vValue2)
      Case ">=": Compare = (vValue1 >= vValue2)
      Case "<>": Compare = (vValue1 <> vValue2)
   End Select
End Function


0 commentaires

0
votes

J'ai ramassé cet ajout sur Excel.Tips.com pour faire ce travail pour Excel 2010 et l'adapter à la version de GCL de Belisarius's. Substituez cette ligne sous le boîtier de xlexpression: xxx

avec ceci: xxx

Il rend la formule propogue correctement et à travers correctement.


2 commentaires

Je continue à obtenir une erreur "variable non définie" lorsque je fais cela.


@Lorenzo: Vous devrez ajouter DIM F3 en tant que chaîne au début du code pour définir la variable F3. Notez également que vous devrez "traduire" la formule provenant du formatage conditionnel (CF) si vous utilisez une locale non anglais d'Excel. (Voir Cette réponse pour traduire)



1
votes

J'ai mis en place l'addition de Belisarius et de Cameron en avant. Vous devez choisir la zone que vous souhaitez geler (de grandes sélections pourraient prendre un certain temps). J'ai remarqué s'il y a des erreurs Excel sur les cellules, cela pourrait provoquer une exception, mais sinon cela fonctionne bien sur Excel 2010. Au fait, merci à tous!


xxx

0 commentaires

2
votes

Cette approche semble bien fonctionner. Je ne l'ai implémenté que pour les couleurs de fond.

Sub FixColor()
    Dim r
    For Each r In Selection
        r.Interior.Color = r.DisplayFormat.Interior.Color
    Next r
    Selection.FormatConditions.Delete
End Sub


1 commentaires

C'est parfait, une solution beaucoup plus simple que les autres solutions de l'Excel moderne! Facilement adaptable à d'autres propriétés également si vous devez, notez qu'il supprimera également des cellules fusionnées dans la gamme



2
votes

Je vous suggère une approche beaucoup plus facile qui fonctionnera tout le temps. J'ai aussi essayé fort avec VBA mais il était si difficile que je suis resté au milieu.

Pour convertir le formatage conditionnel en statique, nous allons d'abord convertir Excel en HTML (page Web), puis retour à Excel. Veuillez suivre l'approche ci-dessous. xxx

dans le processus de sauvegarde du classeur Excel au format HTML, le programme "Bandes" Tout le formatage conditionnel et le rend explicite (absolu). Cependant, vous devez être conscient que ce processus fait également la même chose avec vos formules, ce qui permet de sauver tout comme valeur, à la place.


1 commentaires

Vous pourriez être capable de copier depuis le navigateur HTML et Coller-> Spécial juste le formatage. Si cela ne fonctionne pas, copiez-le du navigateur et de coller dans une feuille Excel vide et de la copie et collez le formatage.