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 avec l'instruction Return [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gérant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Par défaut Erreur avec l'instruction Return
    Bonjour,

    Je souhaite utiliser l'instruction Retrun dans mon code mais une erreur systématique s'affiche.
    Celle-ci est :

    Erreur de compilation:
    Attendu : fin d'instruction

    Le code est pourtant des plus simple, le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function AgePhrase(ByVal age As Integer) As String
        If age > 60 Then Return "Senior"
        If age > 40 Then Return "Middle-aged"
        If age > 20 Then Return "Adult"
        If age > 12 Then Return "Teen-aged"
        If age > 4 Then Return "School-aged"
        If age > 1 Then Return "Toddler"
        Return "Infant"
    End Function
    C'est un exemple tiré de l'aide Microsoft, donc il est bon.
    Je ne comprends pas pourquoi cette erreur.
    Quelqu'un aurait-il une idée ?
    Bien à vous

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Où avez-vous trouvé cet exemple car pour moi si ma mémoire ne me fait pas défaut l'instruction Return, n'a pas d'argument. De plus, GoSub et l’instruction Return correspondante doivent se trouver dans la même procédure donc celle que vous publiez est incomplète.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    bonjour,
    ton exemple fait référence à VB.net pas VBA!
    https://docs.microsoft.com/fr-fr/dotnet/visual-basi

  4. #4
    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,

    L'instruction Return n'est destinée à être utilisée dans une fonction VBA.
    Pour coder la valeur à retourner dans une fonction VBA, c'est à la fonction qu'il faut affecter la valeur !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function AgePhrase(ByVal age As Integer) As String
        If age > 60 Then AgePhrase = "Senior"
        If age > 40 Then AgePhrase = "Middle-aged"
        If age > 20 Then AgePhrase = "Adult"
        If age > 12 Then AgePhrase = "Teen-aged"
        If age > 4 Then AgePhrase = "School-aged"
        If age > 1 Then AgePhrase = "Toddler"
        AgePhrase = "Infant"
    End Function

  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
    Bonjour,

    un bon vieux Select Case peut faire l'affaire

    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
    Function AgePhrase(ByVal age As Integer) As String
        Select Case age
            Case Is > 60
                AgePhrase = "Senior"
            Case Is > 40
                AgePhrase = "Middle-aged"
            Case Is > 20
                AgePhrase = "Adult"
            Case Is > 12
                AgePhrase = "Teen-aged"
            Case Is > 4
                AgePhrase = "School-aged"
            Case Is > 1
                AgePhrase = "Toddler"
            Case Else
                AgePhrase = "Infant"
        End Select
    End Function

  6. #6
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 138
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 138
    Par défaut
    Bonjour,
    Citation Envoyé par Yakov TOPRAK Voir le message
    Je souhaite utiliser l'instruction Retrun dans mon code
    Pourquoi un "Retrun" alors qu'avec une formule tu as le résultat ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CHOISIR(EQUIV(A1;{0;1;4;12;20;40;60};1);"Infant";"Toddler";"School-aged";"Teen-aged";"Adult";"Middle-aged";"Senior")

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement pour ce genre de problème, j'utilise RECHERCHEV avec valeur proche.

    Comment remplacer des SI imbriqués par la fonction RECHERCHEV
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gérant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Par défaut
    Merci à tous.
    Je comprends pourquoi cela ne fonctionne pas alors, car l'instruction n'est pas valide pour ce que je veux faire.
    Bonne journée

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Excel 365 => RECHERCHEX, histoire de ne pas réinventer la roue en VBA et d'éviter le hard-coding... Comme le signale Philippe, pour les autres versions, on peut utiliser RECHERCHEV ou INDEX-EQUIV en s'appuyant sur un tableau structuré, histoire d'éviter aussi le hard-coding dans la formule . En VBA, on préférera le Select Case au IF lorsque les conditions portent sur la même valeur. Tnat qu'à faire, autant exploiter correctement ce qui a été créé (voir mon billet à ce sujet)

    Si vraiment besoin du VBA pour inclure la réponse dans un traitement VBA, j'utiliserais quand même RECHERCHEX sur un tableau structuré, au sein d'une fonction utilisant Evaluate:
    Nom : 2021-08-02_212705.png
Affichages : 689
Taille : 106,6 Ko

    On pourrait aussi utiliser directement RECHERCHEX dans la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function AgePhrase(Age As Integer) As String
      AgePhrase = Application.XLookup(Age, Range("t_Ages[Age]"), Range("t_Ages[Phrase]"), , -1)
    End Function

    Attention que telles que tu as écrit tes conditions, elles excluent les valeurs bornes (> au lieu de >=), d'où les bornes de mon tableau structuré qui ont été majorées de 1. A toi de voir si 60 doit renvoyer Middled-Aged ou Senior



    Citation Envoyé par Patrice740 Voir le message
    [...]
    Ta fonction va toujours renvoyer "infant"... et si tu supprimes la dernière ligne de ta fonction, elle renverra "Toddler" dès que l'âge passé sera supérieur à 1 puisque le dernier If "emportera la mise"... Quelle misère


    (Hors sujet) Il faut noter au passage qu'en VB.NET, Return fait sortir de la fonction à la manière d'un Exit Function, donc perso, je ne trouve pas chouette d'avoir plusieurs Return dans la même fonction. Par contre, on peut comme en VBA affecter la valeur de retour à la fonction.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    Bonjour Pierre,
    (Hors sujet) Il faut noter au passage qu'en VB.NET, Return fait sortir de la fonction à la manière d'un Exit Function, donc perso, je ne trouve pas chouette d'avoir plusieurs Return dans la même fonction. Par contre, on peut comme en VBA affecter la valeur de retour à la fonction.
    Contrairement au VBA en VB.net c'est monaie courante !

    Deplus affecter la valeur à la fonction c'est du VBA ça n'existe pas en VB.net c'est le return valeur qui le fait !

    Microsoft entretient la confusion en activant par défaut la librairie visual Basic!

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour Pierre,

    Contrairement au VBA en VB.net c'est monaie courante !
    Dans le cas d'une fonction telle que présentée, ça ne pose pas de problème, même si je trouve plus lisible d'utiliser Select Case (c'est peut-être ma déformation VBA). Mais d'une façon générale, je ne trouve pas clair qu'il y ait plusieurs sorties de fonction, mais je t'avoue que je ne suis pas un fan de vb.net, préférant C# (qui permet les mêmes choses, ceci dit), et j'aime toujours mieux retrouver l'intention du programmeur dans ce qu'il écrit.

    Je trouve que ce n'est pas clair pour vb.net d'avoir permis le Return et l'affectation à la fonction (comme en VBA) qui, elle, imposera le If Else IF ou le Select Case... Mais je suppose que ce sont des habitudes de langage et n'étant pas un spécialiste du vb.net, je n'irai pas plus loin dans le débat
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    [...]
    Deplus affecter la valeur à la fonction c'est du VBA ça n'existe pas en VB.net c'est le return valeur qui le fait ![...]
    Ben si, ça existe, justement. Tu peux faire l'un ou l'autre, et c'est là que je pense qu'il y problème. Les deux syntaxes suivantes sont valides en VB.NET
    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 AgePhrase(ByVal age As Integer) As String
            If age > 60 Then Return "Senior"
            If age > 40 Then Return "Middle-aged"
            If age > 20 Then Return "Adult"
            If age > 12 Then Return "Teen-aged"
            If age > 4 Then Return "School-aged"
            If age > 1 Then Return "Toddler"
            Return "Infant"
        End Function
     
        Function AgePhrase1(ByVal age As Integer) As String
            Select Case age
                Case > 60
                    AgePhrase1 = "Senior"
                Case > 40
                    AgePhrase1 = "Middle-Aged"
                Case Else
                    AgePhrase1 = "Infant"
            End Select
        End Function

    La fonction présentée dans le message initial s'écrirait ainsi en VBA, et perso, je n'aime pas du tout, mais vraiment pas du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function AgePhrase(Age As Integer) As String
      If Age > 60 Then AgePhrase = "Senior": Exit Function
      If Age > 40 Then AgePhrase = "Middle-Aged": Exit Function
      If Age > 20 Then AgePhrase = "Adult": Exit Function
      If Age > 12 Then AgePhrase = "Teen-Aged": Exit Function
      If Age > 4 Then AgePhrase = "School-Aged": Exit Function
      AgePhrase = "Infant"
    End Function
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    je confirme ça fonctionne! j'ai toujours utiliser Return!

    notes que je ne suis pas un autodidacte j'ai tous appris dans le cadre de la formation continue!

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

Discussions similaires

  1. [XL-2016] Message erreur avec instruction Declare
    Par munity dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/03/2018, 21h59
  2. Erreur compilaton avec l'instruction redim
    Par dedey63 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 20/01/2017, 20h58
  3. erreur avec l' instruction include
    Par saida29 dans le forum Fortran
    Réponses: 5
    Dernier message: 06/02/2015, 14h26
  4. Levée d'erreur avec l'instruction OPENRECORDSET
    Par formidable78 dans le forum VBA Access
    Réponses: 7
    Dernier message: 06/10/2008, 20h24
  5. [C#] Changer le focus avec la touche return
    Par sblanc74 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/10/2003, 18h38

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