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 :

Problème débutant macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut Problème débutant macro
    Salut,

    Alors je préviens tout de suite, je ne connais rien à la programmation (au point où j'utilise probablement pas le bon terme pour commencer... bref)
    Je dois faire une macro sur excel dans le cadre d'un cours, et je suis bloqué, après plusieurs heures de recherches je viens donc quémander votre aide^^

    Et voilà où j'en suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub pbox()
    Dim prime As Variant
    Dim chiffre As Variant
    chiffre = InputBox("Saisir votre chiffre d'affaires :", chiffre)
    If chiffre < "10000" Then
    prime = MsgBox("Votre prime est de :", 10 / 100 * chiffre)
    ElseIf chiffre > "40000" Then
    prime = MsgBox("Votre prime est de :", 21 / 100 * chiffre)
    Else: prime = MsgBox("Votre prime est de :", 15 / 100 * chiffre)
    End If
    End Sub
    J'ai bien une input box qui s'ouvre, je peux rentrer le chiffre d'affaire, mais ensuite la MsgBox n'affiche pas le montant de la prime, uniquement "votre prime est de".
    Voilà, en espérant que ca ne pique pas trop les yeux...

    Merci d'avance,
    Guillaume

  2. #2
    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 bienvenu

    tout dabors apprendre a préhender son environnement
    on par le quoi
    de chiffre donc numerique
    il faut savoir que les numériques ne sont jamais entre guillemets en vba sauf besoins en texte
    en effet les expression texte sont en string

    string
    est l'appellation du type de données texte
    long ou integer sont l'appellation du type de données numériques

    par des fonction internes au vba comme val on peut transformer un string(texte en numérique )
    donc quand je vois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if chiffre<"10000" then
    c'est comme si je voyait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if chiffre<" 0 = la tete a toto" then
    donc pour commencer enlève test guillemets

    ensuite je vois =msgbox .............

    ou lah!!!! un msgbox n'est pas une fonction ca peut marcher mais c'est dangereux
    je reviens avec un code a peu pres conforme dans 2 minutes
    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

  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,

    un exemple avec des chiffres à virgule

    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
    Sub Demo()
    Dim CA As Single
    Dim Prime As Single
     
    CA = Application.InputBox("Montant du CA ?", , , , , , , 1)
     
    If CA < 10000 Then
        Prime = CA * 0.1
    ElseIf CA > 40000 Then
        Prime = CA * 0.21
    Else
        Prime = CA * 0.15
    End If
     
    MsgBox "La prime est de : " & Prime
     
    End Sub

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut
    Ok j'avais pas vu tous les messages qui ont suivi, et je pense avoir à peu près suivi.
    Et du coup le select case est équivalent au if/else/then dans ce cas de figure si je comprends bien ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim CA As Single
    Dim Prime As Single
     
    CA = Application.InputBox("Montant du CA ?", , , , , , , 1)
    Je n'arrive pas à suivre cette partie : Single prend indifféremment des numériques et des calculs ? Et pourquoi autant de virgules dans la parenthèse ?

  5. #5
    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
    Citation Envoyé par Guillaume MHK Voir le message
    Dim CA As Single
    Dim Prime As Single

    CA = Application.InputBox("Montant du CA ?", , , , , , , 1)


    Je n'arrive pas à suivre cette partie : Single prend indifféremment des numériques et des calculs ? Et pourquoi autant de virgules dans la parenthèse ?
    Single est un type de données numériques à virgule
    Application.InputBox est une méthode qui permet de demander à l'utilisateur "quelque chose", et qui possède des options (on appelle ça des paramètres), dont une option pour contrôler le "type de données". Le Type 1 = Numérique
    Ces "options" sont facultatives, tu n'es pas obligé de les utiliser.
    Tu as deux façons de paramétrer une "option" :

    1) tu respectes l'ordre dans lequel elles sont intégrées à la méthode : c'est ce que j'ai fais, toutes les virgules c'est pour laisser les options précédentes vides
    2) tu écris le nom de "l'option" et là tu n'as pas besoin de citer les options précédentes
    Ce qui donnerait pour le cas 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CA = Application.InputBox("Montant du CA ?", Type:=1)
    La première chose à apprendre, avant de coder, c'est de savoir utiliser l'aide VBA.

    Met ton curseur de souris sur un mot de code que tu ne comprends pas, et appuie sur la touche
    Si tu le fais sur Single, tu arrives sur l'aide qui décris la plage numérique de cette variable
    Si tu le fais sur Application.Inputbox, tu auras la description et l'ensemble des "options" que tu peux utiliser

  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
    re
    attention a bien faire la dfférence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CA = Application.InputBox(".........)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CA = InputBox("........)
    ce ne sont pas les même composants c'est la ou nous divergeons joe et moi, c'est peut être un tord de ma part dans certains cas les retours ainsi que les paramètres ne sont gérés pareil
    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
    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
    voila j'ai mis des commentaires
    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
    Sub primbox()
     ' primbox Macro
     Dim prime As Long 'on attend un numérique pour  la prime puisque c'est un calcul c'est donc une variable  long
     Dim chiffre As Variant 'on attend un numerique pour  chiffre  puisqu'on doit taper un chiffre  c'est donc une variable  long mais on la met en variant pour le test numerique sinon une rreur est déclenché et plante la macro
     chiffre = InputBox("Saisir votre chiffre d'affaires :", chiffre)
     ' au cas ou un gros ba lourd taperait autre chose que des chiffre on peut mettre une securite avec un if generale
     'comme suit
     If IsNumeric(chiffre) Then
     Select Case chiffre
     
     Case Is < 10000
     prime = 10 / 100 * chiffre ' la variable prime prends la valeur du calcul
     
     MsgBox "Votre prime est de :" & prime & "€" 'prime qui est une variable long n'est pas entre les guillemets
     
     Case Is > 40000
     prime = 21 / 100 * chiffre ' la variable prime prends la valeur du calcul
      MsgBox "Votre prime est de :" & prime & "€" 'prime qui est une variable long n'est pas entre les guillemets
     
     Case Is > 10000 And chiffre < 40000
     prime = 15 / 100 * chiffre ' la variable prime prends la valeur du calcul
     MsgBox "Votre prime est de :" & prime & "€" 'prime qui est une variable long n'est pas entre les guillemets
     
     'sinon ca afficherait Votre prime est de :prime€"
     End Select
     Else
     'si le gros balourd a tapé un caractere non numeric on lui dit de maniere expressive
     MsgBox "hey!! gros balours je t'ai pas demander de me racconter ta vie" & vbCrLf & " les chiffres c'est de 0 a 9 tete de piaf!!!"
     
     End If
     
     End Sub
    voila il y a suffisamment de commentaires pour une si petite opération qui t'aideront a comprendre le principe

    re
    et si tu veux la possibilité d'annuler (sortir sans rien taper
    tu ajoute ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If chiffre = "" Then Exit Sub
    juste avant la ligne 8
    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

  8. #8
    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
    re
    allons joe!!

    sa demande était + de 10000 10%

    plus de 40000 21%

    entre les deux 15%

    tu fait donc la meme erreur que lui
    avec ton else
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Else
        Prime = CA * 0.15
    End If
    le else peut prendre 5000 par exemple

    c'est la fatigue sans doute hein!!!!

    je remet ses condition cité explicitement
    au cas ou
    - Chiffre d’affaires inférieur à 10000 , le taux de prime est de 10% du chiffre d’affaires
    - Chiffre d’affaires supérieur 40000 , le taux de prime est de 21% du chiffre d’affaires
    - Chiffre d’affaires supérieur ou égale à 10000 mais inférieur ou égale à 40000 , le taux de la prime est de 15% du chiffre d’affaires
    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

  9. #9
    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
    Désolé, mais ton 5000 est capturé par la première condition If CA < 10000 n'est-ce pas ?

    si tu élimine la borne basse, puis la borne haute ... ça ne sert à rien dans la dernière condition de chercher la borne "entre basse et haute", tu prend tout ce qui reste.

    La seule chose qu'il manque dans mon code, c'est si on annule le inputbox de départ (on obtient une prime de 0 car CA = 0), et un simple teste de CA après l'inputbox suffit pour Exit Sub sans dérouler la suite.

    mais, le diable se cachant dans les détails, je lui laisse prendre en charge ceci ... puisque ce cas n'est pas abordé dans son énoncé
    A ce titre, quid des chiffres négatifs ? L'énoncé n'en parle pas donc je ne le gère pas. On pourrait aisément imaginer un contexte de reprise de prime en cas de CA annulé (commande annulé par exemple).

    Au passage, tu utilises un Select Case alors que l'énoncé demande un If/End if

    Ne jamais oublier que Application.InputBox possède un paramètre qui permet de contrôler le type saisi par l'utilisateur, sans devoir utiliser de tests dans le code. Je te laisse vérifier

  10. #10
    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
    re
    oui c'est vrai tu a raison
    mais pour le input context =1 ne m'empêche pas de taper "joe" en tout cas chez moi

    j'ai testé bien sur

    autant pour moi pour la borne 1 du case

    après pour les if le principe est le même
    un pouce pour m'excuser
    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

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Par défaut Merci
    Wha, magnifique ! Merci infiniment !

    Oui pour ce qui est des guillemets, vu que j'étais bloqué j'ai fini par essayer toutes sortes de choses, pas forcément logiques^^

    Alors si je comprends bien, ce qui posait problème, (au delà des guillemets) c'est donc que ma variable chiffre devait être un calcul et donc ne pouvait pas simplement être définie comme variant, et qu'il faut "annoncer" qu'on veut l'utiliser avec select case.
    Et il ne faut pas écrire x=msgbox mais directement msgbox?

    Ah et je reviendrai très certainement vous voir, parce qu'il y a une partie 2^^
    En tout cas encore merci pour ces réponses rapides et pédagogiques!

  12. #12
    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
    re
    tu vas saisir "joe", tu vas vouloir valider, Excel va te jeter car c'est pas un nombre.
    d'où mon test "if isnumeric"
    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

  13. #13
    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
    Allons !

    Ton code récupère un variant et tu dois du coup isoler le cas où ce n'est pas numérique, sinon tu plantes
    Mon code ne récupère qu'un Single, qui ne nécessite aucun test de sécurité pour éviter le plantage.

    C'est côté Excel que le contrôle s'effectue, tant que l'utilisateur ne saisie pas un chiffre, On lui dit que le format n'est pas bon.

    A part dépasser la capacité de la variable (même la monde entier cumulé n'a pas un CA dépassant un Single .... sinon met un Double si t'as peur), y'a peu de dangers.

    Désolé, mais là t'as jeté ton dévolu sur l'écriture du code sans étude préalable.
    Il est à la fois non optimisé ... mais également moins intuitif pour un gros débutant, car tu manipules du Variant que tu dois tester et imbriquer un Select Case (non demandé) dans un If de sécurité.
    Tu présentes une méthode peu rationnelle où tu as un MsgBox dédié à chaque condition, au lieu d'introduire une phase "test" et une phase "restitution du résultat". D'autant plus que tu passes par une variable Prime qui a parfaitement sa place pour ce découpage.

    Sur un sujet si simple, on aurait pu tous faire cette sottise, cette fois-ci c'est ton tour

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 29/06/2006, 13h11
  2. [Débutant] macro d'éclairement
    Par rod59 dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/06/2006, 16h15
  3. [débutant][macros] préscisions sur #define
    Par Spartan03 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2006, 17h44
  4. [Problème][Débutant]pointeurs
    Par arkadin dans le forum C
    Réponses: 11
    Dernier message: 05/04/2006, 19h33
  5. problème débutant avenc les triggers
    Par yayooyayoo2005 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 11/01/2006, 11h52

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