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 :

erreur de compilation: ":= attendu"


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut erreur de compilation: ":= attendu"
    bonjour,
    j'imagine que ca doit pas etre bien compliquer mais je cherche a afficher en reccursif la somme des produit de 2 entiers n et m, avec n allant de 1 à n et m allant de 1 à m.

    mon programme comporte une erreur de logique mais je compte m'en occuper plus tard mais sinon je ne comprend pas pourquoi il renvoie rien... c'est pourtant pas un code bien long... enfin voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function somme_produit_rec(ByVal n As Integer, m As Integer) As Integer
        If (n = 1) And (m = 1) Then
            somme_produit_rec = 1
        ElseIf n = 1 Then
                somme_produit_rec = m
            ElseIf m = 1 Then
                somme_produit_rec = n
            Else
                somme_produit_rec = somme_produit_rec(n, m - 1) + somme_produit_rec(n - 1, m) + (n * m)
        End If
     
    End Function
    voilà merci!

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Points : 206
    Points
    206
    Par défaut
    Trop imprégné de VB6 le code.
    Et comme ça, ça fonctionne mieux* ?

    * J'ai pas vraiment cherché à comprendre à quoi servait la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Function somme_produit_rec(ByVal n As Integer, ByVal m As Integer) As Integer
            If (n = 1) And (m = 1) Then
                Return 1
            ElseIf n = 1 Then
                Return m
            ElseIf m = 1 Then
                Return n
            Else
                Return somme_produit_rec(n, m - 1) + somme_produit_rec(n - 1, m) + (n * m)
            End If
        End Function

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    := attendu
    Euh, tu es sûr que c'est du VB ?

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Euh, tu es sûr que c'est du VB ?
    Visiblement, il y a comme un hiatus entre le titre et le contenu du fil .....

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour,

    Pas certain de tout comprendre non plus,
    Le code initial compile parfaitement chez moi (on peut utiliser cette syntaxe au lieu du Return, c'est très peu fréquent vu que c'est un héritage de transtion/rétrocompatibilité VB6 mais cela fonctionne) ; au passage le premier If ne sert à rien, il est déjà pris en compte par les deux cas suivant (autrement dit si n et m valent 1 on renvoie l'autre (qui vaut forcément 1 donc))

    Citation Envoyé par tomlev Voir le message
    Euh, tu es sûr que c'est du VB ?
    le := existe en VB.Net, c'est la syntaxe à utiliser lorsque l'on veut utiliser un paramètre nommé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Stuff(Optional ByVal param1 As Integer = 42, Optional ByVal param2 As Integer = 666)
    ' Exemple d'appel
    Stuff(param2:=42) ' permet de ne changer que le second
    Par contre je vois pas le rapport non plus avec le reste du sujet, et je n'ai dans mes tests pas réussi à trouver par quel moyen obtenir un message similaire au titre

    Enfin je ne suis pas certain que le code tel quel donne les bons résultats; si je prends le cas n = 4 et m = 3 et selon le descriptif je devrais avoir
    1 * 1 + 1 * 2 + 1 * 3 +
    2 * 1 + 2 * 2 + 2 * 3 +
    3 * 1 + 3 * 2 + 3 * 3 +
    4 * 1 + 4 * 2 + 4 * 3 =

    1 + 2 + 3 +
    2 + 4 + 6 +
    3 + 6 + 9 +
    4 + 8 + 12 =

    6 +
    12 +
    18 +
    24 =

    60
    Or le code donne 84

    Edit: À noter également, qu'avec un peu de réflexion et de maths (en gardant le principe de calcul de la citation précédente) on peut très bien s'en sortir avec une simple formule pas du tout récursive

    Cordialement !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous et merci de votre interet,

    déja, il se peut que je ne sois pas dans la bonne section car le code que je veux compiler c'est du simple VBE d'excel. est ce bien cela?

    Par contre je vois pas le rapport non plus avec le reste du sujet, et je n'ai dans mes tests pas réussi à trouver par quel moyen obtenir un message similaire au titre
    Sehnsucht, je ne comprens pas ce que tu cherches a me dire.

    Aussi,
    Enfin je ne suis pas certain que le code tel quel donne les bons résultats
    c'est exactement ce que mon sujet disait au depart:
    mon programme comporte une erreur de logique mais je compte m'en occuper plus tard mais sinon je ne comprend pas pourquoi il renvoie rien
    cela dit,
    mdevaux62, il n'y a pas (dans excel en tout cas...) de return dans le langage. un retour de la fonction se fait en affectant le nom de la fonction (comme s'il s'agissait d'une variable) par la valeur voulue.

    Merci a vous,

    PS: il se peut que j'ai deja fait une "betise" car meme si mon compte n'a que 14h de vie, j'ai deja un vote à negatif... s'il y a un truc que j'ai mal fait je sais pas dite le moi....
    Cordialement.

    De nouveau pour Sehnsucht,

    Edit: À noter également, qu'avec un peu de réflexion et de maths (en gardant le principe de calcul de la citation précédente) on peut très bien s'en sortir avec une simple formule pas du tout récursive
    Avec un peu de reflexion également, on pourra constater que ce code (ne servant pas grand chose comme tout le monde l'aura constater) a un but pedagogique et non pas concret pour une entreprise donc le moyen le plus rapide de le faire, il doit en avoir plus d'un... la recursion est voulu.

    PS: neoconcept, professeur de mathematique, master statistique.

    Cordialement.

    tomlev Citation:
    := attendu

    Euh, tu es sûr que c'est du VB ?
    tomlev,
    moi non plus je ne comprend pas le message d'erreur...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    J'ai trouver d'ou venait le probleme...
    excel et et VBE ne sutilise pas de la meme facon et je n'avais pas fait attention que j'appelai ma fonction de cette facon
    dans VBE : somme_produit_rec(3,1)
    et dans une feuille excel je faisai la meme chose alors qu'il fallait ecrire :
    somme_produit_rec(3;1)

    ca prendra sans doute plus d'une minute pour comprendre la difference à certain qui ne prennent pas le temps de lire les message avant d'y repondre mais au autres merci pour vos reponses.

    Cordialement.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    le := existe en VB.Net, c'est la syntaxe à utiliser lorsque l'on veut utiliser un paramètre nommé
    Ah oui tiens, j'avais oublié ça... cet opérateur me rappelait plutôt Pascal

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Citation Envoyé par neoconcept2 Voir le message
    ... mon programme comporte une erreur de logique ...
    Exact, ton programme calcule plusieurs fois certains produits (d'ou le résultat plus élevé)

    Voici une façon de procéder par récursivité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function calc(ByVal m As Integer, ByVal n As Integer, Optional ByRef i As Integer = 1, Optional ByRef j As Integer = 1)
     
            If i = m And j = n Then Return m * n
     
            If i = m Then
                i = 1
                Return (m * j) + calc(m, n, i, j + 1)
            End If
     
            Return (i * j) + calc(m, n, i + 1, j)
     
        End Function
    Attention : écrit en VB.NET.


    Résultat pour :

    m=3,n=3 : 36
    m=3,n=4 : 60
    m=4,n=4 : 100
    A+, Hervé

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    J'ai oublié
    exemple d'appel

    une form avec un RichTextBox pour l'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            RichTextBox1.Text += "m=3,n=3 : " & calc(3, 3).ToString() & vbCrLf
            RichTextBox1.Text += "m=3,n=4 : " & calc(3, 4).ToString() & vbCrLf
            RichTextBox1.Text += "m=4,n=4 : " & calc(4, 4).ToString() & vbCrLf
    donne le résultat indiqué dans le post précédant.

    -Edit-
    Je viens de m'apercevoir que le code pouvait être simplifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Function calc(ByVal m As Integer, ByVal n As Integer, Optional ByVal i As Integer = 1, Optional ByVal j As Integer = 1)
     
            If i = m And j = n Then Return m * n
     
            If i = m Then Return (m * j) + calc(m, n, 1, j + 1)
     
            Return (i * j) + calc(m, n, i + 1, j)
     
        End Function

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    salut rv26t, désolé pour la longue interruption.
    j'avais tester ton code sur le coup et il ne fonctionnait pas.
    (syntaxiquement, il ne marche pas directement sur excel mais meme apres "traduction" il ne marchait qd meme pas)
    il fonctionne chez toi?
    je le retesterai au cour de la journée.
    Au fait, j'ai fini par resoudre le probleme par une double recursion. mais je n'ai pas reussi à les fusionner, seulement à en faire 2 séparées.
    car il s'agit bien d'une double recursion ici n'est ce pas?
    toi par exemple, tu semble utiliser une premiere recursion et "feindre" la seconde en y ajoutant des paramètres qui joueront le rôle d'itérations, ca ne semble pas encore la solution reel.
    mais peut etre que c'est de cette facon qu'il faut proceder, je ne sais pas...

    S'il y a dautre idées, peut être orientées avec une double recursion?
    je posterai mon code, des que possible en tout cas.
    à bientot!

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

Discussions similaires

  1. [AC-2013] Erreur de compilation: Tableau attendu
    Par mehdi cmr dans le forum VBA Access
    Réponses: 3
    Dernier message: 31/03/2015, 17h10

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