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 :

Recuperation a partir d'un controle dynamique


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut Recuperation a partir d'un controle dynamique
    Bonjour,

    Donc voila mon souci, je veut recuperer des informations enter par l'utilisateur dans des textbox crees dynamiquement lorsqu'il clique sur un bouton

    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
     
    Private Sub UserForm_activate()
     
    step2.Height = 90 + n * 30
    Buttonstep3.Top = 40 + n * 30
     
    'creation step2
            Dim Obj As Control
            Dim i As Integer
     
     
            For i = 1 To n 'boucle pour la création des textbox
                Set Obj = Me.Controls.Add("Forms.TextBox.1")
                With Obj
                    .Text = "Average of location " & i
                    .Left = 50
                    .Top = 30 * i + 5
                    .Width = 200
                    .Height = 20
                    .Name = "avgloc" & i
                End With
     
            Next i
     
    End Sub
    Donc comme vous pouvez le voir ce que je pensais faire c'etait donner un nom (id) a mes textbox et ensuite recuperer l'info par une boucle. Mais a l'aide d'un test j'ai decouvert que cela n'avait pas l'air de fonctionner.

    C'est possible que je m'y prenne tres mal parceque j'ai ete plutot "forme" sur du fortran

    merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut louix et le forum
    Ta boucle de récupération aurait été plus indiquée

    me.controls("avgloc" & i).propriété

    Devrait solutionner ton problème. Mais avec des lambaux d'infos...
    A+

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut
    merci pour la reponse, mais j'ai un peu de mal a comprendre comment je dois l'utiliser

    desole pour le cote vague de ma question

    voici l'operation de recuperation et de traitement qui est situe dans le meme formulaire qui s'active lors du click de l'utilisateur.

    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
     
    Private Sub Buttonstep3_Click()
    Dim i As Integer
    Dim j As Integer
     
     
        test.Show
        For i = 1 To n
            A(i) = avgloc & i
        Next i
     
        min = A(1)
        max = A(1)
        For j = 2 To n
            If min > A(j) Then min = A(j)
            If max < A(j) Then max = A(j)
        Next j
     
        r = (max - min) / 5
        i = 1
        rc = 1
        For rc = 1 To 5
            For i = 1 To n
                If A(i) < (min + r * rc) And A(i) >= (min + r * (rc - 1)) Then C(i) = rc
            Next i
        Next rc
        If A(i) = min Then C(i) = 1
        If A(i) = max Then C(i) = 5
        step2.Hide
     
        step3.Show
    End Sub
    Pour le principe, je veu stocker les informations donnees par l'utilisateur dans un tableau de reel A(). Pour ensuite traite ces donnees afin de les repartir en 5 familles correspondant a l'intervalle entre mon min et max divise par 5 et en enregistrant cette correspondance dans le tableau d'entier C().

    test est un userform qui me permet de verifier l'execution du program en verifiant simplement les valeurs.

    Mon but final est de creer une echelle de couleur pour la repartition selon differente hauteurs (cinq en l'occurence).

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Sans vouloir te vexer, peux-tu mettre des noms de variables explicites dan ton code? C'est totalement incompréhensible comme tu le fais et en plus il n'y a même pas de commentaires dedans.

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut
    Bon, je vais essayer de me faire comprendre une derniere fois, desole pour la perte de temps

    Donc mon programme sert rendre visualisable des differences d'epaisseures sur une piece a differents endrois de celle-ci, en instaurant un code couleur correspondant a differentes altitudes. Du genre quand c'est bleu c'est bas et quand c'est rouge c'est haut.

    Precedement a la partie qui me pose probleme, l'utilisateur renseigne le nombre de locations qu'il souhaite traiter qui est stocke sous la variable n.

    Apres ce bout de code j'ai un traitement qui donne les differentes couleurs aux differentes familles (classes de hauteurs) et qui cree des textbox sur la worksheet avec la couleur et le numero de la location qu'il doit placer sur le plan.


    Tout d'abord, un module ou je declare les variables pour differents userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'variable utilisees dans differents userform
    Public n As Integer 'nombre de locations
    Public A(99) As Long 'tableau de stockage de la valeurs moyenne de chaques location
    Public min As Long 'moyenne la plus faible des location
    Public max As Long 'moyenne la plus forte des location
    Public r As Long 'interval correspondant a 1/5 de la difference entre max et min
    Public rc As Integer 'chiffre correspondant a une couleur allant de 1 a 5
    Public C(99) As Integer ' tableau renseignant la classe de couleur affiliee
    Donc ensuite la creation ou plutot modification du userform, ou l'utilisateur va rentrer les epaisseurs moyennes dans les textbox. Je pense que vient le problemeviens de la.
    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
     
     
    Private Sub UserForm_activate()
     
    step2.Height = 90 + n * 30 'adaptation du userform en fonction du nombre de location entre precedement par l utilisateur
    Buttonstep3.Top = 40 + n * 30 'deplacement du bouton de validation en dessous des textbox qui vont etre cree
     
    'creation step2
            Dim Obj As Control 'variable servant a controller les parametres de la textbox
            Dim i As Integer 'variable de boucle
     
     
            For i = 1 To n 'boucle pour la création des textbox
                Set Obj = Me.Controls.Add("Forms.TextBox.1") 'creation de la textbox
                With Obj 'parametrage de la textbox
                    .Text = "Average of location " & i
                    .Left = 50
                    .Top = 30 * i + 5
                    .Width = 200
                    .Height = 20
                    .Name = "avgloc" & i
                End With
     
            Next i
     
    End Sub
    et enfin apres que l'utilisateur est entre ses donnees l'acquisition et le traitement de celles-ci quand il clique sur le bouton.
    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
     
    Private Sub Buttonstep3_Click()
    Dim i As Integer ' variable de boucle
    Dim j As Integer ' variable de boucle
     
     
        test.Show ' verification intermediaire des donnees pour identifier la source du pb
     
        For i = 1 To n 'boucle d'aquisition des donnees dans le tableau de reel A()
            A(i) = avgloc & i
        Next i
     
        min = A(1) 'initialisation de la variable min pour la recherche de la valeur mini
        max = A(1) 'meme chose pour la valeur maxi
     
        For j = 2 To n
            If min > A(j) Then min = A(j) 'recherche de la valeur mini par comparaison
            If max < A(j) Then max = A(j) 'meme chose avec la valeur maxi
        Next j
     
        r = (max - min) / 5 'calcul de r qui est la largeur d'une famille
        i = 1 'initialisation de i
        rc = 1 'initialisation de rc, variable de classe de couleur allan de 1 a 5
        For rc = 1 To 5 'boucle de determination de l'appartenance a une famille
            For i = 1 To n
                If A(i) < (min + r * rc) And A(i) >= (min + r * (rc - 1)) Then C(i) = rc
                If A(i) = min Then C(i) = 1 'classement du min non pris en compte par <
            Next i
        Next rc
        step2.Hide 'fermeture du userform courant
        step3.Show 'ouverture du userform suivant
    End Sub
    Voila, j'espere que ca vous ira sinon je pense que je vais sauter par la fenetre (je suis plutot specialiste en meca donc la ca commence a devenir dur dur pour moi...)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Mais bon sang si je te demande de mettre des noms de variables explicites dans ton code, ce n'est pas pour que tu me ressorte les explications en français.

    Même avec les explications à coté, un code avec des noms de variables pas clairs reste dur à comprendre.

    Ca veut dire ça par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Variables utilisées dans differents userform
    Public nombre_locations As Integer
    Public valeurs_moyenne_locations(99) As Long
    Public moyenne_min_locations As Long
    Public moyenne_max_locations As Long
    Public quantite_difference_moyennes_maxmin_locations As Long
    Public numero_couleur As Integer
    Public couleurs_locations(99) As Integer
    Une fois dans le programme, quand les variables utilisées portent des noms comme ça on comprend beaucoup plus vite les calculs.

    Si tu fais comme les profs d'algorithmique/programmation qui utilisent des noms de variables bateau (et dieu sait que j'en ai eu), je te conseille de ne surtout pas faire comme eux car faire ça c'est une très mauvaise habitude. C'est même une des pires choses à ne pas faire en programmation.

    Donc conseil de quelqu'un qui aura écrit/lu beaucoup de code dans plusieurs langages: utilise des noms de variables clairs. Non seulement ça aidera les autres à comprendre ce que veut dire ton code, mais ça t'aidera aussi toi le jour où tu te pencheras à nouveau sur le code après X temps: ça t'évitera de te dire "je ne comprends rien à ce que j'ai codé".

    Je ferme la parenthèse. Donc, même si je n'ai pas eu grand chose à déchiffrer pour le trouver (encore heureux), j'en viens à te dire que c'est ce code qui plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To n 'boucle d'aquisition des donnees dans le tableau de reel A()
            A(i) = avgloc & i
        Next i
    Là, tu essayes de concaténer un variant (avgloc n'existe pas et est créé pile à cette ligne comme étant une variable de type Variant vide) et une variable: pas top...

    Donc, pour tout de même obtenir ta valeur, procède comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To n 'boucle d'aquisition des donnees dans le tableau de reel A()
            A(i) = Userform.Controls("avgloc" & i).Value
        Next i
    Note que c'est ce que t'avait dit gorfael, et que tu dois adapter "Userform".

Discussions similaires

  1. [VB6]comment supprimer dynamiquement un controle dynamique?
    Par totor le troll dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/07/2011, 21h10
  2. [VB.NET] Contrôle dynamique et évènements
    Par johann.C dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/11/2009, 10h45
  3. Réponses: 5
    Dernier message: 23/01/2007, 15h36
  4. Réponses: 3
    Dernier message: 19/10/2006, 09h47
  5. [VB6] creation et gestion de contrôle dynamique
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 23/04/2004, 00h09

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