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

VBA Access Discussion :

Utiliser une fonction dans un module


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Points : 23
    Points
    23
    Par défaut Utiliser une fonction dans un module
    Bonjour à tous,

    J'ai créé dans un module une fonction quis'appelle saison.

    J'arrive à utiliser cette fonction dans une requête, mais malheureusement, je n'arrive pas à l'utiliser au sein d'une procèdure vb (sub).

    Quelqu'un sait-il comment faire ?

    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Peux-tu nous expliquer comment est ta fonction (déclaration, emplacement), et comment tu essayes de l'utiliser (avec code etc...)

    Sinon, je ne vois pas ce que les membres peuvent faire pour t'aider, il faut mettre plus de renseignements.

    Starec

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Bonjour Starec,

    Les détails demandés sont les suivants :

    *Detail de la fonction créée

    J'ai créée cette fonction dans un module.

    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
    Public Function Surface(surf)
     
    Select Case surf
     
    Case 1 To 50
    Surface = "Su1"
     
    Case 50 To 60
    Surface = "Su2"
     
    Case 60 To 70
    Surface = "Su3"
     
    Case Else 'cas où la taille est supérieure à 70m²
    Surface = "Su4"
     
    End Select
     
     
    End Function
    * utilisation de la fonction

    Dans un formulaire j'ai un champ dans lequel j'entre la surface. Ensuite sur l'action après mise à jour du champ je voudrais appeler la fonction afin qu'un autre champ indique le groupe de regroupement de surface.

    A l'heure actuelle pour faire cette opération, j'ai tout simplement recopier le code de ma fonction dans ma procèdure, comme indiqué ci-dessous :

    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
    Private Sub Surface_AfterUpdate()
     
    Me.GpSurface.Value = 0
    surf = Me.Surface.Value
     
    Select Case surf
     
    Case 1 To 50
    gpsurf = "Su1"
     
    Case 50 To 60
    gpsurf = "Su2"
     
    Case 60 To 70
    gpsurf = "Su3"
     
    Case Else
    gpsurf = "Su4"
     
    End Select
     
    Me.GpSurface.Value = gpsurf
     
    End Sub
    J'espère que c'est un peu plus clair que le post précédent.

    En tout cas, merci pour ton aide starec.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Comme Starec est parti se coucher , je me permets d'intervenir:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Surface_AfterUpdate()  
      Me.GpSurface.Value = Surface(Me.Surface.Value)
    End Sub

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Merci =JOB=


    A vous deux vous faites les 3 huits... ;-)

    J'ai utilisé ton code, malheureusement, j'ai un message d'erreur qui dit incompatibilité de type au moment d'utiliser la fonction...

    Je vois pas où ça déconne.....

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Hello,
    Citation Envoyé par formidable78 Voir le message
    Merci =JOB=
    J'ai utilisé ton code, malheureusement, j'ai un message d'erreur qui dit incompatibilité de type au moment d'utiliser la fonction...
    Qu'est ce que << utiliser la fonction >> veut dire:
    (1) à la compilation ?
    (2) à l'exécution ?

    Si c'est à la compilation, le curseur est immédiatement placé sur la ligne incriminée: quelle est cette ligne ?

    Si c'est à l'exécution, la fenêtre qui affiche l'erreur doit te proposer d'effectuer un débogage et ainsi te placer dans le code à l'endroit qui provoque l'erreur: quel est ce code ?

    Merci de ta réponse.
    _

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    L'erreur se produit à l'éxécution.
    La ligne incriminée (en jaune lorsz du débogage) est la ligne qui appelle la fonction :
    Me.GpSurface.Value = Surface(Me.Surface.Value)

    L'erreur est : "Erreur d'exécution 13" si ça te parle, de mon côté je ne comprends rien à l'aide de cette erreur...

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    STOOOPPPPPEUUHHHHH !

    J'ai compris... mais l'interpréteur Visual Basic lui n'a pas compris, et pour cause...
    * le contrôle s'appelle Surface....
    * mais la fonction s'appelle *AUSSI* Surface !!!

    Ce n'était pas une bonne idée !
    Si tu veux que ça marche malgré les noms identiques, tu vas devoir préfixer le nom de la fonction Surface avec le nom du module de code où elle est définie: c'est nécessaire pour lever l'ambiguïté.

    Comment s'appelle le module où tu as codé la fonction Surface ?

    Par exemple, le module s'appelle MesFonctions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Surface_AfterUpdate()  
      Me.GpSurface.Value = MesFonctions.Surface(Me.Surface.Value)
    End Sub
    On peut aussi imaginer que le nom du module comporte des caractères "spéciaux" mal tolérés par VB: des espaces, des symboles, etc.
    Dans ce cas, le nom du module doit être encadré entre crochets afin d'indiquer à VB qu'il faut ignorer ces caractères spéciaux et traiter tout ça comme un simple nom.
    Par exemple, le module s'appelle Mes Jolies Fonctions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Surface_AfterUpdate()  
      Me.GpSurface.Value = [Mes Jolies Fonctions].Surface(Me.Surface.Value)
    End Sub
    Bien sûr, tu peux aussi renommer le contrôle; mais il faudra penser à bien modifier le nom des procédures événementielles de ce contrôle !
    _

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Bien vu l'artiste !!!


    Effectivement, le message a gentillement disparu, l'erreur bête de débutant....

    Malheureusement ça ne marche par tout à fait, au moment de l'éxécution, la fonction me renvoie un blanc et non pas de valeur. Pour test j'ai utilisé ceci :

    Private Sub Surface_AfterUpdate()


    MsgBox (Module1.NicoSurface(Me.Surface.Value))

    End Sub

    Ce que je ne comprends pas c'est que même quand je mets un chiffre à la place de me.surface.value, cela le msgbox me retourne tjs un blanc...

    ???????

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Je n'ai pas bien compris ton souci...

    Mais je constate que ta fonction n'est pas écrite en respect des "canons" de la programmation et ça pourrait bien être une source d'erreur.

    Aussi, voici une réécriture possible et surtout plus rigoureuse:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function Surface(surf As Integer) As String
        Select Case surf
        Case 1 To 50
            Surface = "Su1"
        Case 50 To 60
            Surface = "Su2"
        Case 60 To 70
            Surface = "Su3"
        Case Is > 70 'cas où la taille est supérieure à 70m²
            Surface = "Su4"
        Case Else 'les autres cas ???
            Surface = "???"
        End Select
    End Function

    Tu pourrais reporter la correction et tenter à nouveau...


    P.S. Apparemment tu as renommé ta fonction en NicoSurface, mais est-ce que tu as correctement reporté ce changement de nom à l'intérieur de la fonction... Qu'en dis-tu ?
    _

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Salut JBO,

    Merci pour ton soutien !!!!
    Le PS de ton dernier post était bien vu..... Effectivement je me suis embrouillé dans les renomages.... !!!!

    Merci beaucoup, j'ai vu grâce à cet exemple quelques écueils à éviter lors des prochaines utilisations et créations de fonction.

    Merci !!

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Tu pourrais épargner ta sueur et gagner du temps en procédant rigoureusement à la déclaration des variables dans tes procédures (je pense en particulier au renommage de la fonction).
    A la compilation, ton code sera alors vérifié par VBA pour garantir qu'il n'y a pas de risque d'oubli ou de fautes de frappe, aussi bien pour les noms de variables que les noms de procédures.

    Donc, pour que VBA procède à la vérification, il faut ajouter une option en début de chaque module de code:
    Tu peux aussi configurer l'environnement de développement pour forcer les déclarations explicites dans tout nouveau module.
    Exécute la commande Outils >> Options
    Dans la fenêtre [Options], sur l'onglet [Editeur] tu dois cocher [Déclaration des variables obligatoire].

    Bonne continuation !
    _

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

Discussions similaires

  1. Comment utiliser une fonction dans une fonction
    Par hatenaku dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2008, 20h00
  2. Comment utiliser une fonction dans une classe.
    Par metalamania dans le forum wxPython
    Réponses: 5
    Dernier message: 17/02/2008, 17h50
  3. Executer une fonction dans un module pas encore importe
    Par Aragorn_destroy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/06/2007, 14h21
  4. [VB6] Appel d'une fonction dans un module d'une dll
    Par speedster dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/06/2006, 17h37
  5. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 17h15

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