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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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

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