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

Résolu/Fermé
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018 - Modifié par GermPeru le 13/02/2017 à 23:32
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018 - 2 mars 2017 à 19:28
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!
A voir également:

5 réponses

thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié par thev le 14/02/2017 à 01:00
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
14 févr. 2017 à 18:17
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
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681 > GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
15 févr. 2017 à 03:06
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018 > thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024
16 févr. 2017 à 18:27
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
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681 > GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
17 févr. 2017 à 01:09
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018 > thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024
17 févr. 2017 à 14:51
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
15 févr. 2017 à 11:09
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
15 févr. 2017 à 14:31
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 15/02/2017 à 15:14
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
Modifié par GermPeru le 15/02/2017 à 19:55
oui cela me donne le nom de ma txtbox et la valeur qu´elle contient... Pourrais tu m´en dire plus?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
16 févr. 2017 à 08:17
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
Modifié par GermPeru le 16/02/2017 à 14:41
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
16 févr. 2017 à 16:18
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
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
Modifié par GermPeru le 16/02/2017 à 17:38
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
17 févr. 2017 à 10:29
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
17 févr. 2017 à 12:44
Voici une seconde version un peu plus complète.
https://www.cjoint.com/c/GBrlSpj3MZE
0
GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
Modifié par GermPeru le 17/02/2017 à 14:01
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > GermPeru Messages postés 172 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 27 mars 2018
17 févr. 2017 à 14:04
je ne sais pas comment te remercier pour ton aide
C'est fait.
A+ n'hésite pas !
0