formulaire de modification avec Combobox et texbox pre-rempli

bibbip35

XLDnaute Occasionnel
Bonsoir à tous

Je suis a la recherche d'une solution pour creer 1 formulaire de modification

J'ai aujourd'hui 1 userform me permettant d'inserer 1 ligne en remplissant des champs ( Combobox + Tex box )

Ce que je voudrais faire, c'est qu'en selectionnant la 1er combobox ; la deuxieme soit filtrée par rapport
a la 1ER ; la 3ème filtrée en focntion de la 2ème ; puis que les texbox se remplisse ensuite...

Puis que je modifie donc la textbox au choix

J'ai trouvée des exemple sur internet , mais je n'arrive pas à les adapter surement du a mon niveau débutant en VBA

Est que qq aurrait 1 solution simple? Ou est ce compliquée a mettre en oeuvre

Merci a tous

Bonne soirée

A+

Bibbip35
 

Pièces jointes

  • TEST CAPA.xlsm
    246.6 KB · Affichages: 170
  • TEST CAPA.xlsm
    246.6 KB · Affichages: 169
  • TEST CAPA.xlsm
    246.6 KB · Affichages: 170

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Je suis désolé Danreb, de vous "embeter" encore une nouvelle fois...

J'ai regarder le poset 24 ; mais...il y a tjs qq chose qui m'échappe

C'est ce code ci-dessous que je dois modifier?

Private Sub CL_BingoUn(ByVal LCou As Long)

Dim Ctrl As Control, T(), C As Long
T = CL.PlgTablo.Rows(LCou).Resize(, 92).Value
Me.TextBox1.Text = T(1, 8)
Me.TextBox10.Text = T(1, 9)
Me.TextBox2.Text = T(1, 27)
Me.TextBox7.Text = T(1, 30)
Me.TextBox8.Text = T(1, 34)
Me.TextBox9.Text = T(1, 43)
Me.TextBox11.Text = T(1, 10) * 100 & "%"
Me.TextBox12.Text = T(1, 11) * 100 & "%"
Me.TextBox13.Text = T(1, 12) * 100 & "%"
Me.TextBox14.Text = T(1, 13) * 100 & "%"
Me.TextBox15.Text = T(1, 14) * 100 & "%"
Me.TextBox16.Text = T(1, 15) * 100 & "%"
Me.TextBox17.Text = T(1, 16) * 100 & "%"
Me.TextBox18.Text = T(1, 17) * 100 & "%"
Me.TextBox19.Text = T(1, 18) * 100 & "%"
Me.TextBox20.Text = T(1, 19) * 100 & "%"
Me.TextBox21.Text = T(1, 20) * 100 & "%"
Me.TextBox22.Text = T(1, 21) * 100 & "%"
Me.TextBox4.Text = T(1, 33) * 100 & "%"


End Sub

Merci & bonne journée
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Non ce n'est pas bon: ça ne sert à rien de changer le nom du paramètre passé à la procédure CL_BibgoUn puisqu'il ne sera alors quand même pas conservé et connu dans tous l'Userform comme une variable commune à toutes les procédures. Il faut le déclarer en tête de l'userform, derrière la déclaration de CL, et dans la CL_BingoUn lui affecter la vareur de Ligne passé en paramètre.
 

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Bonjour

Je suis vraiment désolé ; mais je vois vraiment pas quoi faire...
Je connais rien en programation VBA...et cela ce sent...

Merci en tous cas pour le temps passé

Bibbip35
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Alors n'hésitez pas à mettre des commentaires partout pour vous aider à vous y retrouver :
VB:
Option Explicit ' Pour limiter les risques de faire des conneries.
Dim WithEvents CL As ComboBoxLiés ' Objet global avec évènements. Vois module de classe ComboBoxLiés.
Dim LCou As Long ' Numéro courant de la ligne en cours de modification (variable globale).

Private Sub UserForm_Initialize() ' Prise en charge évènement MsForms au chargement de l'Userform.
Set CL = New ComboBoxLiés ' Attribue une existence réelle à l'objet (addresse et ressources mémoire)
CL.CouleurSympa ' Gadget d'assistance de confort.
CL.Plage Feuil1.Rows(7) ' Plage à partir de la ligne 7 de Feuil1 (Config. lignes). Devient CL.PlgTablo
CL.Add Me.ComboBox1, "A"
CL.Add Me.ComboBox2, "F"
CL.Add Me.ComboBox3, "G"
CL.Actualiser ' Met à jour les listes initiales des ComboBox.
End Sub

Private Sub CL_BingoUn(ByVal Ligne As Long) ' Prise en charge évènement BingoUn de CL
Dim T() As Variant ' Tableau d'une ligne des valeurs de cellules.
LCou = Ligne ' Récupère le numéro de ligne trouvé et transmis par CL.
T = CL.PlgTablo.Rows(LCou).Resize(, 92).Value
Me.TextBox1.Text = T(1, 8)
' etc.
Remarque: vous auriez intérêt à mettre LCou = 0 dans la procédure CL_Défait. Comme ça vous pourrez utiliser une procédure unique pour créer une ligne (si LCou = 0) ou modifier la ligne courante. Il suffira de créer une ligne dont vous mettrez le numéro dans LCou avant de décharger le tableau de valeurs issues des contrôles. Je vous conseille de le faire par cette séquence d'instructions :
VB:
If LCou = 0 Then
   LCou = CL.PlgTablo.Rows.Count
   With CL.PlgTablo.Rows(LCou): .Copy: .Insert: End With
   LCou = LCou + 1: End If
…
T(1, 8) = Me.TextBox1.Text
' etc.
CL.PlgTablo.Rows(LCou).Resize(, 92).Value = T
CL.Actualiser
End Sub
Vous pourriez aussi avoir intérêt à utiliser une variable globale VLgn() à la place de T partout, pour ne pas devoir remettre les valeurs des ComboBox, cette fois, dans une ligne existante.
 
Dernière édition:

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Re-bonjour

J'ai remis a jour mes codes selon vos conseils avisée; merci les comentaires seront fort utile dans le temps

Concernant le code pour pouvoir modifier; ca me met une erreur " Sub ou fonction non definie"

Je suis vraiment désoler ; de vous soliciter encore une fois...c'est pour cela
que je vous remercie sincerement pour TOUTE l'aide depuis le début

Private Sub BtnValider_Click(ByVal Ligne As Long)

Dim VLgn() As Variant ' Tableau d'une ligne des valeurs de cellules.
LCou = Ligne ' Récupère le numéro de ligne trouvé et transmis par CL.

If LCou = 0 Then
LCou = CL.PlgTablo.Rows.Count
With CL.PlgTablo.Rows(LCou): .Copy: .Insert
End With
LCou = LCou + 1
End If

Me.TextBox1.Text = VLgn(1, 8)
Me.TextBox10.Text = VLgn(1, 9)
Me.TextBox2.Text = VLgn(1, 27)
Me.TextBox7.Text = VLgn(1, 30)
Me.TextBox8.Text = VLgn(1, 34)
Me.TextBox9.Text = VLgn(1, 43)
Me.TextBox11.Text = VLgn(1, 10) * 100 & "%"
Me.TextBox12.Text = VLgn(1, 11) * 100 & "%"
Me.TextBox13.Text = VLgn(1, 12) * 100 & "%"
Me.TextBox14.Text = VLgn(1, 13) * 100 & "%"
Me.TextBox15.Text = VLgn(1, 14) * 100 & "%"
Me.TextBox16.Text = VLgn(1, 15) * 100 & "%"
Me.TextBox17.Text = VLgn(1, 16) * 100 & "%"
Me.TextBox18.Text = VLgn(1, 17) * 100 & "%"
Me.TextBox19.Text = VLgn(1, 18) * 100 & "%"
Me.TextBox20.Text = VLgn(1, 19) * 100 & "%"
Me.TextBox21.Text = VLgn(1, 20) * 100 & "%"
Me.TextBox22.Text = VLgn(1, 21) * 100 & "%"
Me.TextBox4.Text = VLgn(1, 33) * 100 & "%"

CL.PlgTablo.Rows(LCou).Resize(, 92).Value = VLgn()
CL.Actualiser


End Sub

MERCI

Bibbip
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Prenez l'habitude de ne jamais plus écrire vous même les instruction Private Sub des procédures évènement, mais d'utiliser les 2 listes déroulantes qui surmontent la fenêtre de code pour installer leurs modèles. Celle de gauche pour choisir l'objet, celle de droite pour la procédure. Comme ça vous ne risquerez plus d'être en désaccord avec la définition de l'évènement dans le module de classe, même s'il est dans une bibliothèque. À ma connaissance les évènements Click d'un contrôle quel qu'il soit ne transmettent jamais aucun paramètre. D'ailleurs pourquoi voudriez vous changer la valeur de LCou d'une ligne existante, alors qu'elle a déjà été préalablement fixée correctement lors de l’exécution de la CL_BingoUn ?
D'autre part VLgn est déclaré comme tableau local et n'est pas redimensionné. Je vous suggérai d'envisager de le déclarer aussi en global, ça pourrait peut être simplifier des choses. Ne programmez plus à l'aveuglette, réfléchissez au scénario des causes et des effets, à l'enchainement logique des actions exécutées dans les diverses procédures. Là, même si vous faites un Redim VLgn, vu qu'il est local pour l'instant, les valeurs des ComboBox n'y seront pas ! Vous n'avez pas vu ça ? Vous pourriez certes les mettre, mais ce pourrait être évité pour une ligne existante si VLgn était aussi global, comme LCou, et aussi récupéré par CL_BingoUn: elles y seraient alors ces valeurs puisqu'il y récupérerait une ligne existante !
Oh et puis tiens, là, j'avais même pas vu le pire ! Vous envoyez les valeurs de VLgn dans les contrôles, comme au CL_BingoUn, au lieu de faire le contraire ! Vous espérez arriver à envoyer quoi comme ça dans votre ligne de cellules ???
 

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Bonjour.

désolé de revennir encore une fois ; mais j'ai toujours sub ou fonction non définie

Je ne comprends ; pas les instructions Private Sub a indiquer?

Voici mon code pour modifier 1 cellule

Private Sub BtnValider_Click()


If LCou = 0 Then
LCou = CL.PlgTablo.Rows.Count
CL.PlgTablo.Rows(LCou).Copy
CL.PlgTablo.Rows(LCou).Insert
LCou = LCou + 1: End If

T(1, 8) = Me.TextBox1.Text
T(1, 9) = Me.TextBox10.Text
T(1, 27) = Me.TextBox2.Text
T(1, 30) = Me.TextBox7.Text
T(1, 34) = Me.TextBox8.Text
T(1, 43) = Me.TextBox9.Text
T(1, 10) = Me.TextBox11.Text
T(1, 11) = Me.TextBox12.Text
T(1, 12) = Me.TextBox13.Text
T(1, 13) = Me.TextBox14.Text
T(1, 14) = Me.TextBox15.Text
T(1, 15) = Me.TextBox16.Text
T(1, 16) = Me.TextBox17.Text
T(1, 17) = Me.TextBox18.Text
T(1, 18) = Me.TextBox19.Text
T(1, 19) = Me.TextBox20.Text
T(1, 20) = Me.TextBox21.Text
T(1, 21) = Me.TextBox22.Text
T(1, 33) = Me.TextBox4.Text

CL.PlgTablo.Rows(LCou).Resize(, 92).Value = T()
CL.Actualiser


End Sub



MERCI ENCORE 1 FOIS
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Zut, j'ai accidentellement créé un nouveau poste au lieu de faire un édit de celui ci. J'en fais donc un qui remplace tout le texte par cette phrase, que vous avez quasiment fini de lire…
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Bonjour.
Utiliser les 2 listes déroulantes qui surmontent la fenêtre de code. Indice pour vous aider à les trouver, puis-qu’apparemment vous ne les aviez jamais remarquées: celle de gauche est initialement positionnée sur "(Géneral)", et celle de droite sur le nom de la procédure dans laquelle se trouve le curseur texte de la fenêtre de code, à défaut sur "(Déclarations)". En plus des procédures existantes dans le code, qui seules y sont en gras, la liste de droite contient aussi, pour un objet sélectionné dans celle de gauche, les procédures qui, en les sélectionnant, peuvent être installées automatiquement sans risque d'erreur.
Vous êtes repassé à un nom court, T, pour préparer votre ligne de valeurs. Est-ce à dire que vous souhaitez qu'elle reste locale cette variable tableau, ou bien l'avez vous bien déclarée en tête de l'Userform afin qu'elle soit globale ? Et dans ce cas que contient elle au moment de l'exécution ? Mettez des espions pour vérifier ça. Bizarre, moi je prends plutôt un nom court, 1 ou 2 lettres pour les variables locales et au moins 3 pour les globales, mais bon, c'est vrai aussi que ce n'est déjà plus le cas pour CL, au fond.
 

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Merci du retour

En faite, ce que je comprends pas ; c'est que je ne vois pas ou mettre la procédure

If LCou = 0 Then
LCou = CL.PlgTablo.Rows.Count
With CL.PlgTablo.Rows(LCou): .Copy: .Insert
End With
LCou = LCou + 1
End If

Me.TextBox1.Text = VLgn(1, 8)
Me.TextBox10.Text = VLgn(1, 9)
Me.TextBox2.Text = VLgn(1, 27)
Me.TextBox7.Text = VLgn(1, 30)
Me.TextBox8.Text = VLgn(1, 34)
Me.TextBox9.Text = VLgn(1, 43)
Me.TextBox11.Text = VLgn(1, 10) * 100 & "%"
Me.TextBox12.Text = VLgn(1, 11) * 100 & "%"
Me.TextBox13.Text = VLgn(1, 12) * 100 & "%"
Me.TextBox14.Text = VLgn(1, 13) * 100 & "%"
Me.TextBox15.Text = VLgn(1, 14) * 100 & "%"
Me.TextBox16.Text = VLgn(1, 15) * 100 & "%"
Me.TextBox17.Text = VLgn(1, 16) * 100 & "%"
Me.TextBox18.Text = VLgn(1, 17) * 100 & "%"
Me.TextBox19.Text = VLgn(1, 18) * 100 & "%"
Me.TextBox20.Text = VLgn(1, 19) * 100 & "%"
Me.TextBox21.Text = VLgn(1, 20) * 100 & "%"
Me.TextBox22.Text = VLgn(1, 21) * 100 & "%"
Me.TextBox4.Text = VLgn(1, 33) * 100 & "%"

CL.PlgTablo.Rows(LCou).Resize(, 92).Value = VLgn()
CL.Actualiser

Private sub..........
Elle doit s'activer quand je clique sur le bouton modifier? Non?

MERCI ENCORE
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Oui, c'est bien BtnValider_Click(), mais ce doit bien être les Text des contrôles qui doivent être envoyés, et non dans l'autre sens, dans un tableau d'une ligne convenablement déclaré quelque part (dans la procédure pour du local, en tête de l'Userform pour du global), puis formaté (le Redim qui manquait si c'est local), voire initialisé (par ailleurs peut être si c'est global) pour ce qui est des clés seulement, aussi présentes dans les ComboBox, puisque le reste c'est bien ici qu'on doit le renseigner de toute façon. Pour les derniers TextBox, bien évidemment, c'est l'expression inverse qui doit être envoyée: VLgn(1, 10) = Substitue(Me.TextBox11.Text, "%", "") / 100
 
Dernière édition:

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Bonjour

Je reviens vers vous , pour mon pb de modification

Ca avance; j'arrive a modifier 1 valeur de mon tableau; par contre , l'userform
supprime toute les cellules qui ne sont pas renseignée par les textbox???
Exemple , colonne 2 à 7....

Je ne vois comment resoudre ce problème

EN tous cas ; une nouvelle fois 1 grand merci

CODE MAJ

Private Sub BtnValider_Click()

Application.EnableEvents = False
ReDim VLgn(1 To 1, 1 To 43)

If LCou = 0 Then
LCou = CL.PlgTablo.Rows.Count
With CL.PlgTablo.Rows(LCou): .Copy: .Insert: End With
LCou = LCou + 1: End If

VLgn(1, 8) = Me.TextBox1.Text
VLgn(1, 9) = Me.TextBox10.Text
VLgn(1, 27) = Me.TextBox2.Text
VLgn(1, 30) = Me.TextBox7.Text
VLgn(1, 34) = Me.TextBox8.Text
VLgn(1, 43) = Me.TextBox9.Text
VLgn(1, 10) = Replace(Me.TextBox11.Text, "%", "") / 100
VLgn(1, 11) = Replace(Me.TextBox12.Text, "%", "") / 100
VLgn(1, 12) = Replace(Me.TextBox13.Text, "%", "") / 100
VLgn(1, 13) = Replace(Me.TextBox14.Text, "%", "") / 100
VLgn(1, 14) = Replace(Me.TextBox15.Text, "%", "") / 100
VLgn(1, 15) = Replace(Me.TextBox16.Text, "%", "") / 100
VLgn(1, 16) = Replace(Me.TextBox17.Text, "%", "") / 100
VLgn(1, 17) = Replace(Me.TextBox18.Text, "%", "") / 100
VLgn(1, 18) = Replace(Me.TextBox19.Text, "%", "") / 100
VLgn(1, 19) = Replace(Me.TextBox20.Text, "%", "") / 100
VLgn(1, 20) = Replace(Me.TextBox21.Text, "%", "") / 100
VLgn(1, 21) = Replace(Me.TextBox22.Text, "%", "") / 100
VLgn(1, 33) = Replace(Me.TextBox4.Text, "%", "") / 100


CL.PlgTablo.Rows(LCou).Resize(, 92).Value = VLgn()
CL.Actualiser

Application.EnableEvents = True

End Sub
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Bonjour.
Ça fait de nombreux postes que j'essaye de vous alerter que vous risquez, si vous n'y prenez garde, de perdre les valeurs qui ont été envoyées dans les ComboBox !
Et la solution qui aurait ma préférence serait que VLgn ne soit non pas local dans chaque procédure mais global (déclaré en tête de l'userform) et que ces valeurs y soient donc récupérées en même temps que les autres par CL_BingoUn. Dans ce cas il n'y aurait plus lieu de faire un Redim VLgn dans BtnValider_Click puisque ça, ça les efface ! Le problème demeure toutefois entier pour les nouvelles lignes. Pour récupérer les valeurs des ComboBox dans un nouveau VLgn (remis à 0 par un Redim) vous pourriez utiliser les trois lignes de code ci après. Je me rends compte que n'auriez, évidemment, jamais su trouver aujourd'hui la troisième, vu l'état de vos capacité d'observation des possibilités :
VB:
LCou = 0
ReDim VLgn(1 To 1, 1 To 43)
For I = 1 To 3: With CL.Item(I): VLgn(1, .Col) = .CBx.Text: End With: Next I
Avec I déclaré As Long.

Je vous demande de faire en sorte que cela s'exécute à chaque fois qu'un ComboBox change, mais seulement si le nombre de lignes trouvées par CL est à 0. Je vous attend au tournant pour voir comment vous allez installer conformément à mes recommandations la nouvelle procédure qui contiendra ce code.

Allez, je donne quand même la marche à suivre:
1) - Lire attentivement les commentaires en début du module de classe ComboBoxLiés. Pour ne pas perdre trop de temps, vous pouvez sautez directement aux rubriques "—— ÉVÈNEMENTS etc.
2) - Après retour dans le code de l'Userform, sélectionner "CL" dans la liste de gauche: la liste "Objet". La première étape vous aura clairement informé du nom de la procédure vous devrez sélectionner dans celle de droite: la liste "Procédure".
 
Dernière édition:

bibbip35

XLDnaute Occasionnel
Re : formulaire de modification avec Combobox et texbox pre-rempli

Merci pour votre aide depuis le début…et je comprends votre « frustation » du faite que je ne comprends…
«…. vu l'état de vos capacité d'observation des possibilités…. »

Vos explications sont très bonne et très bien faites et je vous en félicite et vous en remercie…Mais , comme je vous le précisais dans mes autres post
Je suis débutant en VBA et j’ai jamais fais d’études en programmation VBA …Et le monde VBA , est encore obscure pour moi…

L’objet de ma réponse, était principalement pour vous remercier pour toutes l’aide et vous féliciter
et vous tirer mon Chapeau

Sionon , concernant mon pb de modification de cellule ....
Mon pb est que je comprends votre logique, mais c'est les codes vba...que je ne comprends pas...

Je precise que ma problèmatique est que j'ai certaines cellule; contiennent des formules qui ne doivent
pas être effacée....................

En faite , au final je vous l'assure j'aurrais voulu comprendre et reussire tous seul ; mais je me rencontre
que je n'y arrivrais pas...Je ne vois comment écrire ces codes ( Aucune notion )

EN tous cas MERCI!!!! pour tous et bonne soirée
 

Dranreb

XLDnaute Barbatruc
Re : formulaire de modification avec Combobox et texbox pre-rempli

Non, mais c'est normal, je veux dire, à votre stade, que vous n'auriez sûrement pas encore été à même de combiner un faisceaux de faits constatés, à savoir que la méthode Item de ComboBoxLiés renvoie un objet de type ComboBoxMembre, que celui ci possède les propriétés Cbx représentant le ComboBox et Col qui représente le numéro de colonne, et, futé, d'en déduire que cela permet donc d'écrire cette boucle. Ça viendra si vous vous accrochez bien, mais pas tout de suite !
N'hésitez pas à me demander des explications sur ce que vous ne comprenez pas dans les codes VBA. Ne serait ce que pour essayer de rattraper un minimum de concepts de base du langage que vous n'avez pas étudié préalablement comme il aurait fallu, avant de vous lancer dans quoi que ce soit.
Où en êtes vous de la démarche que je vous indiquais pour définir la procédure dans laquelle vous récupérerez, du fait qu'il n'y a pas de correspondance avec une ligne existante les contenant, les valeurs des ComboBox dans un VLgn vide ? Vous avez déjà vu, au moins ce qu'il y a au début du module ComboBoxLiés ? Dans l'explorateur de projet, il est non pas dans la rubrique Modules, mais dans la Modules de classe. Tenez moi au courant de l'avancement de cette démarche. C'est un peu un exercice: je vous demande un truc simple: me trouver, après étude de mes commentaires dans le module de classe, quelle est le nom de la procédure pour l'objet CL dont vous devez engager l'installation automatique au moyen des listes tout au dessus (enfin en dessous des barres de menu et d'outils, quand même, juste au dessus de la fenêtre de code, quoi. Je veux que vous saisissiez l’importance de ces deux larges liste déroulantes. Elles ne sont pas là pour décorer: elles jouent un rôle fondamental dans l'installation automatique des modèles de procédures de prise en charge d'évènements). Vous allez le faire comme je vous dis de le faire, je ne vous laisserai plus passer à coté de ça, à vous lamenter de n'y rien comprendre. C'est clair ?
P.S. Un tuyau important, mais qui n'a rien à voir avec ça: vous pouvez découvrir énormément de choses, le curseur texte étant chaque fois, dans la fenêtre de code, sur un élément du langage, en utilisant la touche F1.
 
Dernière édition:

Discussions similaires