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 :

Créer une fonction


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    voila j'ai un petit problème, je maitrise pas trop mal les macros maintenant grâce à ce titre... mais je me lance maintenant dans les fonctions.

    J'en ai créé une qui ne fonctionne pas du tout et je ne comprends pas pourquoi.
    Enfin, je pense qu'il y a un problème de type de donnée mais je ne suis pas sûre.

    Voila ce que je veux faire!
    L'argument de ma fonction Ep est une cellule.
    La fonction doit regarder le contenu de la cellule et en fonction de son contenu, elle doit afficher dans la case une lettre "A", "B"...

    Voici mon code, pouvez vous me dire si vous avez une idée du pourquoi du comment faire cela.

    Je vous remercie,
    bonne journée,

    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
    Function etiquetteDPE(Ep As Range)
     
    etiquetteDPE = ""
    MsgBox etiquetteDPE
     
    If Ep.Value <= 80 Then
    etiquetteDPE = "A"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 10
    End If
     
    If Ep.Value <= 120 And Ep.Value > 80 Then
    etiquetteDPE = "B"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 50
    End If
     
    If Ep.Value <= 180 And Ep.Value > 120 Then
    etiquetteDPE = "C"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 43
    End If
     
    If Ep.Value <= 230 And Ep.Value > 180 Then
    etiquetteDPE = "D"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 44
    End If
     
    If Ep.Value <= 330 And Ep.Value > 230 Then
    etiquetteDPE = "E"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 45
    End If
     
    If Ep.Value <= 450 And Ep.Value > 330 Then
    etiquetteDPE = "F"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 46
    End If
     
    If Ep.Value > 450 Then
    etiquetteDPE = "G"
    Ep.Select
    ActiveCell.Interior.ColorIndex = 3
    End If
     
     
     
    End Function
    PS: je voulais également mettre la cellule en couleur suivant le contenue de EP!

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut Fonction
    Bonjour,

    Ta Msgbox est située en début de fonction.
    Il est normal qu'elle ne te retourne aucun élément.

    2 remarques quant au code

    1- Ces p.. dene servent à rien
    2 - Plutôt que d'utiliser une succession de méthodes , mieux vaut utiliser la méthode

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  3. #3
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut FONCTION
    Salut,

    Un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub essaifnct()
    etiquetteDPE2 (Sheets(1).Range("C10"))
    End Sub
    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
    Function etiquetteDPE2(Ep As Range) As String
     
    Dim chaine As String
    Dim couleur As Byte
     
    With Ep
     
            Select Case .Value
     
                    Case Is <= 80
     
                            chaine = "A"
                            couleur = 10
     
                    Case Is <= 120
     
                            chaine = "B"
                            couleur = 50
     
                    Case Is <= 180
     
                            chaine = "C"
                            couleur = 43
     
                    Case Is <= 230
     
                            chaine = "D"
                            couleur = 44
     
                    Case Is <= 330
     
                            chaine = "E"
                            couleur = 45
     
                    Case Is <= 450
     
                            chaine = "F"
                            couleur = 46
     
                    Case Else
     
                            chaine = "G"
                            couleur = 3
     
            End Select
     
            .Interior.ColorIndex = couleur
     
    End With
     
    etiquetteDPE2 = chaine
    MsgBox etiquetteDPE2
     
    End Function
    Tu remarqueras que je n'ai pas rappelé la valeur inférieure pour chaque occurence. C'est la nature même de la méthode de s'arrêter à la première condition vraie codée.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  4. #4
    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 865
    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 865
    Points : 28 796
    Points
    28 796
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'en ai créé une qui ne fonctionne pas du tout et je ne comprends pas pourquoi.
    Il serait intéressant d'être plus explicite quant à la raison du non-fonctionnement de la fonction.
    Est-ce qu'elle renvoie un résultat faux ou une erreur ?
    Dans ce dernier cas, un numéro d'erreur et le n° de ligne où s'est déclenchée l'erreur est loin d'être inutile.
    Est-ce cette fonction doit être utilisée comme fonction personnalisée dans Excel ou simplement comme fonction invoquée depuis un code VBA ?
    Petites remarques
    Les Select, Selection sont à proscrire du code VBA
    J'utiliserais le Select Case plutôt que des SI
    L'initialisation de la variable en début de procédure est superflue
    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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    alors
    @ MarcelG :

    ok pour les "select", ils sont utils dans les macros donc je pensais que...

    je ne connais pas la méthode Select Case, mais je vais regarder!
    Justement, on dirait que l'éxécution ne rentre pas dans les "if"

    @ Philippe Tulliez:
    Cette fonction doit etre contenu dans une case dans une feuille excel
    Et en fait dans la cellule, j'ai un #VALEUR!

    Ok pour l'initialisation, je l'avais mis en faite pour ésseayer de savoir pourquoi cela ne fonctionnait pas. J'éspérais voir dans ma case la valeur ""!

    Et la MessBox avait pour seul but également de découvrir le problème!

    Voila voila, j'éspére avoir été plus clair.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    alors j'ai modifié le code sous vos conseils (voir ci dessous).


    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
    Function etiquetteDPE(Ep As Range)
     
    Select Case Ep.Value
     
    Case Ep.Value <= 80
    etiquetteDPE = "A"
    Ep.Interior.ColorIndex = 10
     
    Case Ep.Value <= 120 And Ep.Value > 80
    etiquetteDPE = "B"
    Ep.Interior.ColorIndex = 50
     
     
    Case Ep.Value <= 180 And Ep.Value > 120
    etiquetteDPE = "C"
    Ep.Interior.ColorIndex = 43
     
     
    Case Ep.Value <= 230 And Ep.Value > 180
    etiquetteDPE = "D"
    Ep.Interior.ColorIndex = 44
     
     
    Case Ep.Value <= 330 And Ep.Value > 230
    etiquetteDPE = "E"
    Ep.Interior.ColorIndex = 45
     
     
    Case Ep.Value <= 450 And Ep.Value > 330
    etiquetteDPE = "F"
    Ep.Interior.ColorIndex = 46
     
     
    Case Ep.Value > 450
    etiquetteDPE = "G"
    Ep.Interior.ColorIndex = 3
     
    End Select
     
     
    End Function
    Maintenant, j'ai un "0" dans ma case.
    J'ai essayé d'ajouter un :
    etiquetteDPE = "A"
    et cela fonctionne, donc je pense que le problème est au niveau de mon select case.

    Je pense que l'écriture n'est pas très bonne, je pense qu'il faut écrire la chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Case Is <= 80
    etiquetteDPE = "A"
    Ep.Interior.ColorIndex = 10
    mais comment y intégrer un "And" ou un "or" dans la condition.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup EngueEngue,

    je n'avais pas vu ta réponse avant de poster!
    C'est parfait ça fonctionne!
    Bonne journée,

  8. #8
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut Félix,

    As-tu testé le code sans appeler la valeur imédiatement inférieure; autrement dit ma dernière remarque?

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  9. #9
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Hello, plus un formatage conditionnel sur la case où tu mets la fonction..

    Une fonction ne peut pas changer la mise en forme d'une cellule, si tu veux le faire tu devras passer par un sub.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function etiquetteDPE(Ep As Range) As String
     
    Select Case Ep.Value
    Case Is <= 80
    etiquetteDPE = "A"
    Case 80.000001 To 120
    etiquetteDPE = "B"
    Case 120.000001 To 180
    etiquetteDPE = "C"
    Case Else
    etiquetteDPE = "D"
    End Select
     
    End Function

  10. #10
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut créé une fonction
    Bonsoir Felixismad,

    Souviens-toi que tu n'es pas seul et que d'autres personnes, qui même si elles ne s’immiscent pas dans la discussion faute de connaissances, peuvent être néanmoins intéressées par le sujet.

    je regrette :
    -que tu n'aies pas cru utile de joindre ton code finalisé à ta conclusion un peu brutale avec éventuellement quelques explications sur ce que tu as retenu.
    -que tu n'aies pas laissé aller à son terme un débat fort intéressant sur les limites d'une function.

    je reste sur ma faim.

    cordialement.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjours,

    Je suis tombé un peu par hasard sur ce sujet hier soir en parcourant le forum moi aussi un peu comme NVCfrm.

    Il est possible de modifier la couleur depuis la feuille, mais il ne faut pas sélectionner la barre de formule puis faire Entrer tout simplement mais lancer le calcul/formule depuis le fx à coté du Ok (Entrer).

    Puisqu'une erreur est créer, une gestion d'erreur suffit à remettre la bonne valeur dans la cellule. Ça reste du bidouillage aussi, mais c'est vraiment uniquement pour donner une méthode fonctionnant depuis une feuille que je met ce message.


    P.S.: A mon avis, ça a un rapport avec les thread. Si on lance une procédure et qu'on accède à la barre de formule, Excel peut soit arrêter la procédure en cours de route (c'est plutôt bien) ou soit planter (pas terrible). Je pense que c'est la raison pour laquel on ne peut pas être à la fois dans la barre de formule et simultanément lancer une procédure qui ferait potentiellement planter Excel. Enfin, c'est mon hypothèse disons.
    Si j'utilise un API même en simple threading et que j'accède à un object de la feuille comme un bouton CommandButton par clique gauche ou à la barre de formule, ça plante. Mais sans API, dans le meilleur des cas, par sécurité, la procédure s'arrêterai simplement pour pouvoir ensuite accèder à la barre de formule ou autre.
    Microsoft n'a très certainement pas voulu donner la possibilité de faire planter Excel, surtout que Excel est super stable de base lorsqu'il est utilisé sans VBA et surtout sans API.
    -------------------------------------------------------------------------------------------------------------------

    Citation Envoyé par nibledispo Voir le message
    Bonsoir Felixismad,

    Souviens-toi que tu n'es pas seul et que d'autres personnes, qui même si elles ne s’immiscent pas dans la discussion faute de connaissances, peuvent être néanmoins intéressées par le sujet.

    je regrette :
    -que tu n'aies pas cru utile de joindre ton code finalisé à ta conclusion un peu brutale avec éventuellement quelques explications sur ce que tu as retenu.
    -que tu n'aies pas laissé aller à son terme un débat fort intéressant sur les limites d'une function.

    je reste sur ma faim.

    cordialement.
    +1,
    C'est moyen de prendre sans donner.
    Dernière modification par Invité ; 16/08/2013 à 08h18.

  12. #12
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut créé une fonction
    Bonjour nouveau2,

    Il me semble que lorsqu'on reçoit, la moindre des corrections vis à vis de ce qui ont donné est de finaliser le post avec la solution retenue.
    En la circonstance c'est felixismad qui à reçu et non moi.

    Je n'interviens que si je sais ou crois savoir. Ce qui serait moyen serait de donner n'importe quoi uniquement pour faire l'intelligent.

    Toi aussi tu as reçu de tes profs: Que leur as-tu donné d'autre en retour que ta considération ?

    cordialement.

  13. #13
    Invité
    Invité(e)
    Par défaut
    En la circonstance c'est felixismad qui à reçu et non moi.
    Je sais bien, sinon, je ne t'aurais mis +1, mais plutôt -1.

    C'est aussi pour ça que j'ai répondu en donnant une solution partielle pour toi mais aussi pour les autres (ceux qui aurai peut être aimer voir une solution).

    Sinon, pour le reste, je n'ai pas compris.


    --------------------------------------------------------------------------------------------------

    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
    Function etiquetteDPE2v2(ByVal Ep As Range) As String
     
    Dim chaine As String
    Dim Couleur As Byte
     
    With Ep
     
            Select Case .Value
     
                    Case Is <= 80
     
                            chaine = "A"
                            Couleur = 10
     
                    Case Is <= 120
     
                            chaine = "B"
                            Couleur = 50
     
                    Case Is <= 180
     
                            chaine = "C"
                            Couleur = 43
     
                    Case Is <= 230
     
                            chaine = "D"
                            Couleur = 44
     
                    Case Is <= 330
     
                            chaine = "E"
                            Couleur = 45
     
                    Case Is <= 450
     
                            chaine = "F"
                            Couleur = 46
     
                    Case Else
     
                            chaine = "G"
                            Couleur = 3
     
            End Select
     
    End With
     
    On Error GoTo GestionErreur
    etiquetteDPE2v2 = chaine
    Call Coulv2(Ep, Couleur)
     
    GestionErreur:
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Coulv2(Ep As Range, Couleur As Byte)
    Ep.Interior.ColorIndex = Couleur
    End Sub
    En appuyant sur fx plutôt que sur Enter, normalement, ça devrai marcher. J'ai repris le programme de MarcelG, mais avec les autres fonctions, il n'y a pas de raison que ça ne marche pas.
    Donc c'est pas vraiment LA solution puisqu'il ne faut pas être dans la barre de formule quand la Macro tourne (le fx désélectionne temporairement la barre de formule).
    Dernière modification par Invité ; 16/08/2013 à 13h15.

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

Discussions similaires

  1. Créer une fonction
    Par Jeffboj dans le forum Access
    Réponses: 7
    Dernier message: 15/04/2006, 20h49
  2. Créer une Fonction recherche sur Access
    Par remwideco dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2006, 10h36
  3. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  4. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

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