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 vba utilisant Case


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut fonction vba utilisant Case
    Bonjour,
    J'ai un souci avec la fonction ci-dessous qui compare la valeur d'une cellule à un barème, et insère un coefficient dans une autre cellule selon les cas.
    Je dois etre à coté de la solution, mais je ne la vois pas. Merci d'avance du coup de main.

    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
    Public Function PL(ByVal target As Range) As Variant
        Application.Volatile
        PL = target.Value
        Select Case PL
        Case 0 To 1000000
        ActiveCell.Value = 1
        Case 1000000 To 1500000
        ActiveCell.Value = 1.2
        Case 1000000 To 1500000
        ActiveCell.Value = 1.3
        Case 1500000 To 2000000
        ActiveCell.Value = 1.4
        Case 2000000 To 2500000
        ActiveCell.Value = 1.5
        Case 2500000 To 3000000
        ActiveCell.Value = 1.6
        Case 3500000 To 4000000
        ActiveCell.Value = 1.7
        Case 4000000 To 4500000
        ActiveCell.Value = 1.8
        Case 4500000 To 5000000
        ActiveCell.Value = 1.9
        Case Else
        ActiveCell.Value = 2
        End Select
    End Function

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    regarde du côté de la différence entre procédure et fonction.

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonsoir,

    Etrange fonction ...
    Si tu veux une aide éclairée, il va falloir que tu nous éclaires !
    1) d'où appelles-tu cette fonction et comment l'appelles-tu ?
    2) que doit-elle modifier

    Sois le plus précis possible, sans omettre de détails.

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci, et désolé de ne pas avoir été assez clair.
    C'est une application de barème et voici l'explication
    Nous avons de A1 à A7 des valeurs numériques allant de 0 à 5 000 000.
    Je compare ces valeurs une à une à un barème progressif en tranches (0 à 1000 000, de 1 000 000 à 1 500 000, etc jusquà une limite de 5 000 000, puis une tranche supérieure "au dessus de 5 000 000", soit en tout 10 tranches.

    Ma fonction barème saisit la valeur de A1 comme argument, la classe par rapport aux tranches du barème, et insère dans la cellule active C1, un coefficient, qui va être utilisé dans dautres calculs.
    je désire obtenir de C1 à C7 ces coefficients.
    Donc, la fonction est dans C1, l'argument est dans A1, le barème est fixe.
    Vraiment merci.

    Addendum:
    Je commence donc le code par la saisie de mon argument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function PL(ByVal target As Range) As Variant
        Application.Volatile
        PL = target.Value
    Ce code fonctionne correctement si je l'utilise dans un module séparé (en rajoutant End Function bien sur)
    Je crois que cela "coince" au moment ou je déclare cette variable
    pour l'utiliser dans la partie "case" du code.

    Cordialement,

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bon...
    Si je comprends bien tes explications :
    Tu te sers de cette fonction personnalisée en l'utilisant comme formule dans chacune des cellules Cx à Cy et cette fonction doit donner à ces cellules (Cn) Cx à Cy une valeur en fonction du contenu de la cellule de même rang en colonne A (An, donc)
    Elle doit alors être appelée en lui passant comme paramètre le contenu (typé convenablement) de la cellule An et elle doit retourner à la cellule où se trouve ta formule le résultat (typé un peu plus précisément que Variant !) de ton select Case...
    Je vais te laisser travailler seuil avec ces indications, en me contentant de te guider ainsi uniquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function PL(titi as .........) As ......' (autre chose que Variant)
        Application.Volatile
       ....
        Select Case titi
          Case 0 To 1000000
            PL= 1
        Case 1000000 To 1500000
           PL=  1.2
        .....
     
     End Select
    End Function
    Voilà ... A toi, maintenant .

  6. #6
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    merci de ta réponse, ucfoutu,
    tu as parfaitement compris la démarche, sauf que la cellule à évaluer est sélectionnée par l'utilisateur.
    Je bute précisément sur un problème de syntaxe que tu me proposes de résoudre seul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function Levier() As Integer
    Set PL = Selection
        Select Case PL
        Case 0 To 1000000
        ActiveCell.Value = 1
        Case 1000000 To 1500000
    j'ai essayé cette version,(sans argument, puisque je désire sélectionner nimporte quelle cellule), et ne sais pas ensuite comment passer la valeur de la selection vers la calcul de case. cela ne s'invente pas, et comem je ne suis pas programmeur, je vais essayer de trouver ce détail de syntaxe dans des exemples VBA.
    merci quand même

  7. #7
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Bonjour,
    Un petit cours d'algorithmique. une fonction recoi des argument et renvoie une valeur.
    En math la fonction
    f(x)=2*x+3
    f(3) renvoie 9
    ta fonction ne renvoie aucune valeur! Ce n'est pas une fonction. alors soit tu change ca et tu en fait une procédure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub PL(ByVal target As Range)
    soit tuécoute le monsieur et tu utilise ta fonction pour renvoyer une valeur

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Re...
    tu as parfaitement compris la démarche, sauf que la cellule à évaluer est sélectionnée par l'utilisateur.
    La question est donc :
    Comment (par quels gestes précis)
    se fait cette sélection par l'utilisateur ? En allant simplement dans la cellule ? Autrement (et comment ?)
    A partir de cette réponse ===>>> tout est simple (et avec une vraie fonction )

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    bon, je suis arrivé la. j'ai un résultat, mais il est bloqué à 1 (le 1er coeff), si je teste par exemple 2700 000, je devrais obtenir 1.5, mais la fonction affiche 1.
    c'est peut etre un pb de décimale ou autre chose
    pourriez vous m'éclairer ?
    en tout cas j'y suis presque
    merci de vos précieux conseils

    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
    Sub test2()
    y = Coeff(Range("c30"))
    End Sub
     
    Public Function Coeff(ByVal target As Range) As Double
    Application.Volatile
    Dim dummy As Double
    dummy = target.Value
    Select Case Coeff
        Case Is > 0 < 1000000
            Coeff = 1
        Case 1000001 To 1500000
            Coeff = 1.2
        Case 1500001 To 2000000
            Coeff = 1.3
        Case 2000001 To 2500000
            Coeff = 1.4
         Case 2500001 To 3000000
            Coeff = 1.5
       Case 3500001 To 4000000
            Coeff = 1.6
        Case 4000001 To 4500000
            Coeff = 1.7
        Case 4500001 To 5000000
            Coeff = 1.8
        Case Else
            Coeff = 2
    End Select
    End Function

  10. #10
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    heuessaye le mode pas a pas pour lancer ta macro et reagrde la valeur de tes variables

    quand tu fais
    coeff n'as aucune valeur, comment il pourrais donner autre chose que 0??
    tu ne choisie pas ton select case sur la bonne info
    au hasar et sans réfléchir je mettrais ta variable d'entrée

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Bonjour tout le monde.
    Juste une petite erreur (étouderie?):
    Select Case dummy et pas Coef !
    Cdlt

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Généralement, quand on a un pb de format de données, c'est dans le menu "Format" que "ça" se passe
    Ex pour la colonne E
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Columns("E:E").NumberFormat = "0.0"
    Mais si c'est un entier tu auras un zéro après la virgule.
    Vérifie aussi ta déclaration de variable. Ce doit être un double.

  13. #13
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    merci à tous,
    le pb est réglé
    j'ai remplacé par dummy et...tout marche
    bonne continuation

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, daniel9275,

    Quelque chose me titille et je t'en parle donc à tout hasard...
    L'examen de tes Cases dans le select me donne à penser que tu vas de tranche de 500000 en tranche de 500000 et qu'il n'est alors pas impossible de ta tranche la plus basse acceptable ne commence pas à 0 mais à 500001. Idem en ce qui concerne la plus haute, dont la limite acceptable paraîtrait alors être 5500000 ...

    Si (et seulement si) tel était le cas, il serait prudent de modifier ainsi ton select case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim coeff As Double
      Select Case dummy
        Case 500001 To 5500000
           coeff = ((10 - (5500000 - dummy) \ 500000) + 10) / 10
        Case Else
           MsgBox "erreur probable de saisie"
       End Select
       If coeff > 0 Then MsgBox coeff  ' là uniquement pour tes essais (pour que tu voies mieux
    Si, par contre, tes tranches ne sont pas celles que j'ai cru deviner, laisse tomber le présent code...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/09/2009, 15h38
  2. [XL-2003] Utiliser une fonction VBA dans une cellule
    Par zakuli dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/08/2009, 19h23
  3. [VBA]Utiliser les fonctions Excel avec Access
    Par PsykotropyK dans le forum VBA Access
    Réponses: 8
    Dernier message: 18/04/2007, 13h58
  4. Réponses: 1
    Dernier message: 18/07/2006, 23h38
  5. Réponses: 8
    Dernier message: 29/06/2006, 15h37

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