contrôles dynamique dans module de classe

philout

XLDnaute Nouveau
Bonjour à tous,
Je soumets par ce message une question qui porte sur la création de contrôles dynamiques dans un userform.
Au fil de ma consultation forum, je suis parvenu à construire une succession de procédures plus ou moins perfectionnées mais qui fonctionnent pour un projet de masque de saisie Excel.
Mon projet m'appelle à créer un nombre très important de contrôle (plusieurs centaines) et bien évidemment comme tout néophyte, j'ai créé un monstrueux userform qui s'est rapidement trouvé planté capacité mémoire par le nombre délirant de contrôles que je voulais lui engouffrer.
J'ai donc découvert la création dynamique (évènementielle) de contrôles. Cependant, si je suis parvenu à créer des frames, et dans chaque frame des textbox successifs récupérant les valeurs d'une cellule dans la feuille Excel, je suis à l'arrêt total sur la création de textbox qui fasse l'inverse c'est à dire envoyer une valeur saisie par l'utilisateur sur le userform vers une cellule Excel: je saisie mais rien ne se passe.
Et pire, lors de la tentative de création d'une combobox, le "programme" est carrément impossible à démarrer pour cause d'erreur 438.
Il doit s’agir de logique anodine de rédaction qui bloque le tout, mais c’est qui fait souvent que cela marche ou pas.
Je vous joins un extrait de mon développement pour échange.
Dans l’espoir que quelqu’un puisse me décoincer,
D’avance un grand merci à votre intérêt.
 

Pièces jointes

  • testUSFpoids.xlsm
    70.4 KB · Affichages: 29
  • testUSFpoids.xlsm
    70.4 KB · Affichages: 24
  • testUSFpoids.xlsm
    70.4 KB · Affichages: 33

Robert

XLDnaute Barbatruc
Repose en paix
Re : contrôles dynamique dans module de classe

Bonjour Philout et bienvenu, bonjour le forum,

• Tu utilises Option Explicit mais tu n'as pas déclaré toutes les variables ! Du coup ça plante chaque fois qu'une variable non déclarée est rencontrée dans le code...
• Tu déclares Dim plage as Range, puis tu définis plage=.Range("Q4:Q7").adress
Déjà, le mot exact est
Address et pas adress... Mais une adresse serait une variable de type String et pas Range ! Donc soit tu écris (avec 2 d à Address et ta variable est de type String) :
Code:
Public Sub cb_change()
Dim plage As String

With Sheets("feuille de saisie")
   plage = .Range("q4:q7").Address

soit tu écris (sans Address et ta variable est de type Range avec Set devant) :

Code:
Public Sub cb_change()
Dim plage As Range

With Sheets("feuille de saisie")
     Set plage = .Range("Q4:Q7")

La différence est que dans le premier cas (variable String) pour utiliser la variable le code serait : Range(plage).Select, dans le second (variable Range) le code serait : plage.Select

je te conseille de revoir ton code et renvoyer un fichier correct...

Sinon, pour renvoyer les données saisies dans un contrôle d'une UserForm, le plus souvent on utilise on CommandButton. Le code pour une TextBox ressemble à :

Code:
Range(Ta_cellule).Value = Me.TextBox1.Value
 

philout

XLDnaute Nouveau
Re : contrôles dynamique dans module de classe

Bonjour Robert et merci pour ta rapide réponse.

Je viens de corriger les éléments relatifs à la déclaration string ou range.
Je viens également de déclarer dans le volet option explicit de mon module de classe toutes les variables.

Plusieurs tentatives de modification plus tard (notamment en plaçant option explicit plutôt dans la feuille que dans le module de classe)
Mais j'obtiens le même résultat.

Merci en tout cas pour l'intérêt que tu portes à ma demande.

Philout
Je te joins mon fichier corrigé.
 

Pièces jointes

  • testUSFpoids.xlsm
    68.4 KB · Affichages: 27
  • testUSFpoids.xlsm
    68.4 KB · Affichages: 33
  • testUSFpoids.xlsm
    68.4 KB · Affichages: 31

Robert

XLDnaute Barbatruc
Repose en paix
Re : contrôles dynamique dans module de classe

Bonjour Philout, bonjour le forum,

Ça ne peut pas marcher ton code est incohérent et je n'ai pas le temps de tout reprendre !
Déjà rien qu'à l'ouverture :

Code:
Private Sub Workbook_Open()
AncienNbrCages = Sheets("Feuille de Saisie").Range("K7").Value
End Sub
La variable AncienNbrCages n'est déclarée nulle part alors que si tu veux la réutiliser il te faudrait la déclarer publique dans un module standard (Module1 par exemple) : Public AncienNbrCages As Intgeger (le type restant à définir car dans ton exemple K7 est vide...)

Ensuite je vais dans le module de classe et tu as déclaré un tas de variables qui ne sont pas utilisées et je pense n'ont rien à faire ici (?) :

Code:
Dim Compteur, compteur2 As Integer
Dim frmcage As MSForms.Frame
Dim TxtPoidsproduitcalculé, TxtPoidsproduitimposé As MSForms.Control
Dim Cbxpoidscouleur As MSForms.ComboBox
Dim lb As MSForms.Label
Dim plage As Range
Dim Cl, C2, C3 As ClasBT
Dim CollectTx As Collection

Puis tu écris :
Code:
Public Sub cb_change()
Dim plage As Range
With Sheets("feuille de saisie")
Set .plage = .Range("q4:q7")

Sheets("Feuille de Saisie").Cells(3, 8) = plage.Select
End Sub
un With sans End With (?)

Puis c'est du grand n'importe quoi :
Code:
Sheets("Feuille de Saisie").Cells(3, 8) = plage.Select
tu dis : je veux que la valeur de la cellule ligne 3 colonne 8 (=H3) soit : sélectionner la range plage
Bref, je ne suis pas allé plus loin...

Commence par faire tourner ton code pas à pas pour corriger au moins ces erreurs et ensuite nous pourront essayer de t'aider...
 

philout

XLDnaute Nouveau
Re : contrôles dynamique dans module de classe

Bonjour le forum et bonjour Robert s'il est là et puisque qu'il s'est interessé à mon problème.

J'ai donc repris mon fichier et mon userform. nettoyage + cohérence dans l'écriture amène désormais à l'affichage comme souhaité.

Je formule donc ma question originelle:
Dans ce userform, j'affiche différents contrôles (textbox et combobox) selon un nombre de lot. (5 dans l'exemple)

Si je récupère bien les valeurs ou liste depuis la feuille Excel vers le userform (TEXTBOX calculé et COMBOBOX couleur), je ne sais pas en revanche comment permettre l'envoi vers la feuille Excel des choix de l'opérateur dans la liste du combo des couleurs par produit ou de la valeur numérique dans la textbox imposé.

Volontairement, je n'ai pas saisi d'ailleurs de ligne correspondant à cette action ne sachant pas si elle doit intervenir dans la boucle de constition du contrôle dynamique ou dans une autre procédure.

Vous remerciant d'avance pour aide précieuse.
Cordialement à tous
je joins mon fichier.
 

Pièces jointes

  • testUSFpoids.xlsm
    63 KB · Affichages: 36
  • testUSFpoids.xlsm
    63 KB · Affichages: 32
  • testUSFpoids.xlsm
    63 KB · Affichages: 27

philout

XLDnaute Nouveau
Re : contrôles dynamique dans module de classe

Bonsoir,

je suis sans retour sur mon questionnement.

J'ai depuis identifié que la déclaration de la combo pouvait contenir un intitulé que je pouvais incrémenter sous la forme:
"Set variable = frm.add("forms.combobox.1", "nom" & Chr(64 + compteur2))"... par exemple

et vraisemblablement ressortir dans le module de classe mais, je ne sais vraiment et toujours pas comment inscrire dans ce module la procédure qui envoi sur la feuille Excel ce que l'utilisateur de l'appli saisi ou selectionne dans une combo ou une textbox.

SVP, pouvez-vous m'aider?
Cordialement
Philout
 

Pièces jointes

  • testUSFpoids.xlsm
    64.5 KB · Affichages: 36
  • testUSFpoids.xlsm
    64.5 KB · Affichages: 39
  • testUSFpoids.xlsm
    64.5 KB · Affichages: 36

Discussions similaires

Réponses
29
Affichages
1 K

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 977
dernier inscrit
Hermet