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] Action sur toutes les textbox d'un userform [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [VBA] Action sur toutes les textbox d'un userform
    Bonjour à tous !

    Tous d'abord, je précise que j'ai déjà effectué des recherche sur google et sur le forum et que j'ai essayé plusieurs fois d'adapter les codes proposés pour résoudre mon problème... mais ça ne marche toujours pas.

    Situation :
    - j'ai un fichier XL qui contient plusieurs textbox dans lesquel il faut remplacer les . en ,
    - j'ai écrit une macro (pas propre propre mais qui marche) pour le faire sur une Textbox automatiquement lorsque celle-ci est modifiée
    - j'aimerais que lorsque quelqu'un modifie une textbox, cette macro soit automatiquement lancée afin d'éviter de la recopier pour chaque textbox (c'est lourd)

    Je suis donc parti sur la création de Classes.
    J'ai trouvé un code sur le net et j'ai essayé de l'adapter

    Voici la création de la classe

    Dans un module classe appelé "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
    16
    17
    18
     
    Option Explicit
    Public WithEvents TextBoxGroup As MSForms.TextBox
     
    'Evenement Change sur les TextBox de la feuille de calcul.
    Private Sub TextBoxGroup_Change()
     
    'Ici le code commun désiré pour nos textbox
    'Pour info cet événement étant dédié à toutes les textbox
    'On récupérera la textbox active par TextBoxGroup.Value
     
    For i = 2 To Len(TextBoxGroup.Value) - 1
        If Mid(TextBoxGroup.Value, i, 1) = "." Then
        TextBoxGroup.Value = Left(TextBoxGroup.Value, i - 1) & "," & Right(TextBoxGroup.Value, Len(TextBoxGroup.Value) - i)
        End If
    Next i
     
    End Sub

    Ensuite, dans le userform initialize :
    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
     
    Private Sub UserForm_Initialize()
     
    Dim maCollection As Collection
     
     'Un objet Collection est un jeu d'éléments indexés auxquels il peut être fait référence comme s'ils constituaient un ensemble unique.
     
        Dim Obj As MSForms.Control 'un petit tiroir pour mettre mes objets un à un
        Dim maClasse As Classe1 'un petit tiroir pour mettre mes objets un à un
     
    Set maCollection = New Collection
     'Un objet Collection est un jeu d'éléments indexés auxquels il peut être fait référence comme s'ils constituaient un ensemble unique.
     
    'On boucle maintenant sur les objets de la Feuil1
    For Each Obj In Me.Controls
        'On verifie s'il s'agit d'une Textbox
        If TypeOf Obj Is MSForms.TextBox Then
            Set maClasse = New Classe1
            Set maClasse.TextBoxGroup = Obj
            maCollection.Add maClasse
        End If
    Next Obj
     
    End Sub
    Ce qui se passe :
    - D'après le pas à pas la partie dans initialize marche bien, la collection se crée et les textbox du userform y sont bien ajoutées
    - Mais quand je change une textbox, ma macro de remplacement du point par virgule ne s'exécute pas (j'ai mis un point d'arrêt au début de la macro et le pas à pas n'y va jamais)

    Quelqu'un sait-il pourquoi ?

    Merci beaucoup et bonne journée !

    Marc

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 105
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    désolé, sa ne répond pas à ton problème, mais c'est toujours bon à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 2 To Len(TextBoxGroup.Value) - 1
        If Mid(TextBoxGroup.Value, i, 1) = "." Then
        TextBoxGroup.Value = Left(TextBoxGroup.Value, i - 1) & "," & Right(TextBoxGroup.Value, Len(TextBoxGroup.Value) - i)
        End If
    Next i
    sinon tu as la fonction replace()

    voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBoxGroup.Value = replace(TextBoxGroup.Value, "." ,",")

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci bien supierre ! Je suis toujours preneur de solutions qui me permette de rendre plus propre et plus concis mon code !

    J'espère toutefois que quelqu'un va réussitr à me débloquer de mon problème.... de mon côté j'ai continuer à chercher depuis vendredi mais je n'ai pas trouvé la solution ! :-(

  4. #4
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    A mettre dans le module de ta Form :
    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
     
    Dim Txt() As New Classe1
     
    Private Sub UserForm_Initialize()
     
        Dim Ctrl As Control
        Dim I As Integer
     
        For Each Ctrl In Me.Controls
     
            If TypeName(Ctrl) = "TextBox" Then
     
                I = I + 1
                ReDim Preserve Txt(1 To I)
     
                Set Txt(I).TextBoxGroup = Ctrl
     
            End If
     
        Next Ctrl
     
        Set Ctrl = Nothing
     
    End Sub
    A mettre dans le module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public WithEvents TextBoxGroup As MSForms.TextBox
     
    Private Sub TextBoxGroup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'transforme le point en virgule
        If KeyAscii = 46 Then KeyAscii = 44
     
    End Sub
    Hervé.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Hervé pour ta réponse !

    Toutefois, je dois faire une erreur car ça ne marche pas.

    si je laisse Dim Txt() As New Classe1 avant Private Sub UserForm_Initialize(), alors il s'arrête à la ligne Set Txt(I).TextBoxGroup = Ctrl en précisant que la variable n'est pas définie.

    Si je place Dim Txt() As New Classe1 après Private Sub UserForm_Initialize(), alors il ne se passe rien (si je tape 1.1 dans une TextBox, ça reste 1.1 ça ne se transforme pas en 1,1)

    Que fais-je mal ?

    Merci d'avance !

  6. #6
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Le tableau doit rester de portée Module (UserForm) donc avant toutes procédures et en tête de module de la Form.
    Ta Classe s'appelle bien "Classe1" ? Supprime l'espace entre "New" et "Classe1" puis entre à nouveau un espace pour voir si l'Intellisense te propose bien "Classe1". Sinon, ça doit marcher il n'y a pas de raison !
    Tu as bien mis le code ci-dessous dans le module de classe (il doit être le seul donc supprime tout ce qui s'y trouvait avant) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public WithEvents TextBoxGroup As MSForms.TextBox
     
    Private Sub TextBoxGroup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'transforme le point en virgule
        If KeyAscii = 46 Then KeyAscii = 44
     
    End Sub
    Hervé.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Hervé ! Ca marche très bien, je n'avais juste pas mis tout ça au début du Form mais au milieu.

    Bien joué !

  8. #8
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Novembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Temmo
    merci Hervé,moi aussi j'avais besoin de ça. Je m'amuse à convertir du VB en vba excel

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Bien sur qu'elle s'exécute mais sur un seul contrôle (le dernier instancié!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set maClasse = New Classe1
            Set maClasse.TextBoxGroup = Obj
            maCollection.Add maClasse
    Set maClasse=nothing 'il faut couper le cordon!
    Dernière modification par Invité ; 30/11/2017 à 07h41.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/06/2014, 19h40
  2. Réponses: 0
    Dernier message: 09/06/2014, 16h32
  3. [XL-2013] Actions sur toutes les feuilles sauf 3
    Par dlight dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/08/2013, 16h10
  4. Réponses: 10
    Dernier message: 04/08/2011, 21h21
  5. Action sur toutes les feuilles d'un classeur
    Par beurnoir dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 23/12/2005, 15h11

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