Problème pour créer une fonction sous excel

Problème pour créer une fonction sous excel - VB/VBA/VBS - Programmation

Marsh Posté le 02-06-2010 à 09:50:33    

Bonjour, je dois créer des fonctions en VBA, mais je n'arrive pas du tout à la faire fonctionner...  
 
Voici l'intitulé de la question :  
 
 
(Le code de réduction fait 4 chiffres)
 
Faire une fonction REDUCTION qui reçoit un paramètre en entrée : le code de réduction. La fonction retourne un entier compris entre 0 et 100 qui correspondra au pourcentage de réduction. Le pourcentage de réduction est calculé de la façon suivante :
 
si le code est égal à "NEANT", le pourcentage est nul ; si le code contient la lettre W (en majuscule) sans la lettre T (en majuscule), le pourcentage est 10 ; si le code contient les lettres W et T (en majuscules), le pourcentage est 15 ; dans les autres cas, le pourcentage est 2.
 
Indices : faire une boucle For permettant d'examiner les caractères du code de réduction ; utiliser une variable booléenne (initialisée à FALSE avant la boucle) indiquant la présence d'un W et une variable booléenne (initialisée à FALSE avant la boucle) indiquant la présence d'un T ; on rappelle que Mid(mot, i, 1) permet d'obtenir le caractère situé à la position i dans la chaîne mot.  
 
 
 
Pourriez-vous m'aider ?  
Merci


Message édité par JessicaPOP le 02-06-2010 à 10:10:52
Reply

Marsh Posté le 02-06-2010 à 09:50:33   

Reply

Marsh Posté le 02-06-2010 à 10:51:39    

On va pas faire ton exo à ta place. Donc soit tu expliques ce que tu as fait et où tu bloques précisément soit tu t'abstiens.

Reply

Marsh Posté le 02-06-2010 à 13:13:15    

Inutile d'être aussi agressif.

 

Ce n'est pas un exercice mais une partie de celui-ci. J'ai réussi à faire le reste toute seul, mais là je suis bloquée : je ne vois absolument pas comment faire. Bien entendu, j'ai fait une recherche google pour trouver comment faire, mais, dans la mesure où je n'ai rien trouvé, je me suis permise de poster ici.

 

Voilà ce que j'ai essayé de faire, mais je suis pratiquement certaine que ce n'est absolument pas bon :

 


Code :
  1. compteur = 0
  2. regle1 = False
  3. regle2 = False
  4. regle3 = False
  5. regle4 = False
  6.  
  7. For i = 1 To Len(x)
  8. k = Mid(x, i, 1)
  9. If (codreduction = "NEANT" ) Then
  10. regle3 = True And regle5 = False
  11. ElseIf Mid(codereduction, i, 1) = W And Mid(codereduction, 1, 1) <> T Then
  12. regle2 = True
  13. ElseIf Mid(codereduction, i, 1) = W And Mid(codereduction, 1, 1) = T Then
  14. regle4 = True
  15. Else
  16. regle5 = True
  17. End If
  18.  
  19. Next
  20.  
  21.  
  22. If regle2 = True Then 'W :oui et T :non'
  23. compteur = 10
  24. End If
  25. If regle3 = True Then   'Code = NEANT'
  26. compteur = 0
  27. End If
  28. If regle4 = True Then 'W :oui et T:oui'
  29. compteur = 15
  30. End If
  31. If regle5 = True Then 'W :non et T:non'
  32. compteur = 2
  33. End If
  34.  
  35. MsgBox ("compteur :" & compteur)
  36.  
  37. regle1 = True
  38. End If
  39.  
  40. For i = 1 To Len(x)
  41. k = Mid(x, i, 1)
  42. If ("A" <= k And l <= "Z" ) Then
  43. regle3 = True
  44. ElseIf ("a" <= k And k <= "z" ) Then
  45. regle2 = True
  46. ElseIf ("0" <= k And k <= "9" ) Then
  47. regle4 = True
  48. Else
  49. regle5 = True
  50. End If
  51.  
  52. Next
  53.  
  54. If regle2 = True Then
  55. compteur = compteur + 1
  56. End If
  57.  
  58. If regle3 = True Then
  59. compteur = compteur + 1
  60. End If
  61.  
  62. If regle4 = True Then
  63. compteur = compteur + 1
  64. End If
  65.  
  66. If regle5 = True Then
  67. compteur = compteur + 1
  68. End If
 


Voilà, merci à ceux qui accepterait de m'aider, et encore une fois, je ne demande pas qu'on me fasse l'exercice, juste à ce qu'on m'aide...

Message cité 1 fois
Message édité par JessicaPOP le 02-06-2010 à 13:46:53
Reply

Marsh Posté le 02-06-2010 à 13:22:25    

JessicaPOP a écrit :


Voilà, merci à ceux qui accepterait de m'aider, et encore une fois, je ne demande pas qu'on me fasse l'exercice, juste à ce qu'on m'aide...


Pas de problème mais comprends bien que d'après ton 1er post on dirait que tu veux qu'on te fasse l'exo vu que tu n'expliques pas ce que tu as fait.

 
JessicaPOP a écrit :

Voilà ce que j'ai essayé de faire, mais je suis pratiquement certaine que ce n'est absolument pas bon


Tu ne peux pas tester pour voir si ça marche ou pas ? Ca serait plus facile pour nous si tu disais où ça plante/marche pas.

 

Et mets ton code entre les balises [ code=vb] ... [ /code] (sans les espaces) ça sera plus lisible.

 


Ta 1ere boucle For ne va pas déjà. Tu ne vérifies que si la 1ere lettre est T. De plus si tu trouves un truc bon il faut sortir de la boucle pour éviter de remettre la variable à False à l'itération suivante.


Message édité par Deamon le 02-06-2010 à 13:25:15
Reply

Marsh Posté le 02-06-2010 à 13:52:26    

Ok merci !
J'ai testé, et le compteur me donne toujours 0 en résultat, quoi que j'écrive.

 
Citation :

Ta 1ere boucle For ne va pas déjà. Tu ne vérifies que si la 1ere lettre est T. De plus si tu trouves un truc bon il faut sortir de la boucle pour éviter de remettre la variable à False à l'itération suivante.


Qu'entends-tu par là ? Comment sortir de la boucle ?
 

 

Je pense qu'il faudrait que je reprenne toute la question car ce que j'ai fait ne me semble pas bon. Vous ne savez pas où je pourrais trouver un cour simple sur la réalisation de ce type de question ?
PS : j'ai édité mon post pour que cela soit plus lisible.

Message cité 1 fois
Message édité par JessicaPOP le 02-06-2010 à 13:53:35
Reply

Marsh Posté le 02-06-2010 à 14:03:39    

JessicaPOP a écrit :

1° Qu'entends-tu par là ? Comment sortir de la boucle ?
 
2° Vous ne savez pas où je pourrais trouver un cour simple sur la réalisation de ce type de question ?


1° En gros (je remplace par un autre exemple) la boucle teste chaque caractère pour savoir si il y a un A dans un mot. Si il en trouve un il met la variable à TRUE mais il continue de tester le caractère suivant ça sera pas un A donc il remettra un FALSE par dessus.
Il faut faire un "Exit For" pour sortir si on a trouvé. Et à mon avis il doit bien exister un méthode style "contains" pour voir si une lettre est contenue dans une chaine de caractères.

 

2° C'est de la programmation en général ce problème, c'est plus de l'algorithmie qu'un problème particulier. Donc il n'y aura pas de cours qui traite exactement de ce sujet.


Message édité par Deamon le 02-06-2010 à 14:04:13
Reply

Marsh Posté le 02-06-2010 à 14:12:36    

Hmm ok. Je vois le problème mais je ne sais pas comment le résoudre.
 
Dieu soit loué, je ne me dirige pas vers des études en progammation... C'est le dernier exercice que je dois faire (probablement de ma vie :D )

Reply

Marsh Posté le 02-06-2010 à 14:32:39    

Ah ! Je pense que pour résoudre mon problème, il me faudrait savoir comment indiquer : "Le mot doit contenir la lettre X"

 

Comment réaliser cette tâche ?

 

Edit : c'est un peu ce que tu viens de m'expliquer en fait... :D Où je met le Exit for ? Si je le met  à la place du for, ça va m'indiquer une erreur.


Message édité par JessicaPOP le 02-06-2010 à 14:38:14
Reply

Marsh Posté le 02-06-2010 à 14:45:59    

Code :
  1. For i ...
  2.  If ok Then
  3.    youpi = true
  4.    Exit For
  5.  Else
  6.    ....
  7.  End If
  8. Next i


 
A la syntaxe près. ;)
 
 
Mais pour le "contient" : http://silkyroad.developpez.com/VB [...] eres/#LI-E
InStr retourne 0 s'il ne trouve pas.

Reply

Marsh Posté le 02-06-2010 à 15:20:44    

Wha 68 lignes pour une reduction... Font pas rire les exos !
 
Comme le dit Deamon le souci n'est qu'algorithmique. Vu ton code tu as deja quelques bases. Ca ne devrait pas etre si compliqué si tu poses bien ton algo.
 
Si les indices ne sont que des indices et pas une obligation, ce que j'espère...
(Deux booleens pour tester l'existence de deux lettres... Excelent... Heureusement qu'il n'y a pas 15 lettres a tester...  :pfff:  
Pis alors le mid() pour voir si une lettre est dans une chaine...  :ouch: Ca ne se fait plus depuis 2000...)
 

Code :
  1. Fonction Reduction - Parametre est le prix de base
  2.    Pourcentage = 2
  3.    Si "T" est dans CodeReduction alors
  4.       Si "W" est dans CodeReduction alors Pourcentage = 15
  5.    Sinon
  6.       Si "W" est dans CodeReduction alors Pourcentage = 10
  7.    Fin Si
  8.    Si CodeReduction = "NEANT" Alors Pourcentage = 0
  9.  
  10.    Reduction = Parametre * (1-Pourcentage/100)
  11. Fin Fonction

Explications :
ligne 2 : on le definit de base vu que si aucune de nos conditions est remplie, c'est 2
ligne 4 : ici on est deja dans le Si du test sur "T" est ok. Donc cette ligne c'est forcement pour "T" ET "W". Deux Si imbriqués.
ligne 6 : ici on est aussi dans le Si du test sur "T", mais pour le PAS ok. Donc cette ligne c'est forcement QUE "W"
ligne 8 : c'est clair je pense. On aurait pu le mettre au debut ca n'aurait rien changé. Meme si Neant a un "T". Avec nos Si imbriqués, pas de souci, ca ne serait pas passé dedans.
ligne 10 : on donne a la fonction la valeur du resultat, reduction effectuée, pour qu'elle la renvoit.
 
Le "est dans" se 'traduit' comme l'a dit Deamon par InStr<>0


Message édité par SuppotDeSaTante le 02-06-2010 à 15:46:08

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-06-2010 à 15:20:44   

Reply

Marsh Posté le 02-06-2010 à 16:27:47    

Un grand merci pour votre aide !
 
J'ai pratiquement finit, une 2 dernières petites questions :  
-Je n'ai pas compris comment utiliser InStr<>0 pour traduire le "est dans". Par exemple, si je cherche la lettre x, il faut écrire quoi ? InStr = x ?
-Pour le nom de la fonction, j'ai pas compris ce que je devais écrire.
 

Reply

Marsh Posté le 02-06-2010 à 16:41:13    

Regarde dans le lien que j'ai mis :
 

Citation :

Utilisez la fonction InStr
 
Remarque:
cette fonction renvoie 0 si auncune occurence n'est trouvée.
VB6-VBA
 
 
'Renvoie la position de la première occurrence d'une chaîne ("e" )
MsgBox InStr("Developpez", "e" ) 'renvoie 2

Reply

Marsh Posté le 02-06-2010 à 17:35:28    

J'ai bien vu ton lien mais je n'ai pas compris comment l'utiliser :  
 

Code :
  1. Sub TEST()
  2. Dim x As String
  3. x = InputBox("entrez un mot" )
  4. If x = InStr(x, "w" ) Then
  5. MsgBox ("Il contient la lettre w" )
  6. Else
  7. MsgBox ("Il ne la contient pas" )
  8. End If
  9. End Sub


 
Pourriez-vous m'indiquer directement ce que je dois mettre, car là... j'avoue que je bloque.


Message édité par JessicaPOP le 02-06-2010 à 17:35:48
Reply

Marsh Posté le 02-06-2010 à 17:37:55    

Pas compliqué pourtant. InStr renvoie la position de l'élément donc faut tester si ça renvoie 0, si c'est le cas ça voudra dire qu'il ne l'a pas trouvé dedans. Donc If InStr(x, "w" ) = 0 Then ... Else ...

Reply

Marsh Posté le 02-06-2010 à 17:55:32    

Je t'ai envoyé des infos en message privé JessicaPOP
 
Attention tout de meme, avec l'exemple de Deamon ca ne marchera pas, InStr tient compte de la casse.
Si tu ne veux pas tenir compte de la casse, et donc chercher sur "w" ou sur "W" il faut ajouter comme dernier parametre "vbTextCompare"
Et je prefere mettre 1 comme premier parametre. Ca specifie que tu commences a regarder des le 1er caractere... Question d'habitude pour ma part.
 
avec ton exemple ca donnerait plus ceci :

Code :
  1. Sub TEST()
  2. Dim x As String
  3. x = InputBox("entrez un mot" )
  4. If InStr(1,x, "w",vbTextCompare)<>0 Then
  5. MsgBox ("Il contient la lettre w" )
  6. Else
  7. MsgBox ("Il ne la contient pas" )
  8. End If
  9. End Sub


Message édité par SuppotDeSaTante le 02-06-2010 à 17:59:51

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 03-06-2010 à 08:51:12    

Bonjour, en fait je ne sais pas si cest la que je dois ma question, mais je ne trouve pas dsl.
en fait j'ai un petit examen de EXCEL la semaine prochaine et donc la je "revise un peu": j'aimerai pouvoir enfait inclure les fonction "SI" "ET" et "OU" dans une meme fomrule. jai passé la nuit a la chercher sur internet mais je trouve pas.
je n'ai pas su comment vous montrer directement mon tableau ca serai facile pour vous mais bon.
en fait jai un tableau ou il ya une liste d'etudiant avec des note et des  coeficient. je devais calculer les moyennes, ce qui etait facile, mais aussi je dois faire en sorte que dans une meme formule que j'appliquerai a toute la colone, donner des apreciation du style : Si la moyenne de letudiant < 8 : REFUSE ,// si la moyenne >8 et <10 OU SI la moyenne >10 mais une note de letudiant <5 : RATRAPAGE /// SI la moyenne est >10 avec Aucune note <5 : ADMIS .  
tout cas dans une meme formule, je ne sais meme pas si c'est possible.
si quelqu'un peut me donner un coup de main je pourrais lui envoyé le classeur directement par mail ..  
et dsl pour les erreur dorthographe, , depuis 4h du matin je me bat avec cette formule
merci davance
ps : au fait je suis nouveau donc je ne sais pas vraiement quel sont les regle ici, merci

Reply

Marsh Posté le 03-06-2010 à 08:55:53    

re salut: je reviens pour tenter de copier seulement le classeur: Le but est d'appliquer la formule sur la cellule F6
 
 
 
NOM /Matière stat éco math moyenne résultat
Coefficient           2  3   1 sur 20     -
 
DUPONT Henri 12 14 12 13                 F6
GRILLE Georges 19 4 15 10,83333333 -
MARTEL Pascale 10 12 7 10,5 -
BRUNEL Paul 8 10 12 9,666666667 -
TARTER Georges 2 11 8 7,5 -
KIMBER Stef 15 13 19 14,66666667 -
ROULEX Paul 14 19 14 16,5 -
PIERRELLE Delphin 3 18 9 11,5 -
SANTISE Corinne 14 15 11 14 -
WINCK Venus 17 12 13 13,83333333 -

Reply

Marsh Posté le 03-06-2010 à 10:12:20    

excelmenerve créé toi un sujet.


---------------
Soyez malin, louez entre voisins !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed