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 :

Utilisation d'une même fonction plusieurs fois dans un formulaire


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 34
    Points : 20
    Points
    20
    Par défaut Utilisation d'une même fonction plusieurs fois dans un formulaire
    Bonjour,

    je suppose que je ne suis pas le premier à chercher comment faire ça, mais j'ai eu beau chercher je n'ai pas trouvé de sujet comparable...

    J'ai créé une fonction publique sur un module à part, et je souhaite appeler cette fonction plusieurs fois dans un autre formulaire, afin d'utiliser les valeurs renvoyées par cette fonction.

    Mon problème est que la seule valeur que je peux récupérer est celle de la dernière utilisation de la fonction. Les valeurs précédentes ne sont pas stockées. C'est logique, et je comprends pourquoi ça me fait ça, mais je n'ai pas trouvé de solution... (je suis débutant en VBA, et en général je glane des bouts de code à droite à gauche pour les adapter à ce que je veux faire, donc c'est parfois un peu désordonné..).

    En gros je pense qu'il faudrait inclure à ma fonction une dimension variable (je ne suis pas sur du mot), dans les arguments par exemple, qui permette d'avoir à chaque fois une valeur propre et distincte pour chaque utilisation de la fonction... J'ai essayé des méthodes un peu à tatons, mais ça ne marche pas..

    Je ne sais pas si je suis bien clair, n'hésitez pas si vous voulez que j'explique différemment.

    Merci d'avance pour votre aide!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Il est peut être plus simple que je vous montre mon code actuel:

    Voici le code de la fonction, sur un module séparé:

    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
    Option Compare Database
    Option Explicit
    Global l_strFiltre As String
     
     
     
    Function MultiSelect(arg1 As ListBox)
     
    Dim l_strIn As String
    Dim l_intItem As Integer
     
     
    For l_intItem = 0 To arg1.ListCount - 1
            If arg1.Selected(l_intItem) = True Then
     
                l_strIn = l_strIn & arg1.Column(0, l_intItem) & Chr$(34) & "," & Chr$(34)
            End If
        Next
     If Len(l_strIn) > 0 Then
        l_strIn = Left(l_strIn, Len(l_strIn) - 3)
        l_strFiltre = "In (" & Chr$(34) & l_strIn & Chr$(34) & ")))"
     
    End If
     
     
    End Function


    Et le code dans mon formulaire, qui est un formulaire de recherche, contenant un sous-formulaire où s'affichent les résultats. La fonction créée s'applique en fait aux critères de recherche qui sont des zones de liste dans lesquelles plusieurs choix peuvent être selectionnés. Le filtre s'applique lorsqu'on clique sur un bouton.

    (j'ai remplacé les noms par des "XXX" dans un souci de confidentialité.)


    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
    48
    49
    50
    Sub FiltreStadeint_Click()
     
    Call MultiSelect(Form_Researchform.FiltreStadeint)
     
    End Sub
     
     
     
    Sub FiltreSecteur_Click()
     
    Call MultiSelect(Form_Researchform.Filtresecteur)
     
    End Sub
     
     
    Private Sub cmdfiltre_Click()
    Dim filter As String
     
    If IsNull(FiltreStadeint) Then
    If IsNull(filter) Then filter = filter & " AND "
    filter = filter & "(((XXX.[Stade d'intervention].Value) " & l_strFiltre
     
    End If
     
    If IsNull(Filtresecteur) Then
    If Not IsNull(filter) Then filter = filter & " AND "
    filter = filter & "(((XXX.[Secteur_Activite].Value) " & l_strFiltre
     
    End If
     
     
     
    Dim sql As String
        sql = "SELECT XXX.Nom, XXX.Type, XXX.[Stade d'intervention]," _
        & " XXX.Position, XXX.Secteur_Activite, Nz([XXX].[XXX]," & Chr$(34) & Chr$(34) & ") AS [XXX]" _
        & " , Nz([XXX].[XXX]," & Chr$(34) & Chr$(34) & ") AS [XXX], Nz([XXX].[XXX]," & Chr$(34) & Chr$(34) & ") AS [XXX]," _
        & " Nz([XXX].[XXX]," & Chr$(34) & Chr$(34) & ") AS [XXX], XXX.[XXX]" _
        & " FROM XXX"
     
        If Not IsNull(filter) Then
            sql = sql & " WHERE " & filter
     
     
     
       End If
     
       Me.Researchsubform.Form.RecordSource = sql
       Me.Researchsubform.Requery
     
    End Sub
    Donc en fait, ça a l'air de marcher sur le principe, sauf que je voudrais une valeur distincte de l_strFiltre pour chaque utilisation (Secteur et Stade d'intervention).

    En espérant que c'est un peu plus clair...

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Transforme ta fonction pour qu'elle retourne une chaîne de caractères plutôt que la stocker dans une variable globale.
    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
    Option Compare Database
    Option Explicit
     
    Function MultiSelect(arg1 As ListBox) As String
    Dim l_strFiltre As String
    Dim l_strIn As String
    Dim l_intItem As Integer
     
    For l_intItem = 0 To arg1.ListCount - 1
            If arg1.Selected(l_intItem) = True Then
     
                l_strIn = l_strIn & arg1.Column(0, l_intItem) & Chr$(34) & "," & Chr$(34)
            End If
    Next
     
    If Len(l_strIn) > 0 Then
        l_strIn = Left(l_strIn, Len(l_strIn) - 3)
        l_strFiltre = "In (" & Chr$(34) & l_strIn & Chr$(34) & ")))"
    End If
     
    ' La fonction retourne la valeur de type string 
    MultiSelect = l_strFiltre
    End Function
    Ensuite dans ton formulaire, tu déclares deux variables de porté globale l_strFiltreStade et l_strFiltreSecteur.
    Elles serviront à stocker le résultat de la fonction MultiSelect(...).
    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
    Option Compare Database
    Option Explicit
     
    ' Variables globales du module de code du formulaire
    Dim l_strFiltreStade As String
    Dim l_strFiltreSecteur As String
     
    Sub FiltreStadeint_Click()
     
    l_strFiltreStade = MultiSelect(Form_Researchform.FiltreStadeint)
     
    End Sub
     
     
     
    Sub FiltreSecteur_Click()
     
    l_strFiltreSecteur = MultiSelect(Form_Researchform.Filtresecteur)
     
    End Sub
    Maintenant, il te reste à adpater la sub cmdfiltre_Click() pour qu'elle incorpore l_strFiltreStade et l_strFiltreSecteur dans l'élaboration du filtre final.
    Par exemple (à valider, je ne garantis pas que ce code est correct):
    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
    Dim filter As String
     
    If IsNull(FiltreStadeint) Then
       If Len(l_strFiltreStade) > 0 Then
          If Len(filter) > 0 Then filter = filter & " AND "
          filter = filter & "(((XXX.[Stade d'intervention].Value) " & l_strFiltreStade
       End If
    End If
     
    If IsNull(Filtresecteur) Then
       If Len(l_strFiltreSecteur) > 0 Then
          If Len(filter) > 0 Then filter = filter & " AND "
          filter = filter & "(((XXX.[Secteur_Activite].Value) " & l_strFiltreSecteur
       End If
    End If
    A+

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    je ne vois votre réponse que maintenant, et il me semble que la solution que j'avais trouvée depuis est a peu près la même que la vôtre, en moins "propre" certainement!

    Je vais tester votre code, mais je pense que c'est tout bon!

    Merci beaucoup

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

Discussions similaires

  1. [WD-2003] Reporter la même donnée plusieur fois dans un document word
    Par David_70 dans le forum VBA Word
    Réponses: 6
    Dernier message: 04/07/2012, 10h47
  2. [AC-2007] Associer une même fonction à plusieurs evenement
    Par moi13 dans le forum IHM
    Réponses: 2
    Dernier message: 26/10/2011, 08h52
  3. [XL-2003] Tester si une valeur réapparait plusieurs fois dans une cellule
    Par apnw7931 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2011, 15h10
  4. Réponses: 39
    Dernier message: 24/08/2008, 17h16

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