IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Détecter et exploiter les paramètres des MFC d'un fichier


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut Détecter et exploiter les paramètres des MFC d'un fichier
    Bonjour,

    Je cherche une macro qui me permettrai de "lire" la mise en forme conditionnel de chaque cellule d'un tableau et de l'appliquer en mise en forme conventionnel...car je veux supprimer les formule qui le font la Mef conditionnel avant diffusion

    Le problème aujourd'hui c'est que je ne sais pas faire la premiere parti de ma macro: "lire" la MeF Conditionnel...

    Merci de votre aide

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Les mises en forme conditionnelles sont stockées dans la collection FormatConditions de l'objet Range.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    merci, j'avance un peu...

    J'ai compris en essayant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A3").FormatConditions.Item(i)
    me permettant de lire la condition i mais je ne trouve pas grand chose a lire a l'interieur... (genre la couleur donnée si lea condition est vrai...

    tu pourrais m'en dire plus STP

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Bonjour,

    je te conseille de prendre une des cellules concernées en modif après avoir démarré l'enregistreur de macro. Tu vas dans le formattage conditionnel et tu changes (sans changer) ce qui t'intéresse. Ainsi tu verra le code à écrire. Easy non ?

    Exemple chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Macro2()
     
        Selection.FormatConditions.Delete
        Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""Blackberry"""
        Selection.FormatConditions(1).Font.ColorIndex = xlAutomatic
        Selection.FormatConditions(1).Interior.ColorIndex = 6
    End Sub

  5. #5
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,
    Citation Envoyé par Godzestla Voir le message
    Easy non ?
    non pas vraiment...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("XX").FormatConditions.Count > 0 Then ...
    me permettra de vérifier si la cellule contient une (ou plusieurs) mise en forme conditionnelle ou non mais ... comment récupérer les différents paramètres de ces mises en forme et comment déterminer les paramètres actifs ?

    Je n'ai pas encore trouvé la réponse

  6. #6
    Membre Expert
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Re,

    Pour trouver la description de la MeFC, il faut explorer la collection FormatConditions composée d'objet de type FormatCondition.

    L'aide est assez bien renseignée (en tout cas pour Excel 2010, peut-être que dans Excel 2007 tout n'est pas disponible) :

    Référence du développeur Excel 2010 > Référence du modèle objet Excel > Objet FormatCondition
    Référence du développeur Excel
    FormatCondition, objet
    Cet objet représente une mise en forme conditionnelle.
    Remarques

    L'objet FormatCondition appartient à la collection FormatConditions. La collection FormatConditions peut contenir jusqu'à trois mises en forme conditionnelles pour une plage donnée.

    Utilisez la méthode Add pour créer une nouvelle mise en forme conditionnelle. Si une plage a plusieurs mises en forme, vous pouvez utiliser la méthode Modify pour modifier l'une des mises en forme ou vous pouvez utiliser la méthode Delete pour supprimer une mise en forme, puis utilisez la méthode Add pour en créer une nouvelle.

    Utilisez les propriétés Font, Borders et Interior de l'objet FormatCondition pour modifier l'aspect des cellules mises en forme. Certaines propriétés de ces objets ne sont pas gérées par le modèle d'objet à la mise en forme conditionnelle. Certaines des propriétés compatibles avec la mise en forme conditionnelle sont reprises dans le tableau ci-dessous.

    (...)
    Exemple

    Utilisez FormatConditions(index), où index est le numéro d'index de la mise en forme conditionnelle, pour renvoyer un objet FormatCondition. L'exemple suivant montre comment définir les propriétés d'une mise en forme pour une mise en forme conditionnelle existante pour les cellules E1:E10.

    Visual Basic pour Applications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With Worksheets(1).Range("e1:e10").FormatConditions(1)
        With .Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = 6
        End With
        With .Font
            .Bold = True
            .ColorIndex = 3
        End With
    End With
    et aussi :

    Référence du développeur Excel 2010 > Référence du modèle objet Excel > Objet FormatCondition
    FormatCondition, membres de l’objet
    Cet objet représente une mise en forme conditionnelle.

    Méthodes
    Nom Description
    Delete Supprime l’objet.
    Modify Modifie un format conditionnel existant.
    ModifyAppliesToRange Définit la plage de cellules à laquelle cette règle de mise en forme s’applique.
    SetFirstPriority Attribue à la règle de mise en forme conditionnelle en question la valeur de priorité « 1 » de sorte qu’elle soit évaluée avant toutes les autres règles présentes dans la feuille de calcul.
    SetLastPriority Définit l’ordre d’évaluation de la règle de mise en forme conditionnelle de sorte qu’elle soit évaluée après toutes les autres règles présentes dans la feuille de calcul.

    Propriétés
    Nom Description
    Application Utilisée sans qualificateur d’objet, cette propriété renvoie un objet Application qui représente l’application Microsoft Excel. Lorsqu’elle est utilisée avec un qualificateur d’objet, elle renvoie un objet Application représentant l’application ayant créé l’objet spécifié (vous pouvez utiliser cette propriété avec un objet OLE Automation pour renvoyer l’application de cet objet). En lecture seule.
    AppliesTo Renvoie un objet Range qui spécifie la plage de cellules à laquelle la règle de mise en forme est appliquée.
    Borders Renvoie une collection Borders qui représente les bordures d’un style ou d’une plage de cellules (y compris une plage définie comme une partie d’un format conditionnel).
    Creator Renvoie l’application qui a créé cet objet, sous la forme d’un nombre entier de 32 bits. Type de données Long en lecture seule.
    DateOperator Spécifie l’opérateur Date utilisé dans le format conditionnel. En lecture-écriture.
    Font Renvoie un objet Font qui représente la police de l’objet spécifié.
    Formula1 Renvoie la valeur ou l’expression associée au format conditionnel ou à la validation de données. Il peut s’agir d’une constante, d’une chaîne, d’une référence à une cellule ou d’une formule. Type de données String en lecture seule.
    Formula2 Renvoie la valeur ou l’expression associée au second élément d’un format conditionnel ou d’une validation de données. N’est utilisée que si la propriété Operator du format conditionnel de validation de données a la valeur xlBetween ou xlNotBetween. Il peut s’agir d’une constante, d’une chaîne, d’une référence à une cellule ou d’une formule. Type de données String en lecture seule.
    Interior Renvoie un objet Interior qui représente l’intérieur de l’objet spécifié.
    NumberFormat Renvoie ou définit le format numérique appliqué à une cellule si la règle de mise en forme conditionnelle renvoie True. Type Variant en lecture-écriture.
    Operator Renvoie une valeur de type Long qui représente l’opérateur pour le format conditionnel.
    Parent Renvoie l’objet parent de l’objet spécifié. En lecture seule.
    Priority Renvoie ou définit la valeur de priorité de la règle de mise en forme conditionnelle. La priorité détermine l’ordre d’évaluation lorsqu’une feuille de calcul contient plusieurs règles de mise en forme conditionnelle.
    PTCondition Renvoie une valeur de type Boolean qui indique si le format conditionnel est appliqué à un graphique de tableau croisé dynamique. En lecture seule.
    ScopeType Renvoie ou définit l’une des constantes de l’énumération XlPivotConditionScope qui détermine l’étendue du format conditionnel lorsqu’il est appliqué à un graphique de tableau croisé dynamique.
    StopIfTrue Renvoie ou définit une valeur de type Boolean qui détermine si les autres règles de mise en forme conditionnelle de la cellule doivent être évaluées lorsque la règle active renvoie la valeur True.
    Text Renvoie ou définit une valeur de type String qui spécifie la chaîne de texte utilisée par la règle de mise en forme conditionnelle.
    TextOperator Renvoie ou définit l’une des constantes de l’énumération XlContainsOperator qui spécifie la recherche de texte effectuée par la règle de mise en forme conditionnelle.
    Type Renvoie une valeur de type Long contenant une valeur xlFormatConditionType qui représente le type d’objet.
    Le mieux est d'explorer en debug une cellule avec MeFC pour repérer les valeurs des différentes propriétés...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub MeFCtoMeF()
     
    i = ActiveCell.FormatConditions.Count
     
    For j = 1 To i
        If ActiveCell.FormatConditions(j) = True Then FCColor = ActiveCell.FormatConditions(j).Interior.ColorIndex
        If ActiveCell.FormatConditions(j).StopIfTrue = True Then j=i
        If FCColor <> Null Then ActiveCell.Interior.ColorIndex = FCColor
    Next
    End Sub
    Voici ce que j'ai commencé a écrire.
    Le probleme c'est que "ActiveCell.FormatConditions(j) = True" pour savoir si la MeF est appliquée n'existe pas (je l'ai tenté au pif ) et que je ne trouve pas d'argument me donnant cette info...

    Merci pour votre aide, je continu a chercher de mon coté mais si qq'un sait

  8. #8
    Membre Expert
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Je ne comprends pas bien ce que tu veux dire par "savoir si la MeF est appliquée". Le fait qu'elle existe ne te suffit pas ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Citation Envoyé par tedo01 Voir le message
    Bonjour,
    Je ne comprends pas bien ce que tu veux dire par "savoir si la MeF est appliquée". Le fait qu'elle existe ne te suffit pas ?
    Je veux dire si la condition qui applique la MeF est vrai,
    car si la MeFC n'est pas appliquée je ne veux pas la copier dans la MeF!

    Bon je ne trouve pas...

    qq'un aurai une idée...

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une fonction trouvée sur Internet dont malheureusement je ne connais pas l'auteur original et donc ne peux pas le citer.
    Les arguments : RG c'est le range, pour le Mode tape 1 et cela te renvoie le RGB si la condition de la MFC est vraie. Ce code devrait t'inspirer pour ce que tu veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Public Function CouleurMFC(RG As Range, Optional Mode As Byte = 0) As Variant
     Dim e As Long, i As Byte, LoTest As Boolean
     Dim LoMFC As FormatCondition
     Application.Volatile
     'boucle sur le nombre de condition(s)
     'Si pas de MFC .FormatConditions.Count renvoi 0
     For i = 1 To RG.FormatConditions.Count
      Set LoMFC = RG.FormatConditions(i)
      If LoMFC.Type = xlCellValue Then
        'tester le type de la formule entrée
        Select Case LoMFC.Operator
          Case xlEqual
               LoTest = RG = Evaluate(LoMFC.Formula1)
          Case xlNotEqual
               LoTest = RG <> Evaluate(LoMFC.Formula1)
          Case xlGreater
               LoTest = RG > Evaluate(LoMFC.Formula1)
          Case xlGreaterEqual
               LoTest = RG >= Evaluate(LoMFC.Formula1)
          Case xlLess
               LoTest = RG < Evaluate(LoMFC.Formula1)
          Case xlLessEqual
               LoTest = RG <= Evaluate(LoMFC.Formula1)
          Case xlNotBetween
               LoTest = (RG < Evaluate(LoMFC.Formula1) Or RG > Evaluate(LoMFC.Formula2))
          Case xlBetween
               LoTest = (RG >= Evaluate(LoMFC.Formula1)) And (RG <= Evaluate(LoMFC.Formula2))
        End Select
        If LoTest Then
          'Peu ajouter d'autre format si nécessaire,
            'comme la bordure, la police etc..
          Select Case Mode
            Case 0
               CouleurMFC = LoMFC.Interior.ColorIndex
            Case 1
               CouleurMFC = LoMFC.Interior.Color
          End Select
          Exit Function
        End If
      End If
     Next i
     CouleurMFC = 0
    End Function
    LoTest égal VRAI si la condition est remplie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LoTest = RG = Evaluate(LoMFC.Formula1)
    J'espère que cela t'aidera.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Citation Envoyé par fring Voir le message
    Bonjour,


    non pas vraiment...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("XX").FormatConditions.Count > 0 Then ...
    me permettra de vérifier si la cellule contient une (ou plusieurs) mise en forme conditionnelle ou non mais ... comment récupérer les différents paramètres de ces mises en forme et comment déterminer les paramètres actifs ?

    Je n'ai pas encore trouvé la réponse
    Bonjour, tu as raison Fring, mea culpa.

    Mais je pense qu'il est possible d'extraire malgré tous les différents paramètres des différentes mises en forme en se donnant un peu de mal.

    Avec ce code sur une cellule avec MEF cond et 2 formules, je récupére pas mal de paramètres (le code est sale et ne récupère pas tout), mais au niveau de l'idée c'est une avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim i As Integer
    For i = 1 To Range("A2").FormatConditions.Count
        Debug.Print "Cond " & i
        Debug.Print "BordersLineStyle " & Range("A2").FormatConditions.Item(i).Borders.LineStyle
        Debug.Print "FontFonstyle " & Range("A2").FormatConditions.Item(i).Font.FontStyle
        Debug.Print "Type " & Range("A2").FormatConditions.Item(i).Type
        Debug.Print "Operator " & Range("A2").FormatConditions.Item(i).Operator
        Debug.Print "Type " & Range("A2").FormatConditions.Item(i).Type
        Debug.Print "Formula1 " & Range("A2").FormatConditions.Item(i).Formula1
    Next i
    End Sub
    il reste bien sur à translater les codes retournés pour operator , type,... en =, xlGreater, et autre.... c'est surtout là que cela semble fastidieux.

    Quant-à déterminer le paramètre actif....alors là....

    -----------Edit-----------
    Oops. Coiffé par Corona. Place au pros. Salut Corona.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Merci a corona et a Godzestla

    Suite a l'analyse de la macro transmise par corona j'ai regardé les propriétés de mes cellules en mode debug et surprise:
    dans l'argument "Operator" de FormatConditions(i) = <Erreur définie par l'application ou par l'objet>

    Or c'est sur cet argument que repose la procédure de test..

    Mais j'ai remarquer que les différents cas ne reposais que sur la valeur de la cellule elle même et les miennes sont sur une formule! Donc j'ai tenté de regarder une cellule avec ce type de condition et le "Type" est différent!
    FormatConditions(i).Type = 2 dans mon cas et 1 dans le cas traité par la macro...

    je devrais pouvoir creuser dans cette direction pour elargir l'applicabilité de cette function

    Fred

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If LoMFC.Type = 2 Then
            LoTest = 1 = Evaluate(LoMFC.Formula1)
        End If

    Je n'arrive pas a dire si .Formula1 est vrai ou pas

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je viens d'adapter la fonction pour détecter si la MeFC fait appel à une formule mais le problème est que la formule renvoyée est en formule locale (ex : SOMME à la place de SUM) et donc je n'arrive pas à la tester avec EVALUATE.
    J'ai fais des recherches mais pour l'instant rien de concluant mis à part une proposition de conversion. J'imagine qu'il doit y avoir une autre solution moins lourde.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Public Function CouleurMFC(RG As Range, Optional Mode As Byte = 0) As Variant
     Dim e As Long, i As Byte, LoTest As Boolean
     Dim LoMFC As FormatCondition
     Application.Volatile
     'boucle sur le nombre de condition(s)
     'Si pas de MFC .FormatConditions.Count renvoi 0
     For i = 1 To RG.FormatConditions.Count
       Set LoMFC = RG.FormatConditions(i)
       Select Case LoMFC.Type
         Case xlCellValue ' La valeur de la Cellule est
           ' Tester le type de la formule entrée
           Select Case LoMFC.Operator
             Case xlEqual
                  LoTest = RG = Evaluate(LoMFC.Formula1)
             Case xlNotEqual
                  LoTest = RG <> Evaluate(LoMFC.Formula1)
             Case xlGreater
                  LoTest = RG > Evaluate(LoMFC.Formula1)
             Case xlGreaterEqual
                  LoTest = RG >= Evaluate(LoMFC.Formula1)
             Case xlLess
                  LoTest = RG < Evaluate(LoMFC.Formula1)
             Case xlLessEqual
                  LoTest = RG <= Evaluate(LoMFC.Formula1)
             Case xlNotBetween
                  LoTest = (RG < Evaluate(LoMFC.Formula1) Or RG > Evaluate(LoMFC.Formula2))
             Case xlBetween
                  LoTest = (RG >= Evaluate(LoMFC.Formula1)) And (RG <= Evaluate(LoMFC.Formula2))
           End Select
           If LoTest Then
             'Peu ajouter d'autre format si nécessaire,
             'comme la bordure, la police etc..
             Select Case Mode
               Case 0
                  CouleurMFC = LoMFC.Interior.ColorIndex
               Case 1
                  CouleurMFC = LoMFC.Interior.Color
             End Select
             Exit Function
           End If
        Case xlExpression ' La formule est
         Debug.Print "La formule est " & LoMFC.Formula1
       End Select
     Next i
     CouleurMFC = 0
    End Function
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Bonjour,
    Je viens d'adapter la fonction pour détecter si la MeFC fait appel à une formule mais le problème est que la formule renvoyée est en formule locale (ex : SOMME à la place de SUM) et donc je n'arrive pas à la tester avec EVALUATE.
    Je ne sais pas tester car j'ai office English, mais si tu colles la formule locale récupérée dans une celle par un paste spécial de type formule et que tu la récupères, elle ne passe pas en format non local analysable par EVALUATE?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Citation Envoyé par Godzestla Voir le message
    Bonjour,


    Je ne sais pas tester car j'ai office English, mais si tu colles la formule locale récupérée dans une celle par un paste spécial de type formule et que tu la récupères, elle ne passe pas en format non local analysable par EVALUATE?
    J'ai suivi ton conseil!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Sub MeFCtoMeF()
     
    FCColor = CouleurMFC(ActiveCell)
        If FCColor <> 0 Then ActiveCell.Interior.ColorIndex = FCColor
     
    End Sub
     
    Public Function CouleurMFC(RG As Range, Optional Mode As Byte = 0) As Variant
     Dim e As Long, i As Byte, LoTest As Boolean
     Dim LoMFC As FormatCondition
     Application.Volatile
     'boucle sur le nombre de condition(s)
     'Si pas de MFC .FormatConditions.Count renvoi 0
     For i = 1 To RG.FormatConditions.Count
      Set LoMFC = RG.FormatConditions(i)
      If LoMFC.Type = xlCellValue Then
            'tester le type de la formule entrée
                Select Case LoMFC.Operator
                    Case xlEqual
                         LoTest = RG = Evaluate(LoMFC.Formula1)
                    Case xlNotEqual
                         LoTest = RG <> Evaluate(LoMFC.Formula1)
                    Case xlGreater
                         LoTest = RG > Evaluate(LoMFC.Formula1)
                    Case xlGreaterEqual
                         LoTest = RG >= Evaluate(LoMFC.Formula1)
                    Case xlLess
                         LoTest = RG < Evaluate(LoMFC.Formula1)
                    Case xlLessEqual
                         LoTest = RG <= Evaluate(LoMFC.Formula1)
                    Case xlNotBetween
                         LoTest = (RG < Evaluate(LoMFC.Formula1) Or RG > Evaluate(LoMFC.Formula2))
                    Case xlBetween
                         LoTest = (RG >= Evaluate(LoMFC.Formula1)) And (RG <= Evaluate(LoMFC.Formula2))
                End Select
        End If
     
        If LoMFC.Type = 2 Then
            For col = 1 To 255
                If Cells(1, col) = "" Then Exit For
            Next
     
            If Cells(1, col) = "" Then
                Cells(1, col).FormulaLocal = LoMFC.Formula1
                LoMFC_Formula1 = Cells(1, col).Formula
                Cells(1, col).ClearContents
                LoTest = 1 = Evaluate(LoMFC_Formula1)
            End If
        End If
     
        If LoTest Then
          'Peu ajouter d'autre format si nécessaire,
            'comme la bordure, la police etc..
          Select Case Mode
            Case 0
               CouleurMFC = LoMFC.Interior.ColorIndex
            Case 1
               CouleurMFC = LoMFC.Interior.Color
          End Select
          Exit Function
        End If
     
     Next i
     CouleurMFC = 0
    End Function
    mais ca ne marche pas
    Le problème C'est que dans Excel2007 la formule qui est lu c'est la formule de la première cellule de la zone....
    Je m'explique!
    j'ai dans mon tableau une seule cellule qui me fait passé sa ligne en Vert!
    donc dans ma MeFC j'ai
    Formule:"=SI($F3="OK",1,0)"
    S'appique à: "=$A$3:$H$24"

    Donc si je traite A3, pas de problème il lit bien la bonne formule!
    Mais si je traite A20 il ne lit pas F20 dans la formule pour autant!!!

    Là, je ne sais plus quoi faire

  16. #16
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je crois que le problème vient du fait que l'on écrit dans une cellule alors que c'est une fonction.
    Si tu transformes la fonction en procédure SUB cela fonctionnera.
    En modifiant toutefois la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oTest = 1 = Evaluate(LoMFC_Formula1)
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LoTest = Evaluate(LoMFC_Formula1)
    Mais bon, ce n'est pas la solution recherchée puisqu'il faudrait que ce soit une fonction.
    Il faudrait trouver une autre astuce pour transformer cette function locale en fonction. J'avais pensé de placer la formule dans un nom sans faire référence à une cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Names.Add Name:="maFormule", RefersToR1C1:=laFormule
    Mais je n'ai pas le temps pour l'instant de faire les tests
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    J'ai écrit une grosse bêtise, c'est APPLICATION.VOLATILE qui posait le problème
    Je l'ai mis en remarque et le code ci-dessous renvoie bien VRAI si la condition de la MFC est remplie.
    J'ai utilisé une cellule nommée paramMFC comme cellule tampon pour écrire la formule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         Case xlExpression ' La formule est
            Range("paramMFC").FormulaLocal = LoMFC.Formula1
            LoTest = Evaluate(Range("paramMFC").Formula)
            Range("paramMFC").ClearContents
            Debug.Print LoTest
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  18. #18
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Bonjour a tous

    J'ai fait les modifs suivant tes conseils corona
    mais j'ai exactement le même resultat...

    Peux-tu regarder le code ci-dessous et me dire ce qui ne va pas STP...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Sub MeFCtoMeF()
     
    FCColor = CouleurMFC(ActiveCell)
        If FCColor <> 0 Then ActiveCell.Interior.ColorIndex = FCColor
     
    End Sub
     
    Public Function CouleurMFC(RG As Range, Optional Mode As Byte = 0) As Variant
     Dim e As Long, i As Byte, LoTest As Boolean
     Dim LoMFC As FormatCondition
    ' Application.Volatile
     'boucle sur le nombre de condition(s)
     'Si pas de MFC .FormatConditions.Count renvoi 0
     For i = 1 To RG.FormatConditions.Count
      Set LoMFC = RG.FormatConditions(i)
      Select Case LoMFC.Type
          Case xlCellValue
            'tester le type de la formule entrée
                Select Case LoMFC.Operator
                    Case xlEqual
                         LoTest = RG = Evaluate(LoMFC.Formula1)
                    Case xlNotEqual
                         LoTest = RG <> Evaluate(LoMFC.Formula1)
                    Case xlGreater
                         LoTest = RG > Evaluate(LoMFC.Formula1)
                    Case xlGreaterEqual
                         LoTest = RG >= Evaluate(LoMFC.Formula1)
                    Case xlLess
                         LoTest = RG < Evaluate(LoMFC.Formula1)
                    Case xlLessEqual
                         LoTest = RG <= Evaluate(LoMFC.Formula1)
                    Case xlNotBetween
                         LoTest = (RG < Evaluate(LoMFC.Formula1) Or RG > Evaluate(LoMFC.Formula2))
                    Case xlBetween
                         LoTest = (RG >= Evaluate(LoMFC.Formula1)) And (RG <= Evaluate(LoMFC.Formula2))
                End Select
     
         Case xlExpression ' La formule est
            For col = 1 To 255
                If Cells(1, col) = "" Then Exit For
            Next
     
            If Cells(1, col) = "" Then
                Cells(1, col).FormulaLocal = LoMFC.Formula1
                LoTest = Evaluate(Cells(1, col).Formula)
            Debug.Print LoTest
                Cells(1, col).ClearContents
            End If
        End Select
     
        If LoTest Then
          'Peu ajouter d'autre format si nécessaire,
            'comme la bordure, la police etc..
          Select Case Mode
            Case 0
               CouleurMFC = LoMFC.Interior.ColorIndex
            Case 1
               CouleurMFC = LoMFC.Interior.Color
          End Select
          Exit Function
        End If
     
     Next i
     CouleurMFC = 0
    End Function

  20. #20
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je t'envoie ce code qui fonctionne sans erreur mais qui doit je pense encore être retravaillé au niveau du retour de la valeur quand il s'agit du mode 2.
    Je n'ai pas le temps ce matin d'y travailler. Vois ce que tu peux en faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Public Function CouleurMFC(RG As Range, Optional Mode As Byte = 0) As Variant
     Dim e As Long, i As Byte, LoTest As Boolean
     Dim LoMFC As FormatCondition
     ' Dim formule As String
     ' Application.Volatile
     'boucle sur le nombre de condition(s)
     'Si pas de MFC .FormatConditions.Count renvoi 0
     For i = 1 To RG.FormatConditions.Count
       Set LoMFC = RG.FormatConditions(i)
       Select Case LoMFC.Type
         Case xlCellValue ' La valeur de la Cellule est
           ' Tester le type de la formule entrée
           Select Case LoMFC.Operator
             Case xlEqual
                  LoTest = RG = Evaluate(LoMFC.Formula1)
             Case xlNotEqual
                  LoTest = RG <> Evaluate(LoMFC.Formula1)
             Case xlGreater
                  LoTest = RG > Evaluate(LoMFC.Formula1)
             Case xlGreaterEqual
                  LoTest = RG >= Evaluate(LoMFC.Formula1)
             Case xlLess
                  LoTest = RG < Evaluate(LoMFC.Formula1)
             Case xlLessEqual
                  LoTest = RG <= Evaluate(LoMFC.Formula1)
             Case xlNotBetween
                  LoTest = (RG < Evaluate(LoMFC.Formula1) Or RG > Evaluate(LoMFC.Formula2))
             Case xlBetween
                  LoTest = (RG >= Evaluate(LoMFC.Formula1)) And (RG <= Evaluate(LoMFC.Formula2))
           End Select
        Case xlExpression ' La formule est
          Range("paramMFC").FormulaLocal = LoMFC.Formula1
          LoTest = Evaluate(Range("paramMFC").Formula)
          Range("paramMFC").ClearContents
          ' Debug.Print LoTest
       End Select
     Next i
     If LoTest Then
         'Peu ajouter d'autre format si nécessaire,
         'comme la bordure, la police etc..
         Select Case Mode
           Case 0
              CouleurMFC = LoMFC.Interior.ColorIndex
           Case 1
              CouleurMFC = LoMFC.Interior.Color
         End Select
       Else
         CouleurMFC = 0
     End If
    End Function
    Sub TestColor()
     MsgBox CouleurMFC(Range("c2"), 2)
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [VB6] Dependency Walker - Voir les paramètres des fonctions
    Par snoopy69 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/02/2009, 13h34
  2. API pour exploiter les informations des fichiers MANIFEST.MF ?
    Par darkmath dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 15/08/2008, 13h53
  3. Récuperer les paramètres des procédures
    Par weed dans le forum Oracle
    Réponses: 4
    Dernier message: 15/05/2008, 22h40
  4. Cacher les paramètres des liens
    Par DarkWark dans le forum Struts 1
    Réponses: 8
    Dernier message: 31/01/2007, 18h06
  5. Lister les paramètres des procédures d'un schéma
    Par raoulbranche dans le forum Oracle
    Réponses: 4
    Dernier message: 20/09/2006, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo