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 :

fonction personnelle pouvant différencier une cellule vide d'une valeur 0 [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Mike924
    Homme Profil pro
    bénévole association
    Inscrit en
    Juin 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : bénévole association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2016
    Messages : 21
    Par défaut fonction personnelle pouvant différencier une cellule vide d'une valeur 0
    Bonjour à tous
    Je suis en train de travailler sur un programme de classement basé sur des feuilles Excel.
    Les concurrents doivent pointer à un temps de passage idéal.
    - Soit ils pointent en avance => pénalité "A" selon avance par ex: A x minutes d'avance
    - Soit ils pointent à l'heure => pénalités= 0
    - Soit ils pointent en retard => pénalité "B" (différente de "A") par ex: B x minutes de retard
    - Soit ils ne pointent pas => pénalité "C" (forfaitaire)
    - Soit ils pointent au delà d'un temps limite => pénalité forfaitaire "D"

    Dans mon tableau Excel, j'ai ma feuille de pointage qui me donne directement la colonne avec les écarts / temps idéal. Dans cette colonne, j'ai donc des cellules vides (pas de temps relevé) et des cellules contenant la valeur zéro (pointage au temps idéal).
    Pour éviter de me retrouver avec des formules conditionnelles redondantes si(...;..; si(...;...;si(... ;etc))), j'ai créé une fonction qui me permet selon la valeur de l'écart de calculer directement les pénalités mais la fonction ne fait pas la différence entre la cellule vide et la cellule avec 0.
    Peut-on faire la différence au sein de la fonction directement ?
    Merci d'avance de l'aide que vous pouvez m'apporter.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    IsEmpty(Range("A1") renvoi true si A1 est vide.
    Cordialement,

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    purement Excel, la fonction ESTVIDE() est l'équivalent

  4. #4
    Membre averti Avatar de Mike924
    Homme Profil pro
    bénévole association
    Inscrit en
    Juin 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : bénévole association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2016
    Messages : 21
    Par défaut
    Merci pour vos réponses, je suis d'accord dans le cas ou je gère la calcul directement dans la barre de formules mais je souhaiterais avoir une fonction complète qui calcule les pénalités automatiquement. Voilà ce que j'ai fait où X_ecart est la valeur de la cellule.

    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
     
    Function penalisation_regule(X_ecart, X_ecart_max, X_pensiavance, X_pensiretard, X_pen_noCR)
     
        'fonction de calcul de pénalisation de la régularité en fonction de l'écart/temps idéal
     
            Dim pénalités As Currency
     
                If X_ecart = "" Then                                   'si pas de pointage
                    penalisation_regule = X_pen_noCR
     
                ElseIf X_ecart < 0 And Abs(X_ecart) >= X_ecart_max Then 'si l'avance est supérieur au plafond
                    pénalités = X_pensiavance * X_ecart_max
                ElseIf X_ecart < 0 Then                                 'si avance
                    pénalités = X_ecart * X_pensiavance
                ElseIf X_ecart > X_ecart_max Then                       'si retard supérieur au plafond
                    pénalités = X_ecart_max
                ElseIf X_ecart >= 0 Then                                'si temps idéal ou retard
                    pénalités = X_ecart * X_pensiretard
                End If
            penalisation_regule = pénalités
     
    End Function
    Peut-être qu'avec ce code, vous comprendrez mieux le sens de ma question

  5. #5
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut
    Je viens de tester les cellules vides et les cellules avec ZERO, le problème vient surtout de faire une opération avec une cellule vide.
    Dans votre cas je pense qu'il suffit de tester en premier si la cellule est vide, rendre la pénalité et passer aux autres tests ensuite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
     
    Dim r As Range
     
    Set r = Range("B4")
    If r = "" Then pena = 20
      Else
      If r < [B5] Then pena = [A8] * (16 - r)
    ...
    Ce code fonctionne... mais je n'ai pas été plus loin

    Cordialement
    geogeo

    Je viens de voir votre message, il me semble qu'il faut passer en parametre la cellule (range) sinon il se peut que ce soit zero.

    Function penalisation_regule(X_ecart as range...)

    Je vais faire un essai

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    et oui si ton calcul est une formule même si il y a rien elle n'est pas vide donc empty ne marche pas
    il te faut mettre une condition "si" dans ta formule et donner un résultat vide a la négation
    après tu reste la value
    if cells(x,y)<>"" then....'tu fait ce que tu veux

    exemple
    en A1 je met =SI(B1+C1>0;B1+C1;"") au lieu de =B1+C1
    maintenanten vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [A1].value<>"" then ......
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut suite essai ...
    Il semble que ce soit votre problème, il vaut mieux typer vos paramètres, je vous joins un code qui fonctionne :
    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 essai()
    Dim r As Range
     
    Set r = Range("B4")
     
    If r = "" Then x = penalisation_regule(r) Else If r < [B5] Then pena = [A8] * (16 - r)
     
     
    End Sub
    Function penalisation_regule(X_ecart As Range)
     
        'fonction de calcul de pénalisation de la régularité en fonction de l'écart/temps idéal
     
            Dim pénalités As Currency
     
                If X_ecart = "" Then penalisation_regule = 10
     
     
     
     
    End Function
    cordialement
    geogeo

  8. #8
    Membre averti Avatar de Mike924
    Homme Profil pro
    bénévole association
    Inscrit en
    Juin 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : bénévole association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2016
    Messages : 21
    Par défaut
    Merci pour avoir mis vos neurones à contribution.
    Je n'arrive pas à faire le test de la cellule vide au sein de la fonction personnelle mais il faut dire que je suis un peu néophyte en programmation.

    Du coup, je m'en sors en testant la cellule au niveau de la formule de la cellule avant de faire appel à la fonction 'penalisation_regule'. Cela marche bien mais je trouve cela moins propre que ce que j'aurais espéré mais quand même beaucoup mieux que ce que faisait jusque là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(tab_calcul_EXP[[#Cette ligne];[écart_CR02]]="";pen_CR;penalisation_regule(tab_calcul_EXP[[#Cette ligne];[écart_CR02]];ecart_max;pen_av_CR;pen_ret_CR;))
    Mon idée était de simplifier la formule du tableau d'où ma question posée sur le forum.
    Nom : Capture.PNG
Affichages : 881
Taille : 4,4 Ko

    Comme il peut y avoir une centaine de concurrents et une trentaine de prises de temps (appelés CR dans mon tableau), ce tableau est vite assez complexe et il ne faut pas que j'oublie de condition au passage. Jusqu'à présent, je me contentait de tout passer par des formules conditionnelles imbriquées mais difficiles après de tout vérifier.
    Le fait de tout incorporer dans une fonction personnelle permet de limiter les risques d'erreur.

    Donc, l'objet du sujet n'est pour moi pas résolu.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If trim("" & X_ecart )= "" Then

  10. #10
    Membre averti Avatar de Mike924
    Homme Profil pro
    bénévole association
    Inscrit en
    Juin 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : bénévole association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2016
    Messages : 21
    Par défaut
    Que dire de plus que : BRAVO !
    Cela marche très bien. Je vais approfondir un peu la fonction Trim(). Je n'ai pas encore pigé exactement. Je vais faire des petits tests dans une feuille de calcul pour comprendre.
    Merci bien et je peux donc informer que la question est résolue !

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

Discussions similaires

  1. [XL-2010] Faire un tri en fonction d'une date ou d'une cellule vide
    Par Nono52 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/01/2015, 09h32
  2. Réponses: 3
    Dernier message: 04/07/2012, 13h24
  3. [XL-2000] Détection d'une cellule vide dans une ligne.
    Par babou41287 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/04/2012, 16h40
  4. créer une macro qui renvoie à une cellule vide
    Par cachou52fr dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 17/06/2011, 15h11
  5. différencier une cellule vide d'une cellule nulle
    Par schwarzy2 dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/09/2008, 14h50

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