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 :

Module de classe avec évènement Exit [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    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 : 67
    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 Module de classe avec évènement Exit
    Bonsoir le Forum,

    Je me lance dans les modules de classe.

    Le but.

    A la sortie du controle (parmi 30 numérique du même type), je souhaite un affichage sous format monétaire.

    J'ai lu la contribution de Patrick Toulon. Mais je n'arrive pas cependant à l'appliquer dans ce cas précis.

    Dans le code du formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim texto() As New ClasseTextBox
    Puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim ctrl As Control
    For Each ctrl In Me.Controls
            If TypeName(ctrl) = "TextBox" Then
                T = T + 1
                ReDim Preserve texto(1 To T)
                Set texto(T).groupetexto = ctrl
            End If
    Next
    Bien ntendu, ce code de module de classe n'est pas effectif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public WithEvents groupetexto As MSForms.TextBox
     
    Private Sub groupetexto_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    groupetexto.Text = Format(groupetexto.Text, "# ### ### €")
    End Sub
    car 11111 pour 11 111 € devient 1 € 1111, ce qui est logique.

    Et je ne peux pas gérer la longueur car celle-ci est variable.

    D'avance, merci pour vos lumières.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir Marcel
    Avec les modules de classe, les évènements Exit, AfterUpdate, BeforeUpdate ne sont pas gérés directement pour les TextBox.

    Néanmoins, pour ton cas et en utilisant l'évènement Change

    Module de classe (nommé Classe1)
    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
    Option Explicit
     
    Public WithEvents TB As MSForms.TextBox
     
     
    Private Sub TB_Change()
    Dim Str As String
     
    With TB
        Str = .Value
        Str = Replace(Replace(Str, " ", ""), "€", "")
        .Value = Format(Str, "# ### ### €")
        If Len(.Value) > 2 Then .SelStart = Len(.Value) - 2
    End With
    End Sub
    Module de ton userform
    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
    Option Explicit
     
    Dim CTB() As New Classe1
     
    Private Sub UserForm_Initialize()
    Dim Ctr As Control
    Dim i As Integer
     
    For Each Ctr In Me.Controls
        If TypeOf Ctr Is MSForms.TextBox Then
            i = i + 1
            ReDim Preserve CTB(1 To i)
            Set CTB(i).TB = Ctr
        End If
    Next Ctr
    End Sub
    PS: la virgule n'est pas gérée ainsi, mais vu le format désiré, ce n'est pas un souci

  3. #3
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    salut,

    @mercatog
    Avec les modules de classe, les évènements Exit, AfterUpdate, BeforeUpdate ne sont pas gérés directement pour les TextBox.
    ça je ne pouvais le soupçonner !

    y aurait-il une parade ? je veux dire une solution de contournement permettant d'intercepter de façon globale tout évènement du control ?

    "un sujet sur lequel je comptes me pencher bientôt"

  4. #4
    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 : 67
    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 Modules de Classe
    Bonjour NVCfrm, le Forum,

    Bonjour mercatog,

    En effet, dans le module de classe, les évènements proposés par l'éditeur VBE (pour NVCfrm) ne comprennent pas ceux que tu cites, d'où la difficulté.

    Je n'avais pas pensé à la méthode

    Code effectif, bien entendu

    Merci, et au plaisir.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut Simuler l'évènement Exit dans les TextBox d'un UserForm - module de classe
    Bonjour,

    Voici une démarche pour simuler l'évènement Exit dans les TextBoxes d'un UserForm.
    L'exemple permet de formater le nombre inscrit dans une TextBox (1234.56 devient 1 234.56 €) mais on peut faire toute autre chose.

    1) créer un UserForm1
    2) y insérer quelques TextBoxes, quelques Labels , un CommandButton1
    IMPORTANT : il est nécessaire qu'un contrôle TextBox soit le premier activé lors de l'ouverture du UserForm. Eventuellement, changer l'ordre de tabulation pour qu'un contrôle de ce type soit au premier rang.
    3) copier le code suivant dans la fenêtre de code du UserForm

    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
    Private WithEvents USF As clsUSFTextBoxExit
     
    Private Sub UserForm_Activate()
    Set USF = New clsUSFTextBoxExit
    USF.EventTextBoxExit Me
    End Sub
     
    Private Sub USF_ExitControl(ByVal ControlName As String)
    Dim CTL As MSForms.Control
    Set CTL = Me.Controls(ControlName)
    '--- Force le format (pour illustrer l'usage de l'évènement Exit) ---
    If TypeName(CTL) = "TextBox" Then CTL.Object.Text = Format(CTL.Object.Text, "# ### ##0.00 €")
    '--------------------------------------------------------------------
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set USF = Nothing
    End Sub
     
    Private Sub CommandButton1_Click()
    Unload Me
    End Sub

    4) créer un module de classe et le renommer clsUSFTextBoxExit
    5) copier le code suivant dans le module de classe

    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
    Public Event ExitControl(ByVal ControlName As String)
     
    Public Sub EventTextBoxExit(USF As MSForms.UserForm)
    Dim A$
    With USF
      If TypeName(.ActiveControl) = "TextBox" Then
        A$ = .ActiveControl.Name
        On Error GoTo Erreur
        Do
          DoEvents
          If .ActiveControl.Name <> A$ Then
            RaiseEvent ExitControl(A$)
            A$ = .ActiveControl.Name
          End If
        Loop
      End If
    End With
    Erreur:
    End Sub
    Pour plus de facilité, je joins les classeurs exemples Excel 2003 et Excel 2007.

  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 : 67
    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
    Bonjour PMO,

    Sur mon poste provisoire (Excel 2003), rien ne se passe.

    Ce code n'est pas effectif.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Salut MarcelG,

    J'ai oublié, dans mon précédent message, de préciser que l'ordre de tabulation des contrôles du UserForm avait son importance. J'y ai apporté la modification suivante :
    IMPORTANT : il est nécessaire qu'un contrôle TextBox soit le premier activé lors de l'ouverture du UserForm. Eventuellement, changer l'ordre de tabulation pour qu'un contrôle de ce type soit au premier rang.

    Vous ne devriez plus rencontrer de souci.
    Est-ce efficient comme cela ?
    A plus.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour a tous
    MarcelG
    On pourrait faire comme ca (a adapter a la classe texto)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Const monaie = "### ### ###"
    Private Sub TextBox1_Change()
    TextBox1 = Replace(TextBox1, "€", "")
    leformat = Right(monaie, Len(TextBox1))
    TextBox1 = Format(TextBox1, leformat) & "€"
    End Sub
     
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If ChrW(KeyAscii) Like "[!0-9]" Then KeyAscii = 0
    End Sub
    meme si c'est l'evenement change ca reste assez dynamique quand meme
    Au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    A Patrick
    Tu as testé?

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    oui je suis dessus
    Chaque caractères est placé de la meme manière que la constante "monaie"en partant de sa droite
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je ne crois pas que tu as testé.
    J'arrête pour ne pas polluer le topic d'interventions qui n'avancent en rien

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonsoir mercatog je ne vois pas pourquoi je mentirais sachant que ca m'intéresse pour apporter une fonction supplémentaire pour le model qui est dans les contributions

    Si je tape 123 ca marque 123
    Si je tape1234 sa marque 1 234
    Si je tape 12345 sa marque 12 345
    Etc......
    Et on ajoute le " €" a la fin

    Me voila un menteur maintenant lol
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Par hasard tu n'as pas une boucle infinie?

    Tiens fais ton test >> ICI

    J'attends confirmation ou de même ton fichier

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    J'ai essayer ton fichier
    C'est le meme code et ca fonctionne parfaitement
    Maintenant si tu parles de la longueur qui fait que tant que tu tapes une touche le dernier chiffre change en effet
    mais si tu regarde la classe dans les contributions ce dont MarcelG faisait référence je l'avait fait

    alors dans le keypress tu ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Len(TextBox1) = 12 Then KeyAscii = 0
    fait l'essai avec ca tu verra
    si ca n'est pas de ca que tu parle je comprend pas d'où viens le soucis
    regarde CECI!!
    Au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    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 : 67
    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 Module de classe
    Bonjour PMO2017, mercatog, Patrick.

    Bonjour le Forum,

    PMO2017,

    En effet, si l'ordre de tabulation place le contrôle Textbox en 1er index, alors le code est effectif.

    marcatog, Patrick

    Le code de Patrick, placé en module de classe, est également effectif.

    Merci à vous trois.

    En conclusion, je dirai seulement (...) que la signature de Patrick comporte un smiley que j'aime bien.

    Bonne journée à tous.

  16. #16
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour à tous
    Je n'arrive pas à faire fonctionner correctement la proposition de Patricktoulon car à chaque fois j'ai l'impression d'une boucle infinie sur changement (Excel se plante dès lors)
    J'ai refais le test sur 2003, 2007 et 2010

    Si quelqu'un pourrait joindre un fichier fonctionnel. Merci

  17. #17
    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 : 67
    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
    Salut mercatog,

    Le fichier joint est sous la version Office 2003.
    Les procédures sont effectives si on l'enregistre sous version 2010.
    Fichiers attachés Fichiers attachés

  18. #18
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Merci Marcel pour votre amabilité mais je vais reprendre la phrase de Patrick
    Me voila un menteur maintenant lol
    Le fichier bloque chez moi (j'ai maintenant sous la main Excel 2007)

    Avec un point d'arrêt et une exécution pas à pas, je confirme que les lignes du code initial font appel à l'évènement Change ... d'où la boucle infinie constatée chez moi dès le départ.


    En faisant comme ceci, le code de Patrick adapté fonctionne (sauf pour la suppression)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Const monaie = "### ### ###"
    Private Sub TB_Change()
    Dim Str As String, Leformat As String
     
    Str = TB
    Str = Replace(Str, "€", "")
    Leformat = Right(monaie, Len(Str))
    TB = Format(Str, Leformat) & "€"
    End Sub

  19. #19
    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 : 67
    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 module de classe
    Salut mercatog,

    (on peut se tutoyer)

    A tout hasard, la variable publique du module de classe est-elle déclarée sans évènement, autrement dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public TB As MSForms.TextBox
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public WithEvents TB As MSForms.TextBox
    ?

  20. #20
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Non non Marcel
    J'avais fais le re test sur ton fichier tel (ça bloque chez moi) et avec le pas à pas j'ai une boucle infinie.

    Avec le changement sur mon dernier post, ça fonctionne sans souci

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

Discussions similaires

  1. [VBA] Module de classe et évènement
    Par Caroline1 dans le forum Access
    Réponses: 9
    Dernier message: 20/03/2013, 23h23
  2. [XL-2003] Modules de classe événement click sur OLEObjects
    Par pijaku dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/08/2011, 08h25
  3. [Toutes versions] Problème avec un module de classe
    Par LeForestier dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/07/2009, 11h19
  4. [XL-2003] Soucis avec un module de classe en Vba
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2009, 11h09
  5. erreur avec withevents dans un module de classe
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/12/2007, 04h32

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