Fonction vba excel

dani7777 Messages postés 2 Statut Membre -  
 dani7777 -
Bonjour,
J'ai un problème de syntaxe VBA pour une fonction.Cette fonction permet à l'utilisateur de sélectionner la valeur d'une case comme argument, et de comparer cette valeur à un barème en tranches. Pour chaque tranche, un facteur est désigné, qui est le résultat à afficher dans une autre case, celle dans laquelle la fonction est insérée.
Voici mon code:
Public Function Coeff (ByVal target As Range) As Number
Application.Volatile
Coeff = target.Value
Select Case Coeff
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
Je sais que j'ai fait une erreur de syntaxe dans les 3 premières lignes, et j'ai essayé plusieurs expressions, mais sans succès. Je ne sais ps comment passer la valeur de la case cible vers le calcul case.
merci infiniment de me donner un conseil.
dani
Configuration: Windows XP Internet Explorer 8.0

5 réponses

  1. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    Bonjour,
    Sans trop modifier ta macro....
    tu mélanges l'entrée et la sortie.... !!!!
    ce que je mets en gras représente le fond du problème.

    Public Function Coeff (ByVal target As Range) As double
    ' ici coeff renvoie un double un chiffre à virgule ...ce dont tu as besoin

    dim Poubelle as double
    poubelle=target.value
    ' tu testes poubelle
    puis
    coeff=... ' valeur de sortie après le passage dans select case
    et donc disparition de activecell.value
    puis
    end function
    mais pour que tu t'y retrouves
    .....

    Sub test2()
    
    y = Coeff(Range("c30"))
    End Sub
    
    Public Function Coeff(ByVal target As Range) As Double
    Application.Volatile
    Coeff = target.Value
    Select Case Coeff
        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
    0
  2. dani7777 Messages postés 2 Statut Membre
     
    grand merci bidouilleur !
    ton aide est appréciée,
    j'ai créé un module dans lequel j'ai copié la sub test2 et la fonction coeff. le module est accepté,
    et la fonction apparait dans le menu.
    mais j'obtiens un message de reference circulaire puis la cellule affiche #value quand je selectionne une cellule contenant une valeur numerique au hasard pour tester. ?
    j'ai coché puis décoché la case iteration dans le menu options au cas ou, mais ce n'est pas ça.
    Qu'en penses tu ? vraiment merci

    ps: est ce que je peux coder case < 1000000 au lieu de case 0 to 1000000 'our inclure des chiffres negatifs ?
    dani
    0
  3. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    au post 2 j'ai dis ... et tu n'as pas tout lu..

    puis
    coeff=... ' valeur de sortie après le passage dans select case
    et donc disparition de activecell.value
    puis
    end function


    la fonction marche comme ça

    Public Function Coeff(ByVal target As Range) As Double
    Application.Volatile
    Dim dummy As Double
    dummy = target.Value
    Select Case Coeff
        Case Is > 0 < 1000001 ' supérieure à 0 est inférieur à 100001
            Coeff = 1
        Case 1000000 To 1500000
            Coeff = 1.2
        Case 1000000 To 1500000
            Coeff = 1.3
        Case 1500000 To 2000000
            Coeff = 1.4
        Case 2000000 To 2500000
            Coeff = 1.5
        Case 2500000 To 3000000
            Coeff = 1.6
        Case 3500000 To 4000000
            Coeff = 1.7
        Case 4000000 To 4500000
            Coeff = 1.8
        Case 4500000 To 5000000
            Coeff = 1.9
        Case Else
            Coeff = 2
    End Select
    End Function
    0
    1. dani7777
       
      cette fois ci ça marche!, on y est presque mais le résultat est toujours 1, quelquesoit le chiffre testé.
      j'ai corrigé les montants pour qu'ils ne se mélangent pas
      j'ai compris de case me donne toujours le premier coeff.
      en testant 3 700 000 par exemple, je devrais avoir 1.6 mystere

      aurais tu la gentillesse de me préciser le role de sub test2 ? est ce que cela permet de récupérer l'argument
      de la cellule testée ou au contraire d'afficher le résultat dans la cellule de la fonction ?

      merci de ta patience...et de ton aide car je réalise que ces codes ne s'improvisent pas et sont un vrai métier

      Dani
      0
      1. dani7777 > dani7777
         
        oups, j'ai omis de mettre le code

        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
        0
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    ce n'est pas Select Case Coeff que tu veux mais Select Case Target.value
    il manque un séparateur dans Case Is > 0 < 1000000, et tu peux raccourcir un peu en utilisant <=

    Function Coeff(valeur As Double) As Double
        Select Case valeur
        Case Is <= 0
            Coeff = 0
        Case Is <= 1000000
            Coeff = 1
        Case Is <= 1500000
            Coeff = 1.2
        Case Is <= 2000000
            Coeff = 1.3
        Case Is <= 2500000
            Coeff = 1.4
        Case Is <= 3000000
            Coeff = 1.5
        Case Is <= 4000000
            Coeff = 1.6
        Case Is <= 4500000
            Coeff = 1.7
        Case Is <= 5000000
            Coeff = 1.8
        Case Else
            Coeff = 2
        End Select
    End Function

    eric

    PS: tes coeff ont changé entre ta 1ère et la dernière demande...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    c'est juste,
    j'avais pas vérifié tous les cas ça m'apprendra!!!

    mais ceci dit, personnellement je ne gèrerai pas cela dans la macro, car pour modifier il faut
    revenir dans la macro.

    Merci à eriic et à dani7777
    pour le suivi et promis la prochaine fois je teste : )
    0
    1. dani7777
       
      rien de tel que des neurones qui fonctionnent !
      merci à vous deux, c'est gentil, généreux et utile.

      une dernière chose pour clore cette discussion,

      Comment remplacer les chiffres des coefficients par une cellule ?
      et dans ce cas, la fonction recalcule t elle quand je change la valeur
      de la cellule ou dois je recompiler ?

      merci
      bon après midi

      Dani
      0
      1. pou pouille Messages postés 212 Statut Membre 31 > dani7777
         
        bonjour,
        j'ai suivi de loin cette discution et pour remplacer les coeffs par des valeurs de cellules:
            Case Is <= 0
                Coeff = [A1]
            Case Is <= 1000000
                Coeff = [A2]
        
        et ainsi de suite , on peut aussi écrire Range("A1").value ...
        0
      2. dani7777 > pou pouille Messages postés 212 Statut Membre
         
        Merci avec un grand M
        pou pouille

        c'est parti !
        vive comment ça marche !
        0