Appel de control qui se créer dynamiquement...

Résolu
GermPeru Messages postés 175 Statut Membre -  
GermPeru Messages postés 175 Statut Membre -
Bonjour a Forum, bonjour a tous,

Mon soucis du jour... A l'initialisation de mon usf j´ai des textbox qui se créent dynamiquement. Ce que je cherche a faire cést lors d´un évenement cmd clik, appeler ces txtbox et en fonction de leur valeur (qui doit etre numerique) je crée de nouveux textbox....

Intuitivement j´ai fait le code suivant mais je nárrive pas a appeler ces txtbox... et du coup je suis un peu bloqué sur mon code... (precision mes variables sont déclarées en debut de module)

Private Sub CmdCalc_Click()
NbLignes = Sheets(2).Range("A1", Selection.End(xlDown)).Cells.Count
For Each Ctrl In Me.Controls
'************ premier soucis -> je n'arrive pas a appeler mes controle qui se créent dynamiquement a l'initialisation de mon usf et agir en fonction de leur valeur
   If Ctrl.Name Like "TxtSelladas*" <> "" And Ctrl.Name Like "TxtFrac*" <> "" Then
        Set CollectTxt = New Collection
        For i = 2 To NbLignes
        Set Obj = Me.Controls.Add("forms.textbox.1")
            With Obj
                .Name = "TxtCantSelladas" & i
                .Object.Value = Selladas("TxtCantPract" & i, "TxtFrac" & i, "TxtSelladas" & i) 
                .Left = 644
                .Top = 22 * i + 4
                .Width = 22
                .Height = 16
                .Enabled = False
                .TextAlign = fmTextAlignCenter
            End With
        Set Cl = New Clase1
        Set Cl.textbox = Obj
        CollectTxt.Add Cl
        Next i
    Else
    MsgBox "Todos los campos de Sellada y de Fracción deben ser llenados!", 48, "Mensaje de error"
   End If
Next Ctrl


Je pense que ma solucion est au travers d´un module de classe avec un evenemnt sur mes ctrl mais nouvelle notion dont je ne métrise pas encore ses suptilités...

Toutes bonnes idées sera recu avec plaisir!

Merci d' avance.

Ps: je ne savais tropp quoi mettre en titre, si certains on des idées plus appropriées je suis prenneur!

5 réponses

  1. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724
     
    Bonsoir,

    1 - Il te faut d'abord créer une classe correspondant aux événements à gérer dans tes TextBox.
    ci-dessous un exemple d'une classe nommée "Txtbox" avec l'événement "Change"

    Option Explicit

    '# Formulaire appelant
    Private USF As Object

    '# Evénement déclenché par la classe
    Public Event Change()

    '# Evénements pour zone de texte
    Private WithEvents Tbox As MSForms.TextBox

    Public Property Set Obj_UserForm(ByVal formulaire As Object)
    Set USF = formulaire
    End Property

    Public Property Set Obj_TextBox(ByVal champ As MSForms.TextBox)
    Set Tbox = champ
    End Property

    Public Property Get Obj_TextBox() As MSForms.TextBox
    Set Obj_TextBox = Tbox
    End Property

    Private Sub Tbox_Change()
    'activation évenements de la classe dans le formulaire
    Set USF.Tbox_i = USF.CollectTxt(Tbox.Name)
    'activation événement Change
    RaiseEvent Change
    End Sub


    2- Dans ton UserForm,
    a) créer une collection de type dictionnaire avec pour clé chaque élément de ta classe et déclarer cette collection publique afin de pouvoir y accéder dans le module de classe pour activer l'événement de classe dans le formulaire

    b) déclarer les événements de classe

    comme ceci :

    Option Explicit
    Public CollectTxt As Object
    Private Ctrl As Control
    Private valeur_textbox As String

    Public WithEvents Tbox_i As Txtbox

    Private Sub CmdCalc_Click()

    'création collection zones de texte
    Set CollectTxt = CreateObject("Scripting.Dictionary")
    For Each Ctrl In Me.Controls
    'stockage zone de texte dans la collection
    CollectTxt.Add Key:=Ctrl.Name, Item:=Nothing
    Set CollectTxt(Ctrl.Name) = New Txtbox
    Set CollectTxt(Ctrl.Name).Obj_TextBox = Ctrl
    Set CollectTxt(Ctrl.Name).Obj_UserForm = Me
    Next Ctrl

    End Sub

    Private Sub Tbox_i_Change()
    valeur_textbox = Tbox_i.Obj_TextBox.Value
    End Sub


    2
    1. GermPeru Messages postés 175 Statut Membre
       
      Merci pour tes explications, je me trouve face a une montagne de nouvelles infos plus interessante les unes que les autres....

      1- Je pensais que cela serait plus pratique de proceder a la creation de nouvelles txtbox et leur assigner une valeur par líntermediaire de lévenement clik sur un btn. Mais a ce que je vois tu declares tes variables en debut de module, ce qui veut dire qu' elles restent en mémoire (arrete moi si je dis des aneries), ce qui signifie que meme si l'evenement initialise de mon usf est terminé je peux créer mes nvx txtbox a partir de l´événement change comme tu l´as fait? Cela est possible car tu créer les caractéristiques de ces nouvelles txtbox au travers du module de classe?

      2- Ne sachant pas comment je pouvais interagir au travers du nom de ces 2 txtbox je leur est assigné un tag pour interagir avec eux et leur assigner obligatoirement une valeur numerique, grace a un autre module de classe.
      Est ce que tu pense que je peux utiliser leur propriété tag pour appeler ces txtbox associé a l´evenemnt change? Je pose la question car je pense que cela pourrait permettre de gagner du temps a línitialisation de mon usf...

      3- Je vois que tu utilises le dictionary pour associer des valeurs a des clés, comme tu me léxpliques. Pourrais tu mén dire plus, car sincerement je n´ai pas compris comment tu le programmais... Pk tu ný associes aucune valeur en item?

      4- De plus je "comprends" que cela permet la création des nouvelles txtbox grace a ton module de classe. Mais comment procéder pour sa construction , cad sa position dans l´USF? Concernant les propriété, je dois les définir dans le code de mon usf?

      5- toujours concernant la création, pour l´asigantion des valeurs a mes nouvelles txtbox, qui depend dúne fonction dont les variables la composant sont des valeurs dáutres txtbox ds mon usf. Je vois que tu ne fais pas de boucles pour la création de ces nouvelles boucles, simplement pcq la création dúne nouvelle txtbox est corrélé a l´evenement change dúne txtbox qui est deja lié a ma variable i ? dans ce cas je dois rajouter une boucle pour aller chercher mes valeur de i?

      Je suis dsl pour toutes ces questions; qui j´espere ne sont pas nul de sens. Je ne suis pas adepte du pompage de code sans le comprendre, vu que je suis un novice de klk mois en vba, il me reste bcp a comprendre.

      Dans tous les cas merci pour le partage de tes connaissances, c´est vraiment super.
      0
    2. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724 > GermPeru Messages postés 175 Statut Membre
       
      A- Oui, le contenu des variables déclarées en début du code de l'Userform reste disponible pour toutes les procédures associées.

      B-Une fois la classe définie et associée ici à l'événement Change, toute nouvelle TextBox est en fait rattachée à une instance de cette classe. Il faut ensuite stocker les instances de cette classe dans une collection de type dictionnaire afin de disposer d'une clé d'identification pour accéder à une instance quelconque de cette classe.

      Cette instruction a un double rôle :
      Set CollectTxt(Ctrl.Name) = New Txtbox  

      Elle crée une nouvelle instance de classe et la stocke en tant que valeur d'item dans la collection avec pour clé le nom du contrôle.

      Les 2 instructions suivantes rattachent la nouvelle instance de classe à la TextBox considérée
              Set CollectTxt(Ctrl.Name).Obj_TextBox = Ctrl
      Set CollectTxt(Ctrl.Name).Obj_UserForm = Me

      Ces instructions renseignent les variables "USF" et "Tbox" de l'instance de classe.

      C- Ces instructions sont à mettre dans ta boucle i en remplaçant Ctrl par Obj

      CollectTxt.Add Key:=Ctrl.Name, Item:=Nothing
      Set CollectTxt(Ctrl.Name) = New Txtbox
      Set CollectTxt(Ctrl.Name).Obj_TextBox = Ctrl
      Set CollectTxt(Ctrl.Name).Obj_UserForm = Me
      0
    3. GermPeru Messages postés 175 Statut Membre > thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour thev,

      J´ai passé bcp de temps a essayé de decripter et de bien comprendre toutes les lignes du code que tu m´as fourni. De plus j´ai essyé de suivre tes instructions le plus précisemant possible.

      Mais je ne suis pas arriver a grand chose de concluant, le code bloque et le msg d´erreur qui s´affiche est que la touche est associé a un élément de la collection...

      Je pense que tu as raison dans la facon de faire et que cést un code que je califerais de propre mais qui dépasse mon entendement

      Private Sub CmdCalc_Click()
      Dim NbLignes As Integer, i As Integer
      NbLignes = Sheets(2).Range("A1", Selection.End(xlDown)).Cells.Count
      'création collection zones de texte
      Set CollectTxt = CreateObject("Scripting.Dictionary")
      For Each Ctrl In Me.Controls
              For i = 2 To NbLignes
              'stockage zone de texte dans la collection
      'msg erreur la touche est associé a une collection
              CollectTxt.Add Key:=Obj.Name, Item:=Nothing
              Set CollectTxt(Obj.Name) = New ClaseTxtbox
              Set CollectTxt(Obj.Name).Obj_TextBox = Obj
              Set CollectTxt(Obj.Name).Obj_UserForm = Me
              Set Obj = Me.Controls.Add("forms.textbox.1")
                  With Obj
                      .Name = "TxtCantSelladas" & i
                      .Object.Value = i 'j´ai écarté ma fonction pour éviter pb de progrmation 
                      .Left = 644
                      .Top = 22 * i + 4
                      .Width = 22
                      .Height = 16
                      .Enabled = False
                      .TextAlign = fmTextAlignCenter
                  End With
              Next i
      Next Ctrl
      End Sub


      Je ne sais pas si tu peux m´aider, mais dans tous les cas un merci pour le partage
      0
    4. thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention   724 > GermPeru Messages postés 175 Statut Membre
       
      Bonsoir,

      Je pense que cette instruction est erronée
      Set CollectTxt(Obj.Name) = New ClaseTxtbox

      l'instruction doit être
      Set CollectTxt(Obj.Name) = New <nom du module de classe>

      Si le module de classe est "Txtbox", alors l'instruction est
      Set CollectTxt(Obj.Name) = New Txtbox


      Par ailleurs, il n'est pas possible d'affecter à la collection et à une instance de cette classe un objet TextBox qui n'a pas encore été créé. Ce code devrait donc mieux convenir

      Private Sub CmdCalc_Click()
      Dim NbLignes As Integer, i As Integer
      NbLignes = Sheets(2).Range("A1", Selection.End(xlDown)).Cells.Count
      'création collection zones de texte
      Set CollectTxt = CreateObject("Scripting.Dictionary")
      For Each Ctrl In Me.Controls
      For i = 2 To NbLignes
      Set Obj = Me.Controls.Add("forms.textbox.1")
      With Obj
      .Name = "TxtCantSelladas" & i
      .Object.Value = i 'j´ai écarté ma fonction pour éviter pb de progrmation
      .Left = 644
      .Top = 22 * i + 4
      .Width = 22
      .Height = 16
      .Enabled = False
      .TextAlign = fmTextAlignCenter
      End With
      'stockage zone de texte dans la collection
      CollectTxt.Add Key:=Obj.Name, Item:=Nothing
      Set CollectTxt(Obj.Name) = New Txtbox
      Set CollectTxt(Obj.Name).Obj_TextBox = Obj
      Set CollectTxt(Obj.Name).Obj_UserForm = Me
      Next i
      Next Ctrl
      End Sub
      0
    5. GermPeru Messages postés 175 Statut Membre > thev Messages postés 2011 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour Thev,

      J´avais remplacé le nom du module de classe pour que cela soit plus clair dans ma tete quand je lisais le code...

      Le code bloque a ce niveua:
      Set CollectTxt = CreateObject("Scripting.Dictionary")


      En m´affichant le msg que ne coincide pas les types...

      Si j´avais les connaissances suffisantes, je pense que j´aurais procédé avec ta facon de faire car intituivement c´est ce que je voulais, et je trouve le code propre. Mais il y a un mais, je n´arrive pas a bien programmer avec le dictionnaire et la notion de module de classe. J´ai pallié mes lacunes en ne rendant pas visible mes txtbox de calcul et en faisant mes calculs dans une feuille de mon classeur; pour le moment je vais appeler ca de la bidouille mais je vais continuer a travailler les infos que tu m' as transmises , car je penses que ce sont des notions trés importantes et tres utiles dans la conception de progrqamme VBA.

      J´ai mis mon pb come résolu pcq je vais bidouiller mais entierement disponible pour continuer sur cette possibilité.

      Un sincere Merci Thev
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Il y a peut-être plus simple que la création d'un module de classe.
    Ici les textbox sont ajoutés dynamiquement, mais n'ont pas besoin d'un événement particulier. Si?

    Par contre, ce qui nous manque pour t'aider c'est le code créant tes premières textbox. A l'initialisation de mon usf j´ai des textbox qui se créent dynamiquement.
    Donne nous ce code stp.
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Bjr pijaku,

      Je vais te donner tout le code pour que cela soit plus explicite, avant tout je vais téxpliquer un peu le deroulement:
      - lútilisateur rentre un N° via un inputbox, ce numero qui correspond a un fichier (N°), ce qui lóuvre et copie les données, crée une nouvelle feuille en position 2 et les colles, puis ferme le fichier (N°)
      - charge certaines données de la feuille (2) dans mon usf a son iniatilisation
      - et a la fermeture de mon usf cela supprime cette feuille.

      Option Explicit
      Dim TNumBox() As New ClassNumBox 'variable en debut pour rester en memoire
      
      Private Sub UserForm_Initialize()
      'Pour la creation dynamique des txtbox
      Dim Obj As Control, Ctrl As Control
      Dim Cl As Clase1
      Dim i As Integer, NbLignes As Integer, T As Integer '(i boucle nb lignes,T boucle tag 1 numbox)
      'ctrl spé a la limitation num
      Dim ctrlNumBox As Control
      
      'On compte le nb de lignes
       NbLignes = Sheets(2).Range("A1", Selection.End(xlDown)).Cells.Count
      'chargement automatique des lbl
          LblProd.Caption = Range("D2").Value
          LblCodProd.Caption = Range("C2").Value
          LblLote.Caption = Range("F2").Value
          LblFecha.Caption = Format(Now(), "dddd dd/mm/yyyy")
          LblUsuario.Caption = Sheets(5).Range("E65536").End(xlUp).Value
       
      'boucle pour la création des Lbl
      Set CollectTxt = New Collection
      For i = 2 To NbLignes
      'dimension de l'usf
      Me.Height = 50 + 22 * i
      'N° de lignes
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtN" & i
              .Object.Value = i - 1
              .Left = 1
              .Top = 22 * i + 4
              .Width = 22
              .Height = 16
              .Enabled = False
              .TextAlign = fmTextAlignLeft
          End With
      'le nom de chaque matiere premiere
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtMP" & i
              .Object.Value = Sheets(2).Range("J" & i)
              .Left = 25
              .Top = 22 * i + 4
              .Width = 262
              .Height = 16
              .Enabled = False
          End With
      'le codigo chaque matiere premiere
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtCodMP" & i
              .Object.Value = Mid(Sheets(2).Range("I" & i), 4, 5)
              .Left = 289
              .Top = 22 * i + 4
              .Width = 36
              .Height = 16
              .TextAlign = fmTextAlignCenter
              .Enabled = False
          End With
      'N° lote de chaquew mat pemiere
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtLote" & i
              .Object.Value = Sheets(2).Range("O" & i)
              .Left = 327
              .Top = 22 * i + 4
              .Width = 53
              .Height = 16
              .Enabled = False
          End With
      'cantidad requirida mat pemiere
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtCantRec" & i
              .Object.Value = Sheets(2).Range("M" & i)
              .Left = 382
              .Top = 22 * i + 4
              .Width = 61
              .Height = 16
              .TextAlign = fmTextAlignCenter
              .Enabled = False
          End With
      'cantidad practica mat pemiere
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtCantPract" & i
              .Object.Value = Sheets(2).Range("N" & i)
              .Left = 445
              .Top = 22 * i + 4
              .Width = 61
              .Height = 16
              .TextAlign = fmTextAlignCenter
              .Enabled = False
          End With
      'unidad
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtUnidad" & i
              .Object.Value = Sheets(2).Range("L" & i)
              .Left = 508
              .Top = 22 * i + 4
              .Width = 34
              .Height = 16
              .TextAlign = fmTextAlignCenter
              .Enabled = False
          End With
      'fraccion de chaque mat prim
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtFrac" & i
              .Left = 544
              .Top = 22 * i + 4
              .Width = 43
              .Height = 16
              .BackColor = RGB(180, 205, 205)
              .Tag = "2"
          End With
      'selladas de chaque mat prim
      Set Obj = Me.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtSelladas" & i
              .Left = 589
              .Top = 22 * i + 4
              .Width = 51 ' 53 ojo - 2 car dernier
              .Height = 16
              .Tag = "1"
          End With
      'ajout de l'objet dans la classe
       Set Cl = New Clase1
          Set Cl.textbox = Obj
          CollectTxt.Add Cl
      Next i
      'limitation valeur numerique de mes txtbox
      For Each ctrlNumBox In Me.Controls
           If TypeOf ctrlNumBox Is MSForms.textbox Then
               Select Case ctrlNumBox.Tag
                  Case Is = "1", Is = "2"
                      T = T + 1
                      ReDim Preserve TNumBox(1 To T)
                      Set TNumBox(T).NumBox = ctrlNumBox
              End Select
           End If
      Next ctrlNumBox
      
      End Sub
      


      Comme tu peux le voir je crée 9 txtboxs, qui ont chacune des propriétés différentes, avec des positions et des tailles particulieres, pour cela que je fais une par une.

      Associé a ce code j´ai 2 module de classe:
      - classe1 pour mes txtbox a l´initialisation
      Option Explicit
      Public WithEvents textbox As MSForms.textbox


      -classnumbox pour limiter des valeurs numerique dans 2 de mes txtbox: "txtselladas"et "txtfrac"
      Public WithEvents NumBox As MSForms.textbox
      Private Sub NumBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
       Select Case KeyAscii
          Case Is < 48, Is > 57
              KeyAscii = 0
              MsgBox "Solemente se puede ingresar cifras", 32, "Mensaje informativo"
          End Select
      End Sub
      


      Cést tres fortement possible que ce code peut etre optimisé ; mais ne voulant pas créer d´interaction entre mes variables et mes modules j´en ai créer une pour chacun.

      Je pense que thev a raison pour l´evenement change; car mon objectif est que l´utilisateur erntre des valeur numerique dans mes txtbox "txtselladas"et "txtfrac", a partir de ces valeurs et de 2 valeur deja dans mon tableau, j'ai créé 6 fonctions qui me donne 6 resultats, du coup ce que je cherche a faire c´est créer 6 txtbox m'affichant ces resultat dans mon usf pour ensuite imprimer certaines de ces données dans un format particulier....

      Tu pourras constater que j´utilise des collections pour créer dynamiquement mes txtbox et thev utilise un dictionnaire, je pense encore qu´il a raison et que c´est la bonne facon de faire, car moins gourmand en temps de réalisation mais plus simple de compréhension, tout du mois au premier abords... Je vais étudier la réponse de thev bien attentivement, mais voila tu sais a peu prés tout...

      Dans tous les cas merci pour ton temps, et je continue d´essayer de finir mes phrases ;)
      0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Cést tres fortement possible que ce code peut etre optimisé
    En effet.
    On va procéder par étapes.
    Essaye ce code dans ton bouton :
    Private Sub CmdCalc_Click()
    Dim Ctrl As Control
    For Each Ctrl In Me.Controls
       If Ctrl.Name Like "TxtSelladas*" Or Ctrl.Name Like "TxtFrac*" Then
          MsgBox Ctrl.Name & " contient : " & Ctrl.Value
       End If
    Next Ctrl 
    End Sub

    Pour le reste on verra après
    Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      oui cela me donne le nom de ma txtbox et la valeur qu´elle contient... Pourrais tu m´en dire plus?
      0
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pourrais tu m´en dire plus?

    Certainement, mais tu dis :

    Ce que je cherche a faire cést lors d´un évenement cmd clik, appeler ces txtbox et en fonction de leur valeur (qui doit etre numerique) je crée de nouveux textbox....

    et aussi :

    5- toujours concernant la création, pour l´asigantion des valeurs a mes nouvelles txtbox, qui depend dúne fonction dont les variables la composant sont des valeurs dáutres txtbox ds mon usf.

    Nous ne savons pas combien créer de TextBox, ni comment, ni qu'elle fonction tu utilises, ni ou les créer, etc...

    Ta question initiale est toutefois résolue, tu sais maintenant les appeler et récupérer leur valeur.
    Tente donc de faire quelque chose.

    Après cela, je te montrerai 3-4 petites choses à améliorer dans ton code.
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Bonjour Pijaku,

      C´est vrai que j´ai bcp écrit et peut etre pas été assez concis, et certaines infos sont passés a la trappe. De plus ce n´est pas clair non plus dans ma tete pcq novice en VBA, je me pose plein de question sur la conception du programme, et le faire bien!

      A l´initialisation de mon USF, j´ai 9 txtbox par ligne, 7 qui charge des info de ma feuille en position 2 et 2 txtbx que l´utilisateur rentre des infos. Jai autant de ligne ds mon USF que dans ma feuille 2.
      Si ces 2 dernieres txtbox ne sont pas vide je voudrais, en créer 6 autres (evenemnt clik ou initialisation: je ne sais pas quel est le mieux...) sur la meme ligne et utiliser leur valeur comme variable de mes fonction et botter mes résultats dans mes 6 nvlles txtbx.

      En poste 1, cad ma premiere question, je prends l ' exemple juste de la premiere des 6 txtbox que je veux créer, je la positionne a un left definit et a un top qui depend de i. La valeur que je souhaiterai serait le resultat de ma premiere fonction: "Selladas". Celle que j´emploie dans mon premiere exemple.

      'quantité de selladas
      Function Selladas(Cantidad, Fraccion, Sellada) As Double
      
      If Fraccion = 1 Then
        Selladas = Fix(Cantidad / Sellada)
      
      ElseIf Fraccion >= 1 Then
       CantReg = Round(Cantidad / Fraccion, 3)
       SellReg = Abs(Fix(CantReg / Sellada))
       FracReg = Fraccion - 1
       CantIReg = Cantidad - CantReg * FracReg
       SellIReg = Fix(CantIReg / Sellada)
      
              If SellIReg <= 0 Then
              Selladas = SellReg * FracReg
              ElseIf SellIReg > 0 Then
              Selladas = SellReg * FracReg + SellIReg
              End If
      Else
      MsgBox "Falta dato de fraccion", 48, "Error"
      End If
      End Function
      


      Cette premiere fction selladas a 3 variables qui sont :
      -cantidad: sa valeur est chargé a l ínitialisation de mon USF "TxtCantPract" & i
      -Fracion: sa valeur est une des 2 txtbox que renseigne l útilisateur "TxtFrac" & i
      -sellada: sa valeur est la 2ieme txtbox que renseigne lútilisateur "TxtSelladas" & i

      Pour le moment je n´arrive pas a créer les 6 nouvelles txt box (ou tout du moins une pour commencer), au cmdclik et en fonction des valeurs de mes autres textbox et encore moins leur assigné la valeur des résultats de mes fonctions....

      Mon casse tete est loin d´être résolu....

      Mais tu as raison je vais essayé de faire avec ce que j´ai... c´est a dire que ces 6 autres txtbox je vais les créer a l´initialisation de mon usf, je vais essayer de faire appel a mes fonction seulement a l´événement cmdclik... voir si je m´en sors avec ca mais sinon ca sera un autre sujet de discution.

      J´espere avoir été plus clair et explicite dans mes problematique.

      Merci Pijaku pour le temps consacré a mes pb, et pour les 3-4 petites choses a améliorer je suis prenneur et meme plus si tu as :)
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > GermPeru Messages postés 175 Statut Membre
         
        1- j'espère que toutes tes textbox sont situées dans un Frame sur l'userform. Si beaucoup de lignes dans ta feuille, ton userform va déborder de l'écran...

        2- tes 6 textbox à ajouter "dynamiquement" peuvent être ajoutées lors de l'initialisation, en étant simplement cachées (propriété Visible = False). Il suffirait de les afficher (Propriété Visible = True) en fonction des valeurs contenues dans tes 2 textbox gérées par la classe.

        3- tu souhaites que :
        >>3a - tes 6 textbox s'affichent dès la saisie des 2 textbox de la ligne
        >>3b - tes 6 textbox par ligne s'affichent tous en même temps pour toutes les lignes
        >>3c - autre solution?

        4- pour la suite, et selon tes réponses, il va nous falloir le fichier...
        Utilisation d'un site de pièces jointes (ex : Cjoint.com)
        Pour joindre un fichier sur les forums de ccm il faut :
        > se rendre sur le site : https://www.cjoint.com/
        > cliquer sur "Parcourir"
        > rechercher le fichier
        > cliquer sur "Ouvrir"
        > cliquer sur "Créer le lien Cjoint"
        > copier le lien
        > revenir ici le coller dans une réponse
        0
    2. GermPeru Messages postés 175 Statut Membre
       
      1-Non pour le coup elles ne sont pas dans une fram mais je nái jamais eu de cas a plus de 20 lignes, eta ce que jái testé l usf peut afficher jusqu´a 22; mais c´est une possibilité que je devrais prendre en compte

      2- Ton deuxieme points est une trés bonne reflexion qui serait une solution de substitution adequat, de plus ca me donne l´idée de proceder a l ´utilisation de mes formules directement dans ma deuxieme feuille puis rappatrié les résultats dans mon usf...

      3-ce detail de conception est flou car je ne sais pas trop d'un point de vue utilisateur quel est le mieux. Mais jáurais envie de te repondre a partir du moment que toute les informations sont presentes, lútilisateur clik sur cmdcalc pour calculer et toues mes 6 nouvelles txtbox apparaissent avec les resultats

      4- je ne peux pas te donner le fichier tel quel pour la simple raison que jái acheté un petit programme excel pour limiter l ´acces et la protection. De plus a travers une inputbox j áccede a une base de données, que je peu te fournir non plus. Alors j ái exporté tous les modules suffisant et nenecessaire dans un nvx fichier, j´ai copié une feuille exmple, essayé de faire en sorte que tu es a disposition toutes les données me parraissant utiles.
      Mais en soit a l´affichage de mon usf j´ai un code d érreur que je n´ai pas sur le fichier originel... J´ai essayé de comprendre le pk du comment, mais pas reussi...Tu m´en excusera... Je te le fournis quand meme...

      https://www.cjoint.com/c/GBqqEDVWrjF

      Un grand merci pour ces idées nouvelles qui vont permettre de faire de nouveaux essais, etudier de nouvelles pistes pour faire avec les connaissances que jái, en esperant qu´avec ce paliatif je pourrais remedier a mon probleme initiale dúne autre maniere. Merci, et j´ai hate de lire
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Voici comment je verrais les choses à ta place :
    https://www.cjoint.com/c/GBrjBupyYhE

    Ce n'est qu'un test, essaye le.
    Tu clic sur la listbox, ou tu veux, plusieurs fois sur chaque ligne, et vois.

    Avantages :
    > plus de classe
    > plus de textbox dynamiques
    inconvénient :
    > esthétique pas top
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Voici une seconde version un peu plus complète.
      https://www.cjoint.com/c/GBrlSpj3MZE
      0
    2. GermPeru Messages postés 175 Statut Membre
       
      Bonjour Pijaku,

      C'est beau, simple et propre... Je ne connaissais pas ces possibilités, ca libere de léspace dans l´usf, cela simplifie tres grandement le code, et de visue ca rend bien...

      J´avais commencé a cacher toutes les nouvelles txtbox, a faire mes calculs dans la feuille 2, et rappatrier les résultats dans mon usf.... Mais avec ces nouvelles données; vu que j´ai le temps, je vais essayé de développer les différentes interfaces pour voir ce qui correspond le mieux a mes nécéssité.

      Du coup pb résolu, voir mieux: simplifié!! avec dáutres pistes a étudier, jái beaucoup de taf devant moi; je ne sais pas comment te remercier pour ton aide et le partage de tes connaissance... Avec une telle distance je peux juste te dire merci Pijaku
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > GermPeru Messages postés 175 Statut Membre
         
        je ne sais pas comment te remercier pour ton aide
        C'est fait.
        A+ n'hésite pas !
        0