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 :

Récupération nom de controle sur click


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Récupération nom de controle sur click
    Bonjour,

    je recherche en vain la réponse à ma question.

    J'ai une étiquette avec une procédure qui se déclenche sur l'évènement click. Dans cette procédure j'ai besoin de réutiliser le nom de l'étiquette sur laquelle j'ai cliqué et qui a déclenché l'évènement.

    Le problème est que je ne peux pas utiliser activecontrol car l'étiquette ne peut pas avoir le focus.

    Existe t il une autre fonction pour me renvoyer le nom du controle ??


    Merci d'avance de votre aide

  2. #2
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Bonjour et bienvenue sur nos forums...

    Je ne comprends pas bien la question.

    Si tu déclenches l'évènement OnClick sur une étiquette, dans la procédure, tu connais forcément le nom de ton étiquette, non?

    Il faudrait que tu donnes ton code pour que l'on puisse mieux comprendre le contexte dans lequel tu évolues.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    merci de ton aide.
    Mon code est tout simple en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Étiquette139_Click()
        var = ActiveControl.Name
        Call Openetat
    End Sub
    Ma procédure openetat utilise ensuite var. Dans ce cas précis par exemple, je souhaiterais que var prenne la valeur étiquette139 (ce qui ne marche pas avec ActiveControl.Name).

    En effet, dans mon formulaire j'ai un grand nombre d'étiquettes et que je souhaiterais récupérer le nom automatiquement lorsque je clique dessus.

    Est ce clair ou pas trop ?

  4. #4
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Étiquette139_Click()
        var = "Étiquette139"
        Call Openetat
    End Sub
    ActiveControl est utile lorsque tu veux récupérer le nom du contrôle dans une procédure générique...

    Dans ce cas-ci, tu as forcément le nom de l'étiquette dans la procédure de chaque étiquette...


  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Effectivement, pardon, je n'ai pas été trés clair.

    Le but était de rédiger le code de manière générique pour le coller dans chaque procédure et éviter d'avoir à taper le nom de contrôle spécifique pour chaque contrôle.

    L'interet est que si par la suite je rajoute plusieurs étiquettes, je n'aurai qu'à coller mes deux lignes de code et ça marchera tout seul.

    Donc dans mon cas, effectivement activecontrol serait parfait. Le problème est que mon étiquette n'est jamais activecontrol.

    Désolé si mes explications sont un peu hachées.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    mais plutôt que de réécrire les mêmes lignes d'instructions écrit une seule fonction publique attendant en paramètre le nom du contrôle appelant.
    Ensuite, dans la feuille des propriétés de chaque étiquette Onglet événements :
    Sur Click : =nomdelafonction("nomducontrol")

  7. #7
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Ben, ça, c'est déjà ce qu'il fait, plus ou moins, avec le code que j'ai donné.

    Je comprends son problème s'il a 50 étiquettes, mais je ne vois pas d'autre solution, sauf à remplacer ses étiquettes par des boutons ( ce qui prendra plus de temps que ta solution ou la mienne)...

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ilank Voir le message
    Bonjour,
    mais plutôt que de réécrire les mêmes lignes d'instructions écrit une seule fonction publique attendant en paramètre le nom du contrôle appelant.
    Ensuite, dans la feuille des propriétés de chaque étiquette Onglet événements :
    Sur Click : =nomdelafonction("nomducontrol")

    Bonjour,
    effectivement, comme dit pierre mon problème est que dans ce cas je dois quand même rentrer nomducontrol manuellement. Comment faire pour l'obtenir automatiquement ?
    J'ai trouvé qu'en VB il est possible de le faire à l'aide de la fonction "sender" mais ça n'a pas l'air de fonctionner en VBA ?

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    voici une procédure pour t'éviter de taper à la main. L'avantage de cette procédure est que maintenant il te suffit de placer un label sur le formulaire pour qu'il puisse appeler ta fonction Openetat

    Ex: Au chargement du formulaire, affecter la propriété OnClick de tous les labels qui ne sont pas associés à un contrôle, avec le nom de la fonction publique Openetat qui attend en paramètre une variable string, le label ou le nom du contrôle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Form_Load()
     Dim Ctrl as Access.Control
     'Les labels qui disposent de l'événement OnClick ont pour
     'unique parent le formulaire.
     
     For Each Ctrl In Form.Controls
       If Ctrl.ControlType=AcLabel And Ctrl.Parent.Name=Me.Name Then
           'Ici, la fonction sera appelée avec le libellé du contrôle.
           'Utiliser Ctrl.Name pour passer en paramètre son nom
          Ctrl.OnClick="=OpeneTat (" & chr(34) & Ctrl.Caption & Chr(34) & ")"
      End if
     Next
    End sub
    Dans un module standard déclarer la fonction Openetat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function OpeneTat(LabelName As String)
     ....
     ....
    End function

  10. #10
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Hello !

    As-tu essayé ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomControl = ActiveControl.name
    ??

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    Une idée.

    Une étiquette liée à une zone de texte… qui a pour nom le contenu de l’étiquette.



    Si on associe un événement « Sur clic » à la zone de texte, il se déclenche aussi si on clique sur l’étiquette.

    L’astuce : la zone de texte a une largeur de 0, ça ne mange pas de pain !
    Dans mon exemple, je l’ai fait pour Nom2 et Nom3, ça donne ceci :





    Et si on clique sur l’étiquette « Nom2 » on a



    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
    Option Compare Database
    Option Explicit
     
    Private Sub QuiAppelle()
      MsgBox Me.ActiveControl.Name
    End Sub
     
    Private Sub Nom1_Click()
      Call QuiAppelle
    End Sub
     
    Private Sub Nom2_Click()
      Call QuiAppelle
    End Sub
     
    Private Sub Nom3_Click()
      Call QuiAppelle
    End Sub
    -------

    P.-S.

    S’il s’agissait d’associer une macro (et non une procédure), la méthode proposée par ilank irait bien, à la ligne 10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ctrl.OnClick="""NomDeLaMacro"""
    Par contre, je ne suis pas arrivé à faire fonctionner le code qu’il propose avec une procédure.
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip tst.zip (16,6 Ko, 112 affichages)

  12. #12
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour Bernard, Bonjour Michel,*


    Citation Envoyé par bernardmichel Voir le message
    Hello !

    As-tu essayé ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomControl = ActiveControl.name
    ??
    ActiveControl.name va renvoyer le nom du contrôle actif juste avant le clic : cliquer sur une étiquette indépendante ne lui donne pas le focus.





    * Biffer la mention inutile.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Je m'autorise ce que certains qualifieraient de petit déterrage, sous couvert de partager une solution que j'ai adopté récemment face à un problème comparable et dont les recherches préliminaires de solutions m'ont conduites ici.

    Si cette solution n'avait pas sa place ici, il est évident que les modérateurs pourraient la déplacer ou la supprimer…

    Pour simplifier la compréhension, on va dire que j'ai a effectuer le suivi du matériel dans un atelier.

    J'ai notamment une liste d'outils avec les marques et les références de chacun.

    J'ai donc un formulaire "FO_Principal" pour tout ce que l'atelier contient et un sous formulaire "FO_Outils_Liste" pour les outils.

    Pour retrouver facilement un outil dans la liste, j'utilise la fonction "Rechercher" Ctrl+F, bien entendu.

    Mais je voulais aussi un classement par lettre (A, B, C, etc…).

    Ma première idée était de faire un formulaire qui comprendrait une lettre par ligne, avec, pour chaque ligne (et donc chaque lettre) un sous formulaire qui ne contiendrait que les outils de la marques commençant par la lettre en question.

    Ma version d'Access ne permet pas de faire des sous formulaires continus sophistiqués dans des formulaires continus sophistiqués.

    On peut juste faire un sous formulaire liste dans un formulaire liste.

    En plus, l'un des intérêts du système, c'est qu'on ne voit le contenu d'une lettre qu'en cliquant dessus.

    Bref, j'ai laissé tomber, mais il y avait trop de marques pour laisser le sous formulaire outils classé tel quel.

    J'ai donc songé à faire un système avec boutons (un par lettre + un pour les chiffres 0 à 9 et un pour annuler les filtres).

    J'ai donc dû créer 28 boutons, que j'ai placés sur mon formulaire "FO_Principal", à côté du formulaire "FO_Outils_Liste" à filtrer.

    Comme vous le verrez ci-après, 2 de ces boutons ont une fonction particulière.

    Restent 26 boutons dont la seule différence réside dans une lettre.

    Je me suis donc posé la même question de recopier du code.

    J'ai accepté le fait de faire manuellement un copier/coller d'un même bouton et de changer son nom et la lettre inscrite dessus.

    Je sais qu'il y a des routines pour éviter de faire cela manuellement.

    Mais je me suis trouvé confronté au même problème de code VBA, un code par bouton.

    Et voici la solution que j'ai retenue (j'espère qu'en postant ici, je ne réinvente pas le fil à couper l'eau chaude…) :

    Sur la page de code du formulaire qui porte les boutons (ici mon formulaire "FO_Principal"), j'ai positionné la fonction suivante :
    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
    Public Sub LettreFiltre(Lettre As String)
    'Pour filtrer le formulaire FO_Outils_Liste par marque grace aux boutons lettres
     
    'Filtrage de sous-formulaires
    'Merci fbtsra
    'Merci sebing
    'https://www.developpez.net/forums/d1143295/logiciels/microsoft-office/access/vba-access/filtrer-sous-formulaire-suite-clic-donnee/
     
    'Utiliser Like dans une variable pour Form.Filter
    'Merci iDevlop
    'https://stackoverflow.com/questions/50860423/how-to-use-like-in-access-vba
     
    Forms![FO_Principal]![FO_Outils_Liste].Form.Filter = "Marque like '" & Lettre & "*'"
    Forms![FO_Principal]![FO_Outils_Liste].Form.FilterOn = True
    End Sub
    Ensuite les fonctions pour les boutons "ALL" (Annule le filtrage) et "0-9" (Filtre les marques commençant par 0 à 9)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CTRL_BTN_FLTR_ALL_Click()
    'Pour arreter le filtrage du formulaire FO_Outils_Liste
    'Stoppe le filtre directement
     
    'Filtrage de sous-formulaires
    'Merci fbtsra
    'Merci sebing
    'https://www.developpez.net/forums/d1143295/logiciels/microsoft-office/access/vba-access/filtrer-sous-formulaire-suite-clic-donnee/
     
    Forms![FO_Principal]![FO_Outils_Liste].Form.Filter = ""
    Forms![FO_Principal]![FO_Outils_Liste].Form.FilterOn = False
    End Sub
    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
    Private Sub CTRL_BTN_FLTR_0_9_Click()
    'Pour Filtrer le formulaire FO_Outils_Liste avec les marques commençant par 0 à 9
    'Fait le filtre directement
     
    'Filtrage de sous-formulaires
    'Merci fbtsra
    'Merci sebing
    'https://www.developpez.net/forums/d1143295/logiciels/microsoft-office/access/vba-access/filtrer-sous-formulaire-suite-clic-donnee/
     
    'Utiliser Like dans une variable pour Form.Filter
    'Merci iDevlop
    'https://stackoverflow.com/questions/50860423/how-to-use-like-in-access-vba
     
    'L'opérateur LIKE
    'Merci Fabrice Constans
    'https://loufab.developpez.com/tutoriels/access/operateurlike/
     
    Forms![FO_Principal]![FO_Outils_Liste].Form.Filter = "Marque like '[0-9]*'"
    Forms![FO_Principal]![FO_Outils_Liste].Form.FilterOn = True
    End Sub
    Ensuite il faudrait que je recopie et modifie 26 fois le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CTRL_BTN_FLTR_A_Click()
    LettreFiltre ("A")
    End Sub
     
    Private Sub CTRL_BTN_FLTR_B_Click()
    LettreFiltre ("B")
    End Sub
    Etc…

    J'ai fait le choix de me servir d'Excel, pour créer cette partie du code.

    Je l'ai déjà fait avec succès dans un cas où je devais modifier seulement un partie de multiples copies d'un même code.

    Voici comment je m'y suis pris (J'utilise la présentation code qui conserve la magnifique mise en page censée simuler Excel) :
    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
        || A |	                            B                                    |    C    |
    ====||===|=======================================================================|=========|
     1  ||   |Private Sub CTRL_BTN_FLTR_                                             |_Click() |
    ----||---|-----------------------------------------------------------------------|---------|
     2  ||   |''Pour filtrer le formulaire Liste avec les marques commençant par     |         |   Apostrophe x 2
    ----||---|-----------------------------------------------------------------------|---------|
     3  ||   |''Utilise Public Sub LettreFiltre(Lettre As String) en haut de page    |         |   Apostrophe X 2
    ----||---|-----------------------------------------------------------------------|---------|
     3  ||   |LettreFiltre ("                                                        |")       |   Guillemets
    ----||---|-----------------------------------------------------------------------|---------|
     5  ||   |                                                                       |         |
    ----||---|-----------------------------------------------------------------------|---------|
     6  || A |=$B$1&A6&$C$1                                                          |         |
    ----||---|-----------------------------------------------------------------------|---------|
     7  ||   |=$B$2&" "&A6                                                           |         |
    ----||---|-----------------------------------------------------------------------|---------|
     8  ||   |=$B$3                                                                  |         |
    ----||---|-----------------------------------------------------------------------|---------|
     9  ||   |=$B$4&A6&$C$4                                                          |         |
    ----||---|-----------------------------------------------------------------------|---------|
     10 ||   |End Sub                                                                |         |
    ----||---|-----------------------------------------------------------------------|---------|
     11 ||   |                                                                       |         |   Ligne vide
    ----||---|-----------------------------------------------------------------------|---------|
     12 ||   |                                                                       |         |   Recopier à partir de cette ligne
    ----||---|-----------------------------------------------------------------------|---------|
    La ligne 11 me permet d'avoir une ligne vide entre chaque fonction .

    Je me suis même permis le luxe de mettre deux lignes de descriptifs, dont une accordée, dans chaque occurrence de la fonction :

    Et voilà ce que Excel génère en sélectionnant les cellules A6 à C11 et en les recopiant vers le bas (l'incrémentation des lettres de A à Z se fait seule) :
    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
    ----||---|-----------------------------------------------------------------------|---------|
     6  || A |Private Sub CTRL_BTN_FLTR_A_Click()                                    |         |
    ----||---|-----------------------------------------------------------------------|---------|
     7  ||   |'Pour filtrer le formulaire Liste avec les marques commençant par A    |         |
    ----||---|-----------------------------------------------------------------------|---------|
     8  ||   |'Utilise Public Sub LettreFiltre(Lettre As String) en haut de page     |         |
    ----||---|-----------------------------------------------------------------------|---------|
     9  ||   |LettreFiltre ("A")                                                     |         |
    ----||---|-----------------------------------------------------------------------|---------|
     10 ||   |End Sub                                                                |         |
    ----||---|-----------------------------------------------------------------------|---------|
     11 ||   |                                                                       |         |
    ----||---|-----------------------------------------------------------------------|---------|
     12 || B |Private Sub CTRL_BTN_FLTR_B_Click()                                    |         |
    ----||---|-----------------------------------------------------------------------|---------|
     13 ||   |'Pour filtrer le formulaire Liste avec les marques commençant par B    |         |
    ----||---|-----------------------------------------------------------------------|---------|
     14 ||   |'Utilise Public Sub LettreFiltre(Lettre As String) en haut de page     |         |
    ----||---|-----------------------------------------------------------------------|---------|
     15 ||   |LettreFiltre ("B")                                                     |         |
    ----||---|-----------------------------------------------------------------------|---------|
     16 ||   |End Sub                                                                |         |
    ----||---|-----------------------------------------------------------------------|---------|
     17 ||   |                                                                       |         |
    ----||---|-----------------------------------------------------------------------|---------|
     18 || C |Private Sub CTRL_BTN_FLTR_C_Click()                                    |         |
    ----||---|-----------------------------------------------------------------------|---------|
     19 ||   |'Pour filtrer le formulaire Liste avec les marques commençant par C    |         |
    ----||---|-----------------------------------------------------------------------|---------|
     20 ||   |'Utilise Public Sub LettreFiltre(Lettre As String) en haut de page     |         |
    ----||---|-----------------------------------------------------------------------|---------|
     21 ||   |LettreFiltre ("C")                                                     |         |
    ----||---|-----------------------------------------------------------------------|---------|
     22 ||   |End Sub                                                                |         |
    ----||---|-----------------------------------------------------------------------|---------|
     23 ||   |                                                                       |         |
    ----||---|-----------------------------------------------------------------------|---------|
    Etc...

    On sélectionne ensuite le contenu des cellules ainsi générée (Colonnes A à C) et par un simple copier/coller, on les recopie sur la page VBA de Access :
    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
    Private Sub CTRL_BTN_FLTR_A_Click()
    'Pour filtrer le formulaire Liste avec les marques commençant par A
    'Utilise Public Sub LettreFiltre(Lettre As String) en haut de page
    LettreFiltre ("A")
    End Sub
     
    Private Sub CTRL_BTN_FLTR_B_Click()
    'Pour filtrer le formulaire Liste avec les marques commençant par B
    'Utilise Public Sub LettreFiltre(Lettre As String) en haut de page
    LettreFiltre ("B")
    End Sub
     
    Private Sub CTRL_BTN_FLTR_C_Click()
    'Pour filtrer le formulaire Liste avec les marques commençant par C
    'Utilise Public Sub LettreFiltre(Lettre As String) en haut de page
    LettreFiltre ("C")
    End Sub
    Etc...

    Grace à cette manœuvre, cela m'a pris quelques minutes pour générer proprement et de manière fiable 26 fonctions de code VBA.

    Il est évident que si j'avais du créer 50 fonctions de code VBA, avec à chaque fois le nom d'une commune par exemple, il m’aurait suffit de remplacer le contenu de la colonne lettres par les noms de communes.

    L'autre avantage, c'est que, en conservant le fichier Excel dans un coin, je peut modifier le code de tous les boutons en modifiant juste le contenu des premières lignes du tableur et en faisant un nouveau copier/coller.

    Voilà.

    Encore une fois, je ne sais pas si ce message est à sa place ici, ou même s'il a une quelconque utilité.

    Merci de votre patience.

  14. #14
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 372
    Points : 19 781
    Points
    19 781
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Il doit y avoir plus simple pour la dernière partie.

    Transformer la procédure LettreFiltre en fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function LettreFiltre(Lettre As String) 
    ...
    End Function
    Ensuite, affecter cette fonction avec le bon argument à la propriété OnClick des boutons de commandes "CTRL_BTN_FLTR_A", etc. (par exemple sur ouverture du formulaire contenant les boutons de commande) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Form_Open(Cancel As Integer)
        Dim i As Long
     
        ' parcours des codes ascii de A -> Z
        For i = 65 To 90
            ' affectation de la fonction à l'événement sur clic du bouton de commande "CTRL_BTN_FLTR_" & Chr(i) : Chr(65) = "A"
            Me("CTRL_BTN_FLTR_" & Chr(i)).OnClick = "=LettreFiltre('" & Chr(i) & "')"
     
        Next i
     
    End Sub
    Cdlt,

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Citation Envoyé par User Voir le message
    Bonjour,
    [...]
    Ensuite, affecter cette fonction avec le bon argument à la propriété OnClick des boutons de commandes "CTRL_BTN_FLTR_A", etc. (par exemple sur ouverture du formulaire contenant les boutons de commande) :
    [...]
    Cdlt,
    Si j'ai bien compris le code proposé, à l'ouverture du formulaire, le code attribue la fonction à la propriété OnClick des boutons qui portent des lettres et dont le nom commence ici par "CTRL_BTN_FLTR_".

    Cela signifie que, jusqu'à l'ouverture du formulaire, les boutons n'ont pas d’événement associés, en tout cas pas sur OnClick.

    C'est bien cela ?

    Merci.

  16. #16
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 372
    Points : 19 781
    Points
    19 781
    Billets dans le blog
    65
    Par défaut
    Oui c'est bien ça.

    Une autre possibilité c'est d'affecter définitivement la fonction à l'événement OnClick des boutons de commande, en ouvrant le formulaire en mode création, puis en le fermant ensuite avec enregistrement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        DoCmd.OpenForm "Formulaire1", acDesign
     
        For i = 65 To 90
            ' affectation de la fonction à l'événement sur clic du bouton de commande "CTRL_BTN_FLTR_" & Chr(i)
            Forms!Formulaire1("CTRL_BTN_FLTR_" & Chr(i)).OnClick = "=LettreFiltre('" & Chr(i) & "')"
     
        Next i
     
        DoCmd.Close acForm, "Formulaire1", acSaveYes

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonsoir.

    Votre dernière proposition est à la fois très simple et ouvre en même temps à de très nombreuses perspectives.

    Merci.

Discussions similaires

  1. Récupération du nom et de la description sur click kml
    Par saxrub dans le forum IGN API Géoportail
    Réponses: 11
    Dernier message: 27/02/2010, 10h56
  2. Réponses: 2
    Dernier message: 09/06/2009, 11h20
  3. [AC-2003] boucle sur le nom de controles
    Par piere42 dans le forum IHM
    Réponses: 1
    Dernier message: 01/04/2009, 12h17
  4. [VBA]filtrage des controles sur leur nom
    Par Invité dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/04/2007, 14h23
  5. Erreur sur click dans un controle Onglet
    Par jetlagger dans le forum IHM
    Réponses: 6
    Dernier message: 17/04/2007, 10h23

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