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 :

Mise en forme conditionnelle avec appel de fonction personnalisée


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut Mise en forme conditionnelle avec appel de fonction personnalisée
    bonjour,
    j' ai besoin de faire sur un ensemble de cellule une mise en forme personnalisé, dont les conditions initiales dépendent d'un programme ou d'une fonction,
    je veux le faire par macro:

    code si je le fais par "Mise en forme conditionnelle"

    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
     
    Set zone = Range(Cells(2, 2), Cells(10, 10))
     
    With zone
        .FormatConditions.Delete
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="0"
        .FormatConditions(1).Interior.ColorIndex = 15
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
            Formula1:="0", Formula2:="40"
        .FormatConditions(2).Interior.ColorIndex = 8
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _
            Formula1:="40"
        .FormatConditions(3).Interior.ColorIndex = 3
    End With
    "Type:=xlCellValue" cette valeur là je veux qu'elle dépende d'un programme qui recalcule la valeur de condition en fonction d'autres critéres

    exemple simple, mais ma fonction sera plus complexe,

    la valeur lue de la cellule est ajoutée à la valeur d'autres cellules (dont l'adresse est variable) et c'est le résultat de ce calcul qui détermine la couleur de la cellule.

    je pense au code :


    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
     
    function deter(n)
     
    deter = cells(x,y) + cells(f,t)
     
    end function
     
    sub monprog
     
    With zone
        .FormatConditions.Delete
        .FormatConditions.Add Type:=deter(xlCellValue), Operator:=xlEqual, _
            Formula1:="0"
     
    end sub

    mais ce ne marche pas , le code plante

    est ce que ma démarche est valables ?

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    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 : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu voudrais passer la valeur de l'addition de deux cellules à l'argument Type
    As-tu consulté l'aide en ligne pour au moins connaître ce que chaque argument représente.
    Type Obligatoire XlFormatConditionType Indique si le format conditionnel repose sur la valeur d'une cellule ou une expression.
    Ta fonction Deter reçoit comme argument la constante xlCellValue qui vaut 1 et ne changera pas puisque c'est une constante donc parfaitement inutile et de plus tu fais un calcul de cellules dont les lignes et colonnes sont alimentées par des variables non attribuées.
    Je pense qu'il serait préférable que tu commences par lire un bon tutoriel sur comment programmer en VBA
    D'après ce que je devine du peu d'explications que tu donnes sur le résultat attendu, ce sont plutôt les arguments Formula1 et Formula2 qui devraient être modifiés;
    Voir l'aide en ligne
    Formula1 Facultatif Variante Valeur ou expression associée au format conditionnel. Il peut s'agir d'une valeur constante, d'une chaîne, d'une référence de cellule ou d'une formule.
    Formula2 Facultatif Variante Valeur ou expression associée à la deuxième partie du format conditionnel lorsque l'argument Opérateur est xlBetween ou xlNotBetween (sinon, cet argument est ignoré). Il peut s'agir d'une valeur constante, d'une chaîne, d'une référence de cellule ou d'une formule.

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    Merci Philippe de regarder mon pb

    j'ai bien sûr regardé l'aide en ligne mais elle ne me dit rien sur mon projet.

    j' ai beaucoup simplifié le code pour être plus lisible dans ce forum
    bien sûr qu'en normal mes variables vont être affectées, mais ce n'est pas le pb,

    je ne suis pas vraiment débutant en vba.

    "ce sont plutôt les arguments Formula1 et Formula2 qui devraient être modifiés;"

    je ne crois pas car ce sont les consignes de comparaison, moi c'est bien la valeur à comparer que je veux calculer dans ma fonction "deter".

    je ne sais pas encore si j'utilise la bonne méthode, mais ce que veux mon client c'est qu'il puisse entrer une valeur dans une cellule et que la couleur lui indique qu'il est bien dans le bon ensemble de définition du domaine, ce domaine dépend de plein de paramètres qui sont calculés ailleurs.

    bien sur si je fais un bouton qui lance le bon programme ca serait facile
    mais mon client n'en veut pas.
    il veut simplement rentrer les valeurs qu'il a choisies jusqu'à que ça devienne vert.

    donc si tu as bien compris et que tu connais la bonne méthode c'est sympa de me la donner

  4. #4
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonjour Patnel

    l'expression:
    .FormatConditions.Add Type:=deter(xlCellValue)....
    fonctionne t-elle ?
    Je croyais que pour ce type de définition c'est la constante 2 ou xlExpression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .FormatConditions.Add Type:=xlExpression
    l'expression formula alors est une expression qui evalue la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .FormatConditions.Add Type:=xlExpression, Formula1:="=deter=0"
    @Philippe
    Bonjour
    je me souviens n'avoir pas encore mis à jour mon profil pour le prenom. c'est Ousmane

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    merci ousmane

    voilà que le code que j'ai écrit eb tenant compte de tes consignes


    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
     
     
    Sub allez()
    Set zone = Range(Cells(2, 2), Cells(10, 10))
     
    With zone
        .FormatConditions.Delete
        .FormatConditions.Add Type:=xlExpression, Operator:=xlEqual, _
            Formula1:="=deter=0"
        .FormatConditions(1).Interior.ColorIndex = 15
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
            Formula1:="=deter=0", Formula2:="=deter=40"
        .FormatConditions(2).Interior.ColorIndex = 8
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _
            Formula1:="=deter=45"
        .FormatConditions(3).Interior.ColorIndex = 3
     
     
    End With
     
    End Sub
    ça ne plante pas mais ça ne fait pas ce que je veux, ça fait rien
    en fait ce n'est pas sur les butées que je veux jouer mais sur la valeur de la cellule où je rentre une donnée.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    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 : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    j'ai bien sûr regardé l'aide en ligne mais elle ne me dit rien sur mon projet.
    Il est rare qu'une aide en ligne t'apporte une réponse sur ton projet.
    L'aide décrit la syntaxe, explique ce que chaque argument signifie, ce que la procédure renvoie comme valeur s'il s'agit d'une fonction et avec un peu de chance il y a un ou deux exemples succincts.
    je ne sais pas encore si j'utilise la bonne méthode, mais ce que veux mon client c'est qu'il puisse entrer une valeur dans une cellule et que la couleur lui indique qu'il est bien dans le bon ensemble de définition du domaine, ce domaine dépend de plein de paramètres qui sont calculés ailleurs.
    Tu n'expliques pas vraiment ce que tu aimerais avoir comme résultat. Je trouve ton explication nébuleuse (plein de paramètres qui sont calculés ailleurs ???).
    Si tu souhaites avoir une réponse pertinente il faut expliquer clairement ce que tu souhaites obtenir comme résultat en donnant un exemple de ce que l'utilisateur peut entrer comme valeur et comment le programme doit se comporter suite à cette valeur.

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    merci Philippe de tes conseils,
    j'essaie d'aller au plus prêt du but l'important n'est pas de savoir de quels paramètres dépend ma condition mais que ces paramètres sont dans d'autres feuilles et que la formule est compliquée et confidentielle, elle n'a aucun intérêt ici,

    il faut que j'arrive à introduire une fonction qui prend en compte la valeur de la cellule au travers de ma fonction.dans une mise en forma conditionnelle et c'est ça le but de ma question.

    je vais essayé de faire autrement en utilisant les propriétés de
    Worksheet_Change(ByVal Target As Excel.Range)

    qui va me permettre je crois de prendre en compte la valeur d'une cellule au moment où je la fais évoluer, en espérant que cette méthode fonctionne aussi bien en 2010 qu'en 2000-2003, et qu'elle ne me provoque pas de boucles infinies
    si je dois changer de couleur de cellule.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    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 : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Parfait alors.
    Je ne doute pas que tu auras une réponse mais moi je n'y vois pas clair.

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    bon cette fois je pense avoir compris

    mon erreur de raisonnement vient bien du fait que je cherche à évaluer la valeur de ma cellule au regard d'une fonction
    et en fait ce qu'attend la mise en forme conditionnelle c'est un booléen, et ça je ne l'avais pas compris.

    il faudrait donc faire des fonctions qui renvoient vrai ou faux pour chaque condition.
    et dans ce cas je pense que le code d'Ousmane va fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .FormatConditions.Add Type:=xlExpression, Operator:=xlEqual, _
            Formula1:="=deter=0"
        .FormatConditions(1).Interior.ColorIndex = 15
    où deter renvoie Vrai ou faux,
    il va falloir fire 3 fonctions suivant les cas que je veux déterminer.

    je n'ai pas encore essayé, mais je pense être dans la bonne direction

    par contre en utilisant
    Worksheet_Change(ByVal Target As Excel.Range)

    je peux faire ce que je veux
    ça marche à 90%, parce que le calcul ne se fait pas instantanément.
    par contre c'est plus facile à manipuler
    mais il ne faut surtout pas faire de select dans le code.

    je clos cette discussion pour ne pas donner des boutons aux administrateurs que je salue respectueusement et qui font tout pour que ce forum continue

    merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Mise en forme conditionnelle avec Date et fonction AUJOURDHUI()
    Par ghisunit dans le forum Excel
    Réponses: 2
    Dernier message: 29/04/2011, 21h46
  2. [E-03] : Mise en forme conditionnelle avec 5 choix
    Par basto dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/10/2008, 12h40
  3. mise en forme conditionnelle avec date
    Par jeff192 dans le forum Excel
    Réponses: 1
    Dernier message: 20/03/2008, 16h08
  4. Mise en forme conditionnelle avec Access 97
    Par soso78 dans le forum IHM
    Réponses: 4
    Dernier message: 22/11/2007, 20h25
  5. Réponses: 4
    Dernier message: 29/03/2007, 09h10

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