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 :

Appel de fonction introuvable [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut Appel de fonction introuvable
    Bonjour bonjour,

    J'interviens actuellement sur un fichier excel bourré de macro et là, je bloque actuellement sur un point un peu bizarre. Je m'explique :
    La feuille principale de saisie de donnée se "construit", c'est à dire que les colonnes d'en-tête et certaines données préremplie se mettent à jour en lançant une des macro présentes dans le fichier.
    J'ai une fonction, entre autre, qui permet de faire qu'une case d'une colonne devienne un menu déroulant avec les données venant d'une feuille cachée.
    Et c'est là que j'ai mal, cette fonction, je l'ai trouvé sans souci. Par contre, j'ai regardé TOUTES les autres macros et je ne vois jamais d'appel à cette fonction. J'y ai mis un pop-up (vive le début pop_up hein) et je vois bien que cette fonction est utilisée.

    Ainsi, ma question est la suivante : Il y aurait-il un bout de code, de fonction ou une option qui permet de voir depuis où ma fonction est appelée ? J'en ai besoin car, justement, c'est l'appel de cette fonction qui ne marche pas dans tous les cas...

    En espérant avoir été assez clair

    Bisous bisous

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 207
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    S'il s'agit d'une fonction (Function), alors une MsgBox ne s'affichera pas
    Function sous-entend que le but du code est de renvoyer un résultat, mais ne permet pas certaines interactions comme afficher une boite de message
    Il faut une Sub pour afficher une MsgBox, pas une Function
    (Et appeler une Sub depuis la Function ne marchera pas mieux)

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 437
    Par défaut
    Bonjour,

    Il reste encore possible que la formule soit appelée au niveau d'une cellule. Une façon de vérifier cela:
    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 FindText()
        Dim Sh As Worksheet
        Dim rUR As Range
        Dim Loc As Range
        For Each Sh In ThisWorkbook.Worksheets
            Debug.Print Sh.Name
            Set rUR = Sh.UsedRange
            For Each Loc In rUR
                If InStr(Loc.Formula, "NomFormule") > 0 Then
                    Debug.Print Sh.Name, Loc.Address, Loc.Formula
                    Stop
                End If
            Next Loc
        Next
        Set rUR = Nothing
        Debug.Print "--- Fin ---"
    End Sub
    Cordialement.

  4. #4
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses, je n'avais eu de notification !

    Pour le premier commentaire, en effet, désolé de l'abus de langage dont j'ai fait preuve, il s'agit en effet du mot clé sub et donc procédure.

    Pour le bout de code donnée, merci beaucoup. J'ai essayé mais j'ai pas dû le mettre au bon endroit, comment faire en sorte qu'il soit appelé correctement ? Je connais le vb via vb.net mais sur excel c'est relativement nouveau

    Bonne année

    Bisous bisous

  5. #5
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 437
    Par défaut
    Bonjour,

    Pour le code, il faut le placer dans un module et de là y lancer la procédure (F5). Le résultat s'affiche dans la fenêtre Exécution (ctrl-g).

    Cordialement.

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonne année, chers amis du Forum.
    Santé, joies et accomplissement

    Bonjour à vous,

    Pour ma part, je ne pratique pas les sorties anticipées de boucles
    Mieux vaut à mon avis, chercher la formule jusqu'à ce qu'on la trouve.

    D'autre part, il est plus efficace d'effectuer la recherche au sein des cellules spéciales contenant des formules.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Option Explicit
     
    Dim trouve As Boolean
    Dim laformule As String
    Dim n As Byte
    Dim t As Range
     
    Public Sub cherche_formulas_in_workbook()
     
    laformule = "=SUM"
     
    trouve = False
     
    n = 0
     
    Do
            n = n + 1
            Call cherche_Formule_in_wks(numfeuille:=n)
    Loop While n < ThisWorkbook.Sheets.Count And trouve = False
     
    If trouve = True Then
            MsgBox Prompt:="Résultat: Feuille " & Worksheets(n).Name & " - Cellule " & t.Address
            Set t = Nothing
    Else
            MsgBox Prompt:="Aucune cellule trouvée"
    End If
     
    End Sub
     
    Public Sub cherche_Formule_in_wks(numfeuille As Byte)
     
    Debug.Print Worksheets(numfeuille).Name
     
    On Error Resume Next
     
    With Worksheets(numfeuille).Cells.SpecialCells(Type:=xlCellTypeFormulas)
            If .Count = 0 Then
                    trouve = False
            Else
                    Set t = .Find(what:=laformule, Lookat:=xlPart, LookIn:=xlFormulas)
                    trouve = (Not t Is Nothing)
            End If
    End With
     
    On Error GoTo 0
     
    End Sub
    A adapter, bien sûr.

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Hé salut Pierre,

    C'est quoi la pile d'appel?

    Merci à toi.

  8. #8
    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.

    Pas d'accord avec ce qui est dit par tototiti. Procédure ou fonction, c'est kif, sauf qu'une procédure ne renvoie pas de valeur. C'est l'équivalent d'une fonction void d'autres langages qui n'ont que des fonctions et qui ne connaissent pas les "procédures SUB" propres au VBA. D'ailleurs, MsgBox est une fonction (qui renvoie donc une valeur, celle du bouton sur lequel on clique), mais qu'on utilise parfois comme une instruction (une procédure). On peut donc toujours utiliser une fonction comme une procédure (l'inverse n'est pas vrai, bien entendu).


    Pour le code donné par Eric, il faut bien entendu remplacer NomFormule par le nom de la sub/function recherchée. Je précise que lorsque le code s'arrête sur la fonction, on peut utiliser la pile d'appels en VBA pour voir qui a appelé la fonction. Si la pile ne contient que l'appel de la fonction, c'est probablement que c'est une formule qui a déclenché l'appel.
    "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...
    ---------------

  9. #9
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 207
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je sais ça a plusieurs années, désolé

    Visiblement ce que dit Pierre est juste
    Pourtant j'ai le souvenir que dans d'anciennes versions d'Excel, mettre une Msgbox dans une Function ne fonctionnait pas
    Comme quoi parfois on part du principe que rien ne change...
    Merci de m'avoir fait retester ça, ça m'évitera de dire des bêtises en formation

    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Pas d'accord avec ce qui est dit par tototiti. Procédure ou fonction, c'est kif, sauf qu'une procédure ne renvoie pas de valeur. C'est l'équivalent d'une fonction void d'autres langages qui n'ont que des fonctions et qui ne connaissent pas les "procédures SUB" propres au VBA. D'ailleurs, MsgBox est une fonction (qui renvoie donc une valeur, celle du bouton sur lequel on clique), mais qu'on utilise parfois comme une instruction (une procédure). On peut donc toujours utiliser une fonction comme une procédure (l'inverse n'est pas vrai, bien entendu).


    Pour le code donné par Eric, il faut bien entendu remplacer NomFormule par le nom de la sub/function recherchée. Je précise que lorsque le code s'arrête sur la fonction, on peut utiliser la pile d'appels en VBA pour voir qui a appelé la fonction. Si la pile ne contient que l'appel de la fonction, c'est probablement que c'est une formule qui a déclenché l'appel.

  10. #10
    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 MarcelG Voir le message
    [...]
    Pour ma part, je ne pratique pas les sorties anticipées de boucles[...]
    Je n'aime pas non plus. Je bannis systématiquement les EXIT et les STOP de mes boucles. les boucles FOR et FOR EACH ont été créées pour itérer un certain nombre de fois (FOR) ou pour passer sur chaque objet d'une collection (FOR EACH). C'est donc programmer contre nature que de sortir prématurément de ce genre de boucle. Quand on programme un FOR EACH et qu'on met un EXIT ou un STOP dedans, ca revient à dire: je vais passer sur chaque objet (FOR EACH) et dans la boucle, on dit "Ben non, finalement, je ne vais pas passer sur chaque objet"... C'est pour moi illogique. Il est préférable d'utiliser une boucle DO WHILE ou DO UNTIL et de prévoir une condition de sortie...



    Citation Envoyé par MarcelG Voir le message
    Hé salut Pierre,

    C'est quoi la pile d'appel?

    Merci à toi.
    C'est la pile qui contient les appels des procédures et fonctions. C'est une pile LIFO (Last In, FirstOut). Si on examine le code suivant, on peut voir que les appels sont chainés et la pile d'appels les empilent et dépilent...


    L'illustration de gauche montre l'empilement des appels (A appelle B qui appelle C). En quittant C, on revient à B (C, le dernier entré, est sorti, c'est-à-dire dépilé) puis l'appel de D vient s'ajouter sur la pile (illustration de droite)

    Nom : 2022-01-04_130439.png
Affichages : 172
Taille : 99,7 Ko


    C'est la pile des appels qui permet notamment de se brancher sur la routine d'erreur. Lorsqu'une erreur survient, le processeur passe la main au processeur d'erreur qui remonte la pile des appels jusqu'à trouver un On Error avec son étiquette de branchement pour repasser la main au processeur à cette adresse et, s'il ne trouve pas de gestion d'erreur, entre en débogage ou plante le code, selon les options de gestion d'erreur définies au niveau des options du VBE, Visual Basic Editor.

    Nom : 2022-01-04_130841.png
Affichages : 174
Taille : 23,5 Ko

    C'est pourquoi je soutiens l'idée de mettre systématiquement un On Error sur chaque procédure évènementielle, de manière à avoir toujours une étiquette de gestion d'erreur dans la pile, puisque par définition, la procédure évènementielle sera toujours la première de la pile*... C'est aussi pour cela que j'écris dans ce billet qu'un code ne doit jamais appeler un code évènementiel...




    * C'est évidemment à nuancer pour le programmeur qui créerait des classes personnalisées avec gestion d'évènement, mais les règles d'encapsulation feraient qu'il n'y aurait normalement pas d'interférences entre les codes évènementiels de la classe (qui peuvent se trouver n'importe où dans la pile d'appel) et ceux qui gèrent les évènement de l'IHM (Interface Homme-Machine, ici Excel) qui eux doivent toujours être les premiers de la pile.
    "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...
    ---------------

  11. #11
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Merci, Pierre.

    J'en apprends tous les jours.
    Cela fait 12 ans que çà dure et ce n'est pas près de finir.

  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
    Salut Marcel,

    Tant mieux. J'en apprends tous les jours aussi

    Pris par ma réponse, je ne t'ai même pas salué => Donc, Salut Marcel, et surtout bonne année 2022, qui sera ce que nous déciderons d'en faire. Ce n'est pas à l'année 2022 d'être bonne ou heureuse, mais à nous, chacun(e) à notre niveau
    "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 très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour Bonjour,

    Je vois que cette discussion a fait parler et est très instructives, merci à tous

    Pour en revenir à mon sujet, j'ai pu exécuter le code comme donné en instruction (nouveau module et ctrl+g) et ca semble mieux fonctionner, merci.

    Dans la partie "exécution", j'ai le nom de l'onglet qui me touche, donc puis-je en déduire que l'appel de ma fonction se fait donc directement dans l'onglet et pas dans les autres macros ?

    Si oui, comment y accèder ?

    En fait, dès que l'on dépasse les x colonnes (x étant un nombre précis), un bout de code (cette procédure) ne s'exécute plus et je n'arrive pour le moment, pas à voir pourquoi...

  14. #14
    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
    Perso, je n'ai pas compris ce que tu expliques.

    Dans la fenêtre Exécution, tu ne peux pas avoir le nom de l'onglet. La fenêtre Exécution ne contient que ce que tu y mets ou ce qui y est placé par un Debug.Print.

    As-tu regardé la pile d'appel? Peux-tu mettre un point d'arrêt sur le début de la procédure pour voir après quels manips on accède à cette sub?
    "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...
    ---------------

  15. #15
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    J'avais un point d'arrêt mais cela ne donnait jamais rien...
    Pour plus de précision, c'est un fichier excel avec trois onglets :
    Un onglet qui sert à lister les menus déroulants et les données qui seront à mettre dedans
    Un onglet qui paramètre les colonnes qui vont devoir se trouver dans l'onglet de saisie avec leur type, obligatoire oui/non et un lien vers l'onglet menu déroulant si la colonne en question est un menu déroulant
    L'onglet de saisie qui se construit via l'exécution de macro en fonction de ce qu'il y a dans les deux autres onglets

    Dans mon cas, tout fonctionne sauf à partir du moment où il y avait plus de 50 colonnes à mettre dans l'onglet de saisie. Quand cette condition était attente, les colonnes étaient bien générées mais les menus déroulants ne se généraient plus.
    Le souci principal est que, quand on m'a envoyé le document, on a pas su me dire où la fonction qui génère la liste déroulante était appelée. J'ai donc cherché dans toutes les macros sans trouver mon bonheur. D'où ma question initiale pour savoir comment trouver l'origine de l'appel d'une fonction car pour moi le souci ne pouvait venir que de là.

    C'est peut-être, du coup, une coïncidence mais en exécutant le code donné, je me trouve avec une liste dont une qui correspond au nom de la feuille de saisie. (Il y a d'ailleurs un debug.print dans le bout de code qui a été donné donc je pense que je ne pense pas à une coïncidence) Je vais donc regardé dans les macros qui sont au niveau de la feuille (je ne l'avais pas fait avant car la personne m'ayant demandé de l'aide m'avoir dit avoir regardé toute cette macro et que justement le souci ne venait pas de là.
    Finalement, j'ai trouvé l'appel de ma fonction générant les menus déroulants dans cette feuille là et, incroyable, la boucle qui fait l'appel n'allait pas au délà de la range de 50 colonnes. Enfin plutôt, c'était une condition qui la "bloquait" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not g_RAZenCours And Range("AZ1").Value = "" Then
    En étendant la range, forcément, ca refonctionne...

    J'espère avoir pu être plus clair. Je me doute ne pas l'avoir été assez avant mais je prenais moi même connaissance du sujet et je me retrouvais décontenancé de voir qu'une fonction, qui tourne correctement, n'avait pas d'appel (enfin, j'aurais dû tout regarder de moi même et ne pas croire en la personne m'avoir assuré que ca pouvait être partout sauf à cet endroit )...

    En tout cas, cette discussion m'a apprise des trucs et je vous en remercie tous

  16. #16
    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
    MsgBox a toujours pu être utilisé comme une fonction, car sans cela on n'aurait pas pu récupérer le bouton sur lequel on a cliqué.

    Pour savoir si une instruction/fonction est une fonction, on peut d'abord se demander si on a besoin de récupérer une valeur (autrement dit, si on peut la mettre à droite du signe =) et on peut regarder l'infobulle. s'il y a un "as ..." derrière la parenthèse fermante, c'est que l'on peut l'utiliser comme fonction

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MsgBox "Bonjour" ' Instruction
    Reponse = MsgBox("Bonjour") ' Fonction


    Voici l'illustration d'une infobulle indiquant que MsgBox peut être utilisé comme fonction
    Nom : 2024-10-15_100722.png
Affichages : 66
Taille : 5,3 Ko
    "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...
    ---------------

  17. #17
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 207
    Billets dans le blog
    2
    Par défaut
    Ok pour le fonctionnement de MsgBox, il n'a jamais changé, ok

    Mais il fut une version Excel (2007, 2003, avant ?) où mettre une MsgBox dans une Function faisait que la MsgBox n'apparaissait même pas, qu'on appelle la Function de VBA ou de la feuille de calcul
    Ce n'est plus le cas

  18. #18
    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
    Possible, mais e ne comprends pas ce que tu veux dire par "mettre une msgbox dans une 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...
    ---------------

  19. #19
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 207
    Billets dans le blog
    2
    Par défaut
    un exemple (parfaitement fonctionnel maintenant, mais à l'époque je me rappelle qu'on avait testé sans succès)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function BienDormi() As Long
    Dim Rep As Long
        Rep = MsgBox(prompt:="Avez-vous bien dormi ?", Buttons:=vbYesNo)
        BienDormi = Rep
    End Function
     
    Sub TestBienDormi()
        If BienDormi = vbYes Then Range("A1").Value = "Ok" Else Range("A1").Value = "NOk"
    End Sub

  20. #20
    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
    Ok. Merci. Pas de souvenirs d'une dysfonctionnement de ce code dans des versions antérieures d'Excel.

    De mon côté, il me semble que j'ai toujours codé comme ça.

    Bonne journée
    "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...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appel d'une fonction introuvable
    Par Oberown dans le forum ASP
    Réponses: 5
    Dernier message: 20/04/2006, 14h05
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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