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 :

Exécuter code quand un controle (quel qu'il soit) perd le focus [Toutes versions]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 252
    Points : 74
    Points
    74
    Par défaut Exécuter code quand un controle (quel qu'il soit) perd le focus
    Bonjour,

    Je galère sur cette réalisation :

    - soit un formulaire avec x controles
    - je voudrais que, quand un contrôle perd le focus (ou le reçoit), un code s'exécute.

    Je connais les procédures gotfocus et lostfocus mais je n'ai pas envie de recopier le code sur 20 contrôles !

    Comment faire ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    peux-tu montrer le code ?
    Il faut créer une Sub ou une Function qui serait appelée par ces contrôles.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Cette question a été posé de nombreuses fois. Il se peut même qu'elle soit dans la faq.

    1) créer une fonction publique dans un module standard (PAS UN MODULE DE CLASSE donc pas dans le module du formulaire)
    2) sélectionner l'ensemble des contrôles concernés.
    3) dans les propriétés écrire
    Bien entendu la fonction doit être capable d'interpréter le contexte (formulaire actif / contrôle actif...)
    On peut y joindre des paramètres si besoin.

    On peut également passer par une classe si besoin.

    Cordialement,
    EDIT : oups ! tee nos posts se sont croisés
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 252
    Points : 74
    Points
    74
    Par défaut
    J'ai regardé dans la FAQ mais je n'ai pas trouvé de solution (je ne cherche peut être pas au bon endroit).

    Pour l'instant je fais ça :

    DANS UN MODULE CLASSIQUE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function Interface_GotFocus(ctrl As Control)
        ctrl.BorderColor = vbRed
        ctrl.BackColor = vbYellow
    End Function
     
    Function Interface_LostFocus(ctrl As Control)
        ctrl.BorderColor = vbGreen
        ctrl.BackColor = vbWhite
    End Function
    DANS MON FORMULAIRE

    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
    Private Sub Text0_GotFocus()
        Interface_GotFocus Screen.ActiveControl
    End Sub
     
    Private Sub Text0_LostFocus()
        Interface_LostFocus Screen.ActiveControl
    End Sub
     
    Private Sub Text2_GotFocus()
        Interface_GotFocus Screen.ActiveControl
    End Sub
     
    Private Sub Text2_LostFocus()
        Interface_LostFocus Screen.ActiveControl
    End Sub

    PROBLEME : je dois recopier le code pour tous mes contrôles. Je voudrais éviter d'avoir à copier/coller 40 fois le même code.

    J'ai essayé de passer par un module de classe en m'inspirant de discussion trouvée à droite à gauche mais ça ne donne pas grand chose. Ma plus grande avancée c'est ça (et finalement je n'utilise pas un module de classe :p ) et tous les contrôles deviennent rouge (je n'arrive pas à exécuter le code que si mes contrôles ont le focus :

    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
    Private m_colTextBox As Collection
     
     
    Private Sub Form_Activate()
     
        Dim ctl As Access.Control
     
        Set m_colTextBox = New Collection
        For Each ctl In Me.Controls
            If ctl.ControlType = acTextBox Then
                    m_colTextBox.Add ctl, ctl.Name
                    m_coltextbox_GotFocus         End If
        Next ctl
     
    End Sub
     
    Private Function m_coltextbox_GotFocus()
     
            Dim ctl As Access.TextBox
     
            For Each ctl In m_colTextBox
                    ctl.BorderColor = vbRed
            Next ctl
     
    End Function

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    En faisant un savant mélange du code 1 et 2 tu as tout pour que ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Interface_GotFocus()
        Screen.ActiveControl.BorderColor = vbRed
        ...
    Tu n'as plus qu'à appliquer mes directives 2 et 3 de mon précédent post.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut Code modifié mais fonctionne quand il veut
    Bonsoir,
    une possibilité très pratique pour créer automatiquement les procédures évènementielles c'est d'utiliser la méthode CreateEventProc :
    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
    Function CrtEventProc(frm As Form) As Boolean
     Dim ctl As Control, mdl As Module
     Dim lngReturn As Long
     
     On Error GoTo Error_CrtEventProc
     
     Set mdl = frm.Module
     
     For Each ctl In frm.Controls
        If ctl.ControlType = acTextBox Then
     ' Création des procédures événementielles GotFocus pour les contrôles de type TextBox
            lngReturn = mdl.CreateEventProc("GotFocus", ctl.Name)
     ' Insertion du texte de code
            mdl.InsertLines lngReturn + 1, vbTab & "Interface_GotFocus"
     ' Création des procédures événementielles LostFocus pour les contrôles de type TextBox
            lngReturn = mdl.CreateEventProc("LostFocus", ctl.Name)
     ' Insertion du texte de code
            mdl.InsertLines lngReturn + 1, vbTab & "Interface_LostFocus"
     ' Activation des procédure évènementielles
            ctl.OnGotFocus = "[Event Procedure]"
            ctl.OnLostFocus = "[Event Procedure]"
        End If
     Next ctl
     
    ' Sauvegarde des modifications
    DoCmd.Save acForm, frm.Name
    DoCmd.Close acForm, frm.Name, acSaveYes
     
    CrtEventProc = True
     
    Exit_CrtEventProc:
     Exit Function
     
    Error_CrtEventProc:
     MsgBox Err & " :" & Err.DESCRIPTION
     CrtEventProc = False
     Resume Exit_CrtEventProc
     
    End Function
    Le code s'exécute ainsi : call CrtEventProc(form_nomduformulaire)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    après quelques tests du code de mon précédent post, je me suis aperçu qu'il ne fonctionnait pas tout le temps notamment quand le formulaire contenait un sous-formulaire.
    Voici donc une nouvelle version plus stable :
    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
    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
    Function CrtEventProc(pNomfrm As String) As Boolean
    ' Création en masse de procédures évènementielles
     Dim frm As Form
     Dim ctl As Control, mdl As Module
     Dim lngReturn As Long
     
     On Error GoTo Error_CrtEventProc
     ' Ouverture du formulaire en mode création et masqué
     DoCmd.OpenForm pNomfrm, acDesign, , , , acHidden
     Set frm = Forms(pNomfrm)
     Set mdl = frm.Module
     
     frm.HasModule = True
     
     For Each ctl In frm.Controls
        If ctl.ControlType = acTextBox Then
    ' Création des procédures événementielles GotFocus pour les contrôles de type acTextBox
            lngReturn = mdl.CreateEventProc("GotFocus", ctl.Name)
     ' Insertion du texte de code
            mdl.InsertLines lngReturn + 1, vbTab & "Interface_GotFocus"
     ' Création des procédures événementielles LostFocus pour les contrôles de type acTextBox
            lngReturn = mdl.CreateEventProc("LostFocus", ctl.Name)
     ' Insertion du texte de code
            mdl.InsertLines lngReturn + 1, vbTab & "Interface_LostFocus"
      ' Activation des procédures évènementielles
            ctl.OnGotFocus = "[Event Procedure]"
            ctl.OnLostFocus = "[Event Procedure]"
        End If
     Next ctl
     
    ' Fermeture du formulaire et sauvegarde des modifications
    DoCmd.Close acForm, pNomfrm, acSaveYes
     
    CrtEventProc = True
     
    Exit_CrtEventProc:
     Exit Function
     
    Error_CrtEventProc:
     MsgBox Err & " :" & Err.DESCRIPTION
     CrtEventProc = False
     Resume Exit_CrtEventProc
     
    End Function
    Le code s'exécute ainsi : call CrtEventProc("NomduFormulaire")
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre régulier
    Inscrit en
    Février 2011
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 263
    Points : 100
    Points
    100
    Par défaut
    merci à tous pour votre participation.
    Cependant je galère, je ne m'en sors pas.

    @tee_grandbois : merci pour le code. Cependant, ce n'est pas exactement ce que je recherche. En effet, ton code crée un code pour chaque contrôle. Or je souhaiterais éviter de multiplier les codes.


    Je pense que mon problème pourrait être résolu avec un module de classe.
    J'ai fait quelques tests mais là encore je patine

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    En effet, ton code crée un code pour chaque contrôle. Or je souhaiterais éviter de multiplier les codes.
    Je pensais que la création automatique du code t'éviterai une saisie fastidieuse, or ce qui t'importe c'est le moins de code possible.
    Alors, explique-moi comment tu penses déclencher un évènement sur réception et perte focus d'un contrôle sans pour autant créer de code sur ces contrôles !
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    y a un truc qui m'échappe :
    8e8eClo démarre la discussion puis c'est AidezMoiSVP qui prend la suite.

    Vous êtes siamois ?
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    plutôt un clone !
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    mince après le clonage des brebis voilà qu'ils se mettent à cloner les devnautes.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    et les clowns clonés ?
    Nom : clowns.jpg
Affichages : 612
Taille : 17,8 Ko
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    Membre régulier
    Inscrit en
    Février 2011
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 263
    Points : 100
    Points
    100
    Par défaut
    AidezMoiSvp était mon premier compte.
    J'ai créé 8e8eClo me souvenant plus que j'avais déjà un compte sur le site !

  15. #15
    Membre régulier
    Inscrit en
    Février 2011
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 263
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonsoir,

    Je pensais que la création automatique du code t'éviterai une saisie fastidieuse, or ce qui t'importe c'est le moins de code possible.
    Alors, explique-moi comment tu penses déclencher un évènement sur réception et perte focus d'un contrôle sans pour autant créer de code sur ces contrôles !
    Je pensais faire comme ça :
    - à l'ouverture du formulaire, tous les contrôles textbox et combobox sont ajoutés à un module de classe
    - ensuite quand un contrôle du module de classe reçoit le focus, le code s'exécute.

    Après ce n'est peut être pas possible et dans ce cas j'utiliserai ton code.

  16. #16
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir 8e8eClo,
    après quelques recherches sur le net, j'ai fini par mettre la main sur la solution (en effet, elle existe) : http://allenbrowne.com/highlight.html

    C'est bien avec un module, mais pas de classe.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  17. #17
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 252
    Points : 74
    Points
    74
    Par défaut MERCI !
    Merci @tee_grandbois !

    J'avais déjà bien fouillé sur le web mais je n'avais pas du tout les mots qu'il fallait !
    Le code fonctionne nickel !

    Merci !

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

Discussions similaires

  1. sauter un chapitre de code quand une cellule vide
    Par mimic44 dans le forum Access
    Réponses: 7
    Dernier message: 09/01/2007, 09h09
  2. [VB.net] Exécuter code après ajout dans datagridview
    Par collaud_vb dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/09/2006, 11h45
  3. [A97] : Temps Exécution code en Minutes, Secondes
    Par JeremieT dans le forum Access
    Réponses: 2
    Dernier message: 07/06/2006, 11h44
  4. Exécuter code dans base A depuis base B
    Par Kloun dans le forum Access
    Réponses: 3
    Dernier message: 26/01/2006, 09h51
  5. Insérer un code quand on clique sur un smiles
    Par Blade dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/12/2004, 01h10

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