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] boucle sur textbox d'une userform


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut [VBA E] boucle sur textbox d'une userform
    Bonjour a tous

    Je voudrais savoir s'il est possible de creer une boucle sur 40 textbox situé sur une userform.

    Donc en fait ma userform comporte exactement 41 textbox et je veux que la boucle se fasse sur mes 40 premieres textbox et pas sur la 41ème.

    Mes 40 textbox sont sur 4 frames par groupe de 10 et la 41èmetextbox est directement sur la userform (information supplementaire si ça peut aider).

    le code que je veux boucler est celui ci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
     
    Application.ScreenUpdating = False
                TextBox1.Value = TimeValue(Left(Application.Text(TextBox1.Value, "00.00"), 2) _
            & ":" & Right(TextBox1.Value, 2))
            c = TextBox1.Value
           h1 = TextBox1.Value    'cette variable ne sert que pour la suite
           TextBox1.Value = Format(c, "hh\H mm")
     
    End Sub
    mais il ne fonctionne que pour une textbox.

    Je ne sais pas si c'est possible car il s'execute sur l'evenement "TextBox_Exit"
    Alors dois je mettre un code pour chaque textbox, ce qui allourdi en ligne de code ou estce possible de le boucler.

    Si quelqu'un peut m'aider.

    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Deux possibilités : Ou toutes les textbox de ta form sont à traiter, ou seulement une partie des textbox de la form (même si c'est la plus grande partie)
    Dans le premier cas, tu peux faire une boucle sur LaForm.controls en identifiant le type du contrôle (ici des textbox)
    Dans le second cas, tu baptises les textbox concernés de noms comportant tous un préfixe identique.
    Ta boucle, au lieu d'identifier un type de contrôle, reconnaîtra le contrôle selon le préfixe de son nom.

    Pas la peine que je te passe les deux codes alors précise le cas qui te concerne

  3. #3
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    Bonjour ouskel'n'or

    Mon cas est le second mes texbox concernés se nomme toute de "textbox1" jusqu'a "textbox40"

  4. #4
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello zoumzoum59,
    Oui, je sais, j'ai un peu tardé mais j'étais pas là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For each lecontrol in Luserform.controls
          if left(LeControl.name,6) = "TextBox" then
                Result = Luserform.controls(LeControl.name).text
                ' et tu fais ce que tu veux de Result
          endif
    next

  5. #5
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    Merci ouskel'n'or

    j'ai repris ton code est je l'ai retravaillé de cette maniére:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim LeControl As Variant
    Dim Result As Variant
     
     
    For Each LeControl In Planning.Controls
          If Left(LeControl.Name, 7) = "TextBox" Then
                Result = Planning.Controls(LeControl.Name).Text
     
                ' et tu fais ce que tu veux de Result
     
           End If
    Next
    je recupere avec ce code le texte des textbox ce qui me sert d'exemple pour faire ce que je veux derrière et y mettre ce que je veux.
    Jusque là je pense que j'ai compris.

    Mais comment je fais pour lier cette procedure aux evenements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    de chaque textbox, là je dois dire que je suis completement perdu et de mon coté je me demande si c'est possible de le faire ou pas.

  6. #6
    Expert éminent sénior

    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
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    c'est possible en utilisant un module de classe mais, pour ne pas créer une usine à gaz , il faudrait :

    - ne pas utiliser l'evenement Exit

    ou

    - ne pas utiliser de Frames


    bonne soiree
    michel

  7. #7
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    merci SilkyRoad

    Donc il vaut mieux que je tape mon code pour chaque textbox sans creer de boucle meme s'il y en a 40.

    De plus si mon niveau est pas tres elevé.

    Mais cela ne vas pas trop allourdir ma macro de le faire pour chaque textbox?

  8. #8
    Expert éminent sénior

    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
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    Tu peux adapter cette procedure pour gerer les evenements GetFocus et LostFocus de TextBox placés dans des Frames

    l'evenement USF_LostFocus remplace _Exit
    Me.Controls(Txtbx) correspond au nom des tes textBox ( TextBox1, TextBox2 ...etc ...)

    remarque :
    je trouve malheureusement cette solution un peu gourmande en ressource


    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
    '---- dans un module de classe nommé Classe1
    Option Explicit
     
    Public Event GetFocus()
    Public Event LostFocus(ByVal Txtbx As String)
    Public nomObjActif As String
     
    Public Sub cibleFocus(USF As MSForms.UserForm)
    With USF
        If TypeName(.ActiveControl) = "Frame" Then
            nomObjActif = .Controls(.ActiveControl.Name).ActiveControl.Name
            On Error GoTo errorHandler
            Do
                DoEvents
                If .ActiveControl.Name <> nomObjActif Then
                    If TypeName(.ActiveControl) = "Frame" Then
                    RaiseEvent LostFocus(nomObjActif)
                    nomObjActif = .Controls(.ActiveControl.Name).ActiveControl.Name
                    RaiseEvent GetFocus
                End If
                End If
            Loop
        End If
    End With
     
    errorHandler:
    Exit Sub
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    '---  dans l'UserForm  ---
    Option Explicit
    Private WithEvents USF As Classe1
     
     
    Private Sub UserForm_Activate()
    Set USF = New Classe1
     
    TextBox1.SetFocus
    Me.Controls(Me.ActiveControl.Name).ActiveControl. _
    Object.BackColor = RGB(225, 225, 225)
     
    USF.cibleFocus Me
    End Sub
     
     
    Private Sub USF_GetFocus()
    Me.Controls(Me.ActiveControl.Name).ActiveControl. _
    Object.BackColor = RGB(225, 225, 225)
    End Sub
     
     
    Private Sub USF_LostFocus(ByVal Txtbx As String)
    Me.Controls(Txtbx).BackColor = RGB(255, 255, 255)
    '
    '
    '
    '
    End Sub
     
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set USF = Nothing
    End Sub


    la source utilisée :
    http://www.mrexcel.com/board2/viewto...er=asc&start=0
    Masaru Kaji aka Colo [MVP]



    bonne soirée
    michel

  9. #9
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    Merci SilkyRoad

    je vais tester tout ça.

  10. #10
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    Bonjour SilkyRoad

    j'ai testé le code, ça fonctionne mais dans la userform comportant 4 frames comportant elles meme10 textbox 1 combobox. Le code ne se limite pas au textbox mais passe egalement sur les combobox.
    est il possible de le limiter aux textbox?

    Sinon consommation ressource est il plus gourmant que le code de 40 procedures comme celle qui suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Application.ScreenUpdating = False
                TextBox1.Value = TimeValue(Left(Application.Text(TextBox1.Value, "00.00"), 2) _
            & ":" & Right(TextBox1.Value, 2))
                    c = TextBox1.Value
                     h1 = TextBox1.Value
           TextBox1.Value = Format(c, "hh\H mm")
     End Sub
    Car si ça comsomme moins de ressource mais que ça fait juste des ligne de programme en plus.
    Ce code fonctionne alors !

    Sinon quelqu'un peut me dire ou je peux trouver des infos sur module et module de classe (difference,a quoi ça sert et quand,utilité de l'une et de l'autre ...)


    Merci

  11. #11
    Expert éminent sénior

    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
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    est il possible de le limiter aux textbox?

    dans ce cas tu peux ajouter un filtre supplémentaire sur les TextBox


    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
    '---- dans un module de classe nommé Classe1
    Option Explicit
     
    Public Event GetFocus()
    Public Event LostFocus(ByVal Txtbx As String)
    Public nomObjActif As String
     
    Public Sub cibleFocus(USF As MSForms.UserForm)
    With USF
        If TypeName(.ActiveControl) = "Frame" Then
            If TypeName(.Controls(.ActiveControl.Name).ActiveControl) = _
                        "TextBox" Then
            nomObjActif = .Controls(.ActiveControl.Name).ActiveControl.Name
     
            On Error GoTo errorHandler
            Do
                DoEvents
                If .ActiveControl.Name <> nomObjActif Then
                If TypeName(.Controls(.ActiveControl.Name).ActiveControl) = _
                            "TextBox" Then
                    If TypeName(.ActiveControl) = "Frame" Then
                    RaiseEvent LostFocus(nomObjActif)
                    nomObjActif = .Controls(.ActiveControl.Name).ActiveControl.Name
                    RaiseEvent GetFocus
                    End If
                End If
                End If
            Loop
           End If
        End If
    End With
     
    errorHandler:
    Exit Sub
    End Sub


    bonne soiree
    michel

  12. #12
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    bonsoir SilkyRoad

    Ca fonctionne mais le dernier textbox n'est pas avec le code de base remis avec un fond blanc, la procedure LostFocus n'est donc pas utilisé sur ce dernier textbox.

    Si tu as la correction du code, Merci

    Car moi je le dechiffre par morceau mais le niveau est deja haut pour moi!

  13. #13
    Membre habitué
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 482
    Points : 161
    Points
    161
    Par défaut
    Bonsoir SilkyRoad

    Je suis en train d'adapter le code que tu m'as présenté plus haut.
    Mais j'ai une erreur incompatibilité de type sur la ligne en rouge et je ne vois pas ce qui cloche.


    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 USF_LostFocus(ByVal Txtbx As String)
    Dim c As Date
    Me.Controls(Txtbx).Value = TimeValue(Left(Application.Text(Me.Controls(Txtbx).Value, "00.00"), 2) _
            & ":" & Right(Me.Controls(Txtbx).Value, 2))
    c = Me.Controls(Txtbx).Value
    Me.Controls(Txtbx).Value = Format(c, "hh\H mm")
    
    Me.Controls(Txtbx).BackColor = RGB(255, 255, 255)
    '
    '
    '
    '
    End Sub

    Merci

Discussions similaires

  1. Boucle sur TextBox pour les "Enabled" suivant une condition
    Par GoFio dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 06/03/2014, 18h38
  2. [VBA-E]Comment envoyer en parametre un textbox d'une userform
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/09/2007, 14h16
  3. [VBA-E] boucle sur chaque feuille d un classeur
    Par johndeuf dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/12/2006, 11h39
  4. [VBA-E] SetFocus sur TextBox dans UserForm_Initialize ne fonctionne pas ?
    Par Jipété dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 27/11/2006, 11h39
  5. [VBA-E] Supprimer un contrôle d'une userform
    Par cwain dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2006, 12h00

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