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 :

Opérations mathématiques sous VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Par défaut Opérations mathématiques sous VBA
    Bonjour à tous,

    Merci pour les réponses aux précédentes questions je touche au but mais je rencontre une dernière difficulté.

    Je dois faire des opérations mathématiques entre plusieurs variables (2 ou 3), mais l'opérateur mathématique peut être soit "+" soit "- soit "*" ou soit "/".

    J'aimerai savoir comment programmer cela dans vba car mis à part faire un select case avec une dizaine de possibilité, ce qui ne serait pas très propre niveau programmation, je ne vois pas comment faire.

    J'ai essayé de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Celluled'arrivée").value = "=" & Range("Valeur1").value & opérateur1 & Range("Valeur2").value
    mais excel me mets une erreur.

    Et quand je mets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Valeur1").value & opérateur1 & Range("Valeur2").value
    J'ai dans la cellule d'arrivée les deux valeurs avec un "+" au milieu mais l'opération mathématique ne se fait pas (vu qu'il n'y a pas un égal au début)

    Edit : l'opérateur est pour l'instant dim opérateur as "string" je pense que s'il existe un dim répertoriant les différentes formules mathématiques je suis sauvé mais je ne l'ai pas trouvé.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Bonjour,

    sans une explication claire et agrémentée d'exemples, difficile de répondre !

    Voir quand même du côté de la méthode Evaluate



    _________________________________________________________________________________________________
    If you can’t explain it simply, you don’t understand it well enough … (Albert Einstein)

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour,
    tu fais preuve d'avarice , car tu ne fournis pas trop d’informations; tu penses que ton code est suffisamment explicite pour que l'on puisse t'aider et d'une certaine manière tu as raison, mais tu nous laisse une part trop grande d'interprétation.

    quand je lis Range("Celluled'arrivée").value je conclus qu'il s'agit d'une forme d'écriture pour notre compréhension ,pas ce que tu as réellement écris dans ton code?

    l' erreur provient peut-être de là?
    que représente "Valeur1" le nom d'une cellule nommé?; d'une variable?; ou tout simplement une valeur?

    je sais de source sur que la Range("A1") existe mais range("Valeur1")??????

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Je suis sûr d'avoir déjà vu il y a pas longtemps ce genre de question sur le forum, et une bonne réponse était d'utiliser Evaluate.

    Par exemple, en D3 et F3 on a:
    D3 = 5
    F3 = 6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub MainTest()
        TestA "+"
    End Sub
    Function TestA(opérateur1 as string)
        TestA = Evaluate(Range("D3").Value & opérateur1 & Range("F3").Value)
    End Function
    La fonction TestA doit renvoyer 11.
    Dernière modification par Invité ; 27/07/2014 à 15h12.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour

    Ci dessous la proposition de solution faite à Attilia pseudo linkjodo le 26/7 à 23h sur le forum CCM et laissée sans réaction et pêut-^tre sans regarder

    pour calculer par ex (B2*B3 )/B4 +b5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    calcul = Evaluate("(" & "B2" & "*" & "B3" & ")" & "/" & "B4" & "+" & "B5")
    et en utilisant des variables 
    plus = "+"
    moins = "-"
    multi = "*"
    divis = "/
    calcul = Evaluate("(" & "B2" & multi & "B3" & ")" & divis & "B4" & plus & "B5")

  6. #6
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Par défaut
    Oui mais dans cette solution on rentre "en dur" les opérateurs mathématiques (si je comprends bien).

    Comment faire si l'opérateur mathématique apparait par exemple en B2 ? On a par exemple

        A   B    C      D        E
    2   5  +    6      *        7
    Donc dans mon code Vba j'alloue A2 à valeur 1, B2 à calcul 1, C2 à valeur 2, D2 à calcul 2 et E2 à valeur 3.

    Mais en B2 l'opérateur peut être un + mais aussi un -, un * ou un /. Il faut donc que le code puisse s'y adapter.


    J'arrive pas bien à formuler si vous voulez je peux vous mettre le code mais je sais que c'est uniquement en dernier recours.

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut





    Si la construction de la chaine texte est bonne dans ton post initial, il y a juste à l'inclure dans Evaluate !



  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour Attilaa (vs Linkmojo sur CCM),

    Milles excuses pour le temps que j'ai passé à te faire perdre le tien et sans rancune ...

    Tout simplement remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Celluled_arrivée").Value = "=" & ....
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Celluled_arrivée").Formula = "=" & ...
    Éventuellement suivi de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("Celluled_arrivée").Value= Range("Celluled_arrivée").Value
    pour remplacer la formule par sa valeur.

    Patrice

  9. #9
    Invité
    Invité(e)
    Par défaut
    Salut,

    Sans gestion d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Function MathA(Left, opérateur, Right)
        MathA = Evaluate(Left & opérateur & Right)
    End Function
    Dans Excel:
    D3 = 5
    E3 = *
    E4 = /
    E5 = +
    E6 = -
    F3 = 8

    C3 à C6 = MathA($D$3;$E3;$F$3)
    en faisant glisser de C3 à C6 doit renvoyer dans l'ordre : {40 ; 0.625 ; 13 ; -3} .

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Attilaa Voir le message
    Oui mais dans cette solution on rentre "en dur" les opérateurs mathématiques (si je comprends bien).

    Comment faire si l'opérateur mathématique apparait par exemple en B2 ?
    A essayer:
    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
     
    Function MathB(Gauche1, Opérateur1, Droit1, ParamArray ArgList())
     
        Dim i As Long
        Dim s As String
     
    On Error Resume Next
     
        If IsMissing(ArgList) Then
            MathB = Evaluate(Gauche1 & Opérateur1 & Droit1)
        Else
            For i = LBound(ArgList) To UBound(ArgList)
                ' On concatène dans un string tous les Arguments du paramètre
                ' avec ParamArray car Evaluate sait interpréter dans un format String
                s = s & " " & ArgList(i)
            Next
            MathB = Evaluate(Gauche1 & Opérateur1 & Droit1 & s)
        End If
     
    End Function

  11. #11
    Invité
    Invité(e)
    Par défaut
    On a par exemple

    A B C D E
    2 5 + 6 * 7

    Donc dans mon code Vba j'alloue A2 à valeur 1, B2 à calcul 1, C2 à valeur 2, D2 à calcul 2 et E2 à valeur 3.
    Si 2 cellules tel que A et B peuvent prendre une valeur numérique, il ne faut garder que le ParamArray dans ce cas.

    A tester sans garantie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function MathC(ParamArray ArgList())
    On Error Resume Next
        MathC = Evaluate(Join(ArgList, vbNullString))
    End Function

  12. #12
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Par défaut
    Merci de vos réponses je vais essayer vos propositions et je vous reviens.

Discussions similaires

  1. Opération mathématique entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 11
    Dernier message: 13/06/2005, 11h58
  2. Cases à cocher sous VBA
    Par dran dans le forum Général VBA
    Réponses: 4
    Dernier message: 15/11/2004, 21h50
  3. Réponses: 8
    Dernier message: 07/10/2004, 11h08
  4. (VBA-A] Requete access sous VBA
    Par vanima dans le forum VBA Access
    Réponses: 12
    Dernier message: 20/07/2004, 16h07
  5. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39

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