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 :

[VBA-E 2000]Evènement Enter sur TextBox créé dynamiquement


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut [VBA-E 2000]Evènement Enter sur TextBox créé dynamiquement
    Bonjour.

    J'ai un classeur qui crée un TextBox sur une UserForm de manière dynamique.
    Le TextBox est déclaré comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public WithEvents TxtD As MSForms.TextBox
    Une fois créé, mon contrôle s'appelle TextBox1
    J'arrive à piéger l'évènement Change de ce TextBox, mais pas l'évènement Enter.
    Voici la procédure qui me permet de piéger l'évènement Enter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub TextBox1_Enter()
    	MsgBox "Ok"
    End Sub
    Celle qui me permet de piéger l'évènement Change est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub TextBox1_Change()
    	MsgBox "Contenu"
    End Sub
    Ce qui me paraît étrange c'est que lorsqu'on crée un TextBox manuellement, dans les listes déroulantes qui permettent de sélectionner un contrôle et les procédures associées, apparaît la procédure Enter (en gras si elle a été écrite et en normal sinon), tout comme la procédure Change ou DblClick.

    Quand on crée un TextBox de manière dynamique, certaines de ces procédures disparaissent des barres d'outil et c'est le cas de Enter, ce qui ne me rend pas très optimiste pour la suite de mon problème.

    Quelqu'un a-t-il déjà eu le problème?
    Merci.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ce qui me paraît étrange, c'est que tu aies effectivement un événement sur Textbox1...
    Essaie de créer la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TxtD_Enter()
    	MsgBox "Ok"
    End Sub
    Tu dis

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Effectivement c'était plutôt étrange et pour tout dire ça risquait pas de marcher.
    Néanmoins j'ai essayé avec ce code:
    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
     
    Option Explicit
    Public WithEvents TB As MSForms.TextBox
    Public WithEvents L As MSForms.Label
    Public WithEvents B As MSForms.CommandButton
     
    Private Sub UserForm_Initialize()
        Set TB = UserForm1.Controls.Add("Forms.TextBox.1")
        Set L = UserForm1.Controls.Add("Forms.Label.1")
        Set B = UserForm1.Controls.Add("Forms.CommandButton.1")
        L.BackColor = &H80000005
        L.Left = TB.Width
        B.Left = L.Left + L.Width
     
    End Sub
     
    Private Sub B_Click()
        MsgBox "clic"
    End Sub
     
    Private Sub L_Click()
        MsgBox "vlic"
    End Sub
     
    Private Sub TB_exit(ByVal cancel As Boolean)
        MsgBox "tu sors"
    End Sub
     
    Private Sub TB_Change()
        MsgBox "change"
    End Sub
     
    Private Sub TB_enter()
        MsgBox "entrée"
    End Sub
    Certains évènements fonctionnent et pas d'autres: le clic sur le CommandButton est ok, sur le Label aussi, le Change du TextBox fonctionne mais ni le Enter ni le Exit du TextBox ne sont détectés.
    Merci Ouskel'n'or.

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir

    Je vais peut être dire une grosse bétise mais il me semble que l'évènement Enter (tout comme BeforeUpdate, AfterUpdate et Exit) n'est pas associé à MSForms.TextBox mais à MSForms.Control. C'est pour ça qu'il n'est pas disponible pour ton objet créé dynamiquement.


    bonne soirée
    michel

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Bonsoir,
    j'aurais bien aimé que ce soit ça mais apparemment c'était une fausse piste.
    J'ai déclaré mon TextBox comme ceci pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public WithEvents TB As MSForms.Control
    Au moment ou la UserForm se charge, l'erreur suivante se produit:
    "L'objet ou la classe ne gère pas le jeu d'évènements".
    J'ai bien vérifié dans l'aide et il semble bien que cet évènement s'applique au TextBox.
    Je vais essayer avec LostFocus.
    Merci et bonne soirée.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 101
    Par défaut
    Bonjour.
    En fait ce n'est pas l'évènement LostFocus qui convient pour un TextBox, c'est BeforeUpdate ou AfterUpdate. Mais même en utilisant ces évènements ça ne fonctionne pas: je n'arrive pas à les piéger lorsque les contrôles sont créés de manière dynamique.

    Mais voici le fond du problème:

    J'ai deux classeurs: un classeur de code et un classeur de résultats créé par mon classeur de code lorsque le code du classeur de code s'exécute.

    Voici comment se déroule l'exécution du code de mon classeur de code:
    1-On remplit des cellules dans mon classeur de résultats et on y insère des formules.
    2-Le classeur de code écrit dans le module de code d'une Userform nommée "SaisieDonnees" de mon classeur de résultats la procédure "UserForm_Initialize" et quelques autres procédures évènementielles nécessaires au fonctionnement du programme comme le contrôle de ce que saisit l'utilisateur dans les TextBox de ma UserForm "SaisieDonnees", que je vais détailler après.
    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 Explicit
    Public WithEvents Lbl As MSForms.Label
    Public WithEvents TxtBx As MSForms.TextBox
    Public WithEvents b As MSForms.CommandButton
    Private Sub Userform_Initialize()
        Set Lbl = SaisieDonnees.Controls.Add("Forms.Label.1")
        Lbl.ForeColor = &H8000000D
        Set TxtBx = SaisieDonnees.Controls.Add("Forms.TextBox.1")
        TxtBx.ControlSource = Application.Workbooks("Classeur16").Worksheets("Feuil1").Range("Ray").Address
        TxtBx.Left = Lbl.Width
        Set b = SaisieDonnees.Controls.Add("Forms.CommandButton.1")
        b.Caption = "Quitter"
        b.Left = Lbl.Width + TxtBx.Width
        SaisieDonnees.Width = TxtBx.Width + Lbl.Width + b.Width
        SaisieDonnees.Height = 60
        SaisieDonnees.Caption = "Calculs"
        Lbl.Caption = "Rayon"
        Lbl.TextAlign = 2
    End Sub
    3-le classeur de code écrit dans un module de code "Module1" de mon classeur de résultats la procédure "Lancement".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Lancement()
        SaisieDonnees.Show
        Application.DisplayAlerts = False
        Application.Workbooks("Classeur16").Close
    End Sub
    4-l'affichage de ma UserForm est lancé depuis mon classeur de code grâce à la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.Run (ClasseurRes.Name & "!Lancement")
    Cette UserForm créée dynamiquement est liée à une feuille de calcul de mon classeur de resultats grâce à la propriété ControlSource d'un TextBox.

    Elle est destinée à afficher le diamètre, le rayon ou la surface d'un disque.

    Sur ma UserForm j'ai donc un Label qui indique quel paramètre (Diamètre ou rayon ou surface) on est en train de saisir et un TextBox dans lequel on effectue la saisie.

    Un clic sur le Label doit faire changer son Caption de la façon suivante: si le caption était "Rayon", on le change pour "Diamètre". S'il était "Diamètre' on le change pour "Surface" est s'il était "Surface", on le change pour "Rayon". Et dans le même temps, on fait changer la propriété ControlSource du TextBox de B1 à B2 dans le premier cas et de B2 à B3 dans le second et de B3 à B1 dans le dernier cas.
    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 Lbl_Click()
        If Lbl.Caption = "Rayon" Then
            Lbl.Caption = "Diamètre"
            TxtBx.ControlSource = Application.Workbooks("Classeur16").Worksheets("Feuil1").Range("Dia").Address
        ElseIf Lbl.Caption = "Diamètre" Then
            Lbl.Caption = "Surface"
            TxtBx.ControlSource = Application.Workbooks("Classeur16").Worksheets("Feuil1").Range("Sur").Address
        ElseIf Lbl.Caption = "Surface" Then
            Lbl.Caption = "Rayon"
            TxtBx.ControlSource = Application.Workbooks("Classeur16").Worksheets("Feuil1").Range("Ray").Address
        End If
    End Sub
    En mettant des formules dans ma feuille Excel et une valeur par défaut pour le rayon, je calcule le diamètre et la surface correspondant.

    Si bien que lorsque ma UserForm s'affiche pour la première fois et que je clique sur le Label j'obtiens bien tout ce que je veux: diamètre, surface et rayon.

    Mais maintenant je veux changer le rayon, et je veux que Excel recalcule tout.
    Pour cela je piège l'évènement Change du TextBox. Quand il se produit, je teste ce qui est saisi: on n'autorise que les nombres. Puis je viens écrire dans la case C1 de ma feuille quel paramètre à été saisi: diamètre, surface ou rayon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub TxtBx_Change()
        Application.Calculation = xlCalculationManual
        Application.Workbooks("Classeur16").Worksheets("Feuil1").Cells(1, 3).Value = Lbl.Caption
        Application.Run ("EcritureDynamique2.xls!Formules")
    End Sub


    et je réécris les formules qui sont nécessaires au calcul en fonction de ce qui se trouve dans C1: c'est la procédure "Formules" située dans mon classeur de code mais appelée depuis mon classeur de résultats:
    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
     
    Sub Formules()
        Application.Calculation = xlCalculationManual
        If Application.ActiveWorkbook.Worksheets.Item(1).Cells(1, 3).Value = "Rayon" Then
            Application.ActiveWorkbook.Worksheets.Item(1).Range("Dia").FormulaLocal = "=2*Ray"
            Application.ActiveWorkbook.Worksheets.Item(1).Range("Sur").FormulaLocal = "=PI()*(Ray^2)"
        ElseIf Application.ActiveWorkbook.Worksheets.Item(1).Cells(1, 3).Value = "Diamètre" Then
            Application.ActiveWorkbook.Worksheets.Item(1).Range("Ray").FormulaLocal = "=Dia/2"
            Application.ActiveWorkbook.Worksheets.Item(1).Range("Sur").FormulaLocal = "=PI()*(Dia^2)/4"
        ElseIf Application.ActiveWorkbook.Worksheets.Item(1).Cells(1, 3).Value = "Surface" Then
            Application.ActiveWorkbook.Worksheets.Item(1).Range("Ray").FormulaLocal = "=(Sur/PI())^(0.5)"
            Application.ActiveWorkbook.Worksheets.Item(1).Range("Dia").FormulaLocal = "=(4*Sur/PI())^(0.5)"
        End If
        Application.ActiveWorkbook.Worksheets.Item(1).Calculate
    End Sub
    Si c'est la surface, alors pour la cellule rayon on rentre la formule racine(surface/pi). Si c'est le diamètre, alors on écrit diamètre/2, etc.

    Le problème est que pour pouvoir saisir quoi que ce soit, je suis obligé de désactiver le calcul automatique d'Excel quand on arrive à la procédure Change du TextBox sinon le contenu du Textbox change continuellement et notamment lorsqu'une formule est entrée et je ne sais pas quand réactiver l'option automatique de calcul ou même faire un Worksheet.Calculate vu que je ne parviens pas à faire marcher les évènements Exit et AfterUpdate du TextBox créé dynamiquement. Voilà. J'espère avoir été un peu plus clair.
    Je mets en pièce jointe mon classeur de code.
    Si vous avez une version autre qu'Excel 2000 ou un chemin d'installation différent du mien, il vous faudra sans doute rajouter la référence Microsoft Visual Basic for Applications Extensibility 5.3.
    Merci.
    Fichiers attachés Fichiers attachés

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ben moi j'ai moins bien que toi, sur la ligne
    Public WithEvents TB As MSForms.TextBox
    j'ai le message "L'objet n'est pas source d'événement automation" (???)

Discussions similaires

  1. ToolStripMenu : enter sur textbox
    Par olibara dans le forum C#
    Réponses: 5
    Dernier message: 25/09/2008, 10h39
  2. "enter" sur textbox en aspnet2
    Par beabea dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/06/2007, 09h37
  3. [Access 2000] Evénement click sur groupe d'option
    Par Mariboo dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2006, 14h52
  4. Réponses: 1
    Dernier message: 25/04/2006, 16h22
  5. [VBA-E] ré-autoriser écriture sur TextBox
    Par repié dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/03/2006, 15h35

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