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 :

Récupération de TextBox dynamique [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 22
    Par défaut Récupération de TextBox dynamique
    Bonjour à tous !! Je tiens à préciser que je suis débutant en la matière !

    voici l'idée: je souhaite faire un outil qui répertorie des compteurs d'eau. Chaque compteurs pouvant posséder des sous compteurs, je travail donc avec des formes dynamique !!

    voici mon problème: Lorsque je génère des textbox en dynamique (TB_N1), je souhaite récupérer le nombre entré par l'utilisateur dans chacune des textBox et les mettre dans un tableau (TableauCompteur1). Sachant que j'ai déjà fais mes recherches, et j'ai trouvé un code permettant de récupérer le contenu de textBox dynamiques mais suite à un appuie sur un bouton, sauf qu'ici je souhaite le faire " en live".
    Voici mon code dans le userForm, sans la partie " control des TextBox" cela compile, mais avec non!

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
     
    Dim TB As Control
    Dim LBL As MSForms.Label
    Dim FRM As MSForms.Frame
    Dim TableauCompteur1(0 To 50, 0 To 50) As Integer
     
    Dim CB As MSForms.CheckBox
     
    Dim PosX As Long
    Dim PosY As Long
     PosX = 5
     PosY = 40
     
     
    Dim i As Integer
     
     
      ' Creation du cadre affichant les compteurs principaux
        Set FRM = Me.Controls.Add("forms.frame.1")
        With FRM
            .Top = PosY
            .Left = 0
            .Height = 100
            .Width = 450
            .Caption = "Niveau 1-Entrez le nombre de sous compteurs de niveau 2 pour chaque compteurs de niveau 1"
            .Visible = True
       End With
     
     
     
    For i = 1 To TB_COMPTEURS_PRINCIPAUX.Value
     
        ' Placement dynamique des noms de compteurs de niveau 1
            Set LBL = FRM.Controls.Add("forms.label.1", "LBL_N1_" & i, Visible = True)
            With LBL
                .Top = 10
                .Left = PosX - 50 + i * 50
                .Caption = "Compteur " & i
            End With
     
        ' Placement dynamique de la saisie du nombre de sous compteurs du niveau 1
            Set TB = FRM.Controls.Add("forms.TextBox.1", "TB_N1_" & i, True)
            With TB
                .Name = "TB_N1_" & i
                .Object.Value = ""
                .Left = PosX - 50 + i * 50
                .Top = 20
                .Width = 20
                .Height = 20
                .FontBold = True
                .Enabled = True
            End With
            Next i
      End If
     
     
        ' Control du type textbox
     
       For Each Ctrl In Me.Controls
               CtrlName = Ctrl.Name
               If InStr(CtrlName, "TB_N1_") = 1 Then
                  'recuperation du numero du Textbox
                  CtrlIndex = Val(Mid(CtrlName, 17))
     
                  'transfert des entrées dans feuille 3 pour vérifier 
                  Worksheets("Feuil3").Cells(1, CtrlIndex).Value = Ctrl.Text
                 ' ReleveValeur = Ctrl.Text
                 TableauCompteur1(1, CtrlIndex) = Ctrl.Text
     
                End If
        Next
    merci d'avance !!!!!!!!!!!!!!!!

  2. #2
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Une piste.
    Tu ajoute un module de classe qui doit se nommer Classe1 (nom par défaut que tu pourra adapter une fois que tu aura compris le fonctionnement) et tu colle le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public WithEvents GroupeTxt As MSForms.TextBox
     
    Private Sub GroupeTxt_Change()
     
        'inscrit les valeurs entrée en colonne A et à la ligne correspondante de la feuille "Feuil1"
        Worksheets("Feuil1").Range("A" & GroupeTxt.Tag).Value = GroupeTxt.Text
     
    End Sub
    Pour le test, tu mets en commentaire tout le code "Initialize" de ta Form et tu le remplace par celui-ci :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Dim Txt() As New Classe1
     
    Private Sub UserForm_Initialize()
     
        Dim Fe As Worksheet
        Dim Tbox As MSForms.TextBox
        Dim Frm As MSForms.Frame
        Dim Lbl As MSForms.Label
        Dim I As Integer
        Dim Haut As Long
        Dim PosX As Long
        Dim PosY As Long
     
        PosX = 5
        PosY = 40
     
        Set Frm = Me.Controls.Add("forms.frame.1")
     
        With Frm
     
            .Top = PosY
            .Left = 0
            .Height = 60
            .Width = 450
            .Caption = "Niveau 1-Entrez le nombre de sous compteurs de niveau 2 pour chaque compteurs de niveau 1"
     
       End With
     
        For I = 1 To 10
     
            ' Placement dynamique des noms de compteurs de niveau 1
            Set Lbl = Frm.Controls.Add("forms.label.1", "LBL_N1_" & I, Visible = True)
     
            With Lbl
     
                .Top = 10
                .Left = PosX - 50 + I * 50
                .Caption = "Compteur " & I
     
            End With
     
            ' Placement dynamique de la saisie du nombre de sous compteurs du niveau 1
            Set Tbox = Frm.Controls.Add("forms.TextBox.1", "TB_N1_" & I, True)
     
            With Tbox
     
                .Tag = I '<--- stocke le numéro de ligne où sera inscrit la valeur entrée
                .Left = PosX - 50 + I * 50
                .Top = 20
                .Width = 20
                .Height = 20
                .FontBold = True
     
            End With
     
            'stocke le TextBox dans le tableau
            ReDim Preserve Txt(1 To I)
            Set Txt(I).GroupeTxt = Tbox
     
        Next I
     
    End Sub
    Quand tu va entrer une valeur dans un des TextBox, tu verra sur la feuille "Feuil1" (elle doit être la feuille active) en colonne A la valeur qui sera reportée en "live"
    Si tu as d'autres questions, reviens.

    Hervé.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 22
    Par défaut
    Merci beaucoup Theze pour ta réponse !!!! Etant donné mon niveau, j'ai compris le principe de ton code (enfin je crois ).
    J'ai essayé de bidouiller un peu car au final, je souhaite stocker ces valeurs dans un tableau (j'entends par là un tableau comme on pourrait avoir en langage C du type Char tab[i]). La visualisation en "live" grâce au code que tu m'a donné est simplement pour vérifier ce qui est dans mon fameux tableau.

    Mon tableau s'appel "TableauCompteur1" et j'ai essayé de le remplir directement de la Classe1 que tu m'as demandé de créer comme suit :

    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
     
    Dim j as integer
    j=0
    Dim TableauCompteur1(0 To 50, 0 To 50) As Integer
     
     
     
    Public WithEvents GroupeTxt As MSForms.TextBox
     
    Private Sub GroupeTxt_Change()
     
        'inscrit les valeurs entrée en colonne A et à la ligne correspondante de la feuille "Feuil1"
        Worksheets("Feuil1").Range("A" & GroupeTxt.Tag).Value = GroupeTxt.Text
     
    ' Ma tentative de remplissage 
     
    TableauCompteur1(1, & GroupeTxt.Tag)=GroupeTxt.Text
     
     
    End Sub


    De plus, je souhaiterai avoir acces à ce tableau dans mon userForm et je ne suis pas assez à l'aise avec ce langage pour établir aussi facilement ce "lien" ( entre une classe et le userForm)

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour en savoir plus sur les modules de classes quelques liens dans la FAQ
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Expert confirmé
    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
    Par défaut
    Bonjour,

    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
     
    Public WithEvents GroupeTxt As MSForms.TextBox
     
    Private Sub GroupeTxt_Change()
     
        'Ma tentative de remplissage
        TableauCompteur1(1, GroupeTxt.Tag) = GroupeTxt.Text
     
        'la valeur est récupérée du tableau donc bien présente dans ce dernier !
        Worksheets("Feuil1").Range("A" & GroupeTxt.Tag).Value = TableauCompteur1(1, GroupeTxt.Tag)
     
    End Sub
    dans un module standard la déclaration publique des variables pour une portée au niveau projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public j As Integer
    Public TableauCompteur1(0 To 50, 0 To 50) As Integer
    C'est dans la création des TextBox et de la valeur affectée à la propriété Tag de ces derniers qu'il faudra apporter un soin tout particulier pour attribuer et récupérer les valeurs stockées dans le tableau. C'est pour l'exemple que j'ai utilisé la propriété Tag mais il y a bien d'autres façons de faire ça.

    Hervé.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 22
    Par défaut
    Super je touche du doigt ce que je souhaite faire!!!! Merci beaucoup pour vos réponses !! Mais ( eh oui malheureusement il y en a un! ) pour que cela soit parfait, il faut que je parvienne à gerer " l'ordre" dans lequel s'execute mon code. Dans le code suivant, comme vous pouvez le voir, pour tester si je peux bien récupérer mes valeurs dans mon tableau (ce que je parviens à faire depuis le UserForm grâce à mon tableau déclaré en tant que Public dans un module classique ) je voudrais afficher le nombre de "HELLO" correspondant à la place de mon tableau TableauCompteur1(1,1) ( pourquoi pas me direz-vous), mais après que l'utilisateur aie rempli le tableau, or dans la configuration actuelle, il m'affiche le bon nombre de "hello" mais de la saisie précédente. C'est pour cela que je dis que je dois gérer "l'ordre" dans lequel s'execute mon code". J'ai donc regarder sur le net et j'en ai ressorti le " GoTo", cependant cette solution paraît faire débat.

    J'ai procédé comme s'en suit

    Dans le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Dim Txt() As New Classe1
     
    Private Sub UserForm_Initialize()
     
        Dim Fe As Worksheet
        Dim Tbox As MSForms.TextBox
        Dim Frm As MSForms.Frame
        Dim Lbl As MSForms.Label
        Dim I As Integer
        Dim Haut As Long
        Dim PosX As Long
        Dim PosY As Long
     
        PosX = 5
        PosY = 40
     
        Set Frm = Me.Controls.Add("forms.frame.1")
     
        With Frm
     
            .Top = PosY
            .Left = 0
            .Height = 60
            .Width = 450
            .Caption = "Niveau 1-Entrez le nombre de sous compteurs de niveau 2 pour chaque compteurs de niveau 1"
     
       End With
     
        For I = 1 To 10
     
            ' Placement dynamique des noms de compteurs de niveau 1
            Set Lbl = Frm.Controls.Add("forms.label.1", "LBL_N1_" & I, Visible = True)
     
            With Lbl
     
                .Top = 10
                .Left = PosX - 50 + I * 50
                .Caption = "Compteur " & I
     
            End With
     
            ' Placement dynamique de la saisie du nombre de sous compteurs du niveau 1
            Set Tbox = Frm.Controls.Add("forms.TextBox.1", "TB_N1_" & I, True)
     
            With Tbox
     
                .Tag = I '<--- stocke le numéro de ligne où sera inscrit la valeur entrée
                .Left = PosX - 50 + I * 50
                .Top = 20
                .Width = 20
                .Height = 20
                .FontBold = True
     
            End With
     
            'stocke le TextBox dans le tableau
            ReDim Preserve Txt(1 To I)
            Set Txt(I).GroupeTxt = Tbox
     
        Next I
         Valeur = TableauCompteur1(1, 1)
        For k = 1 To Valeur
        MsgBox " HELOOOOOO"
        Next k
     
    End Sub
    Une fois ce dernier problème résolu, je serai définitivement comblé !!!!

    Il est vrai que je pourrai choisir la solution de "facilité" en ordonnant mon code en plaçant un bouton sur lequel cliquer lorsque je désire déclencher l'affichage de mes Hello, mais cela ne conviendrait pas avec l'IHM que je souhaite proposer

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/08/2006, 14h06
  2. [VS2005 c#]: problème dans la récupération de textbox
    Par TheLittle dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/06/2006, 23h02
  3. [VBA-E] UserForm avec textbox "Dynamique"
    Par Alex_Kidd dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/05/2006, 00h29
  4. [vb.net] définir un textbox dynamiquement
    Par arnolem dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/12/2005, 15h51
  5. Récupération de variables dynamiques complexes
    Par ludoboy dans le forum ASP
    Réponses: 7
    Dernier message: 24/05/2004, 17h51

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