OVH Cloud OVH Cloud

comment coder une combobox pour remplir diverses feuilles d'un classeur

26 réponses
Avatar
raptorus1er
Bonjour,
Tout nouveau sur le forum et dans le codage VBA, je viens vers vous car n'ayant que pour seul méthode d'apprentissage le visionnage et la retranscription de tutoriels vidéos je suis vite perdu dans les termes utilisés.
Après bcp de temps à essayer de comprendre comment créer un formulaire, je suis face à une colle pour mon faible niveau.
Pour la petite explication, j'ai souhaité créer un formulaire car dans mon service, chaque dossier contient une liste mise sous excel, j'ai premièrement rassemblé toutes les listes sur un seul classeur sur diverses feuilles.
De là je me suis lancé sur la création d'un formulaire qui reprend par les textbox toutes les données des diverses listes et une combobox (dans laquelle j'ai listé les diverses feuilles) qui est censée diriger les informations remplies vers la feuille qui aura été sélectionné dans la ComboBox.
et me voilà dans le flou le plus total pour la rédaction d'un code me permettant cette instruction.
Après avoir parcouru les diverses questions, je n'ai pas trouver de solution à mon problème.
Quelqu'un aurait il la possibilité d'orienter mes recherches ou de me guider dans la rédaction du code.
merci à vous
bien cordialement

6 réponses

1 2 3
Avatar
raptorus1er
Le mardi 11 Septembre 2018 à 19:39 par Michd :
Bonjour,
Dans ton formulaire, j'ai renommé tous les contrôles
"Texte" et "Combobox" du nom de l'étiquette
au-dessus des contrôles respectifs. Lorsque ces étiquettes ont une
appellation de plus d'un mot, le
nom (propriété name) des contrôles est le même que
l'étiquette + un "_" remplaçant l'espace. Les
accents font aussi partie des noms des contrôles.
Dans tes feuilles, le nom des étiquettes de colonnes de la ligne 2, doit
avoir la même appellation
que les étiquettes ou noms des contrôles du formulaire. Cependant,
nul besoin d'utiliser le "_" pour
remplacer les espaces. Ces étiquettes de colonnes dans plusieurs
feuilles ont des noms différents.
Je ne les ai pas modifiés, c'est ton travail.
Les contrôles "Combobx" ne sont jamais "touchés par
la procédure".
Quand tu modifies le contenu du combobox "Listing" seulement les
contrôles de la feuille contenant
le nom des étiquettes de la ligne 2 de la feuille sont activés
dans le formulaire.
Ton fichier : https://www.cjoint.com/c/HIlrAWyQNdF
Observe, tous les noms des "Textbox" débutent par
"Txt", celui des combobox par "Cmb" et celui des
boutons de commande par "Cmd". En prenant le temps de bien nommer les
contrôles, c'est beaucoup plus
facile de s'y retrouver lorsque l'on désire insérer du code!
MichD
"raptorus1er" a écrit dans le message de groupe de discussion
:
Le vendredi 07 Septembre 2018 à 14:12 par Michd :
Si tu veux ajouter des données (une nouvelle ligne) à un tableau
des données, voici un exemple de
code.
Si tu veux simplement modifier une donnée existante du tableau, ceci
est
suffisant :
With Activesheet 'OU Worksheets("NomFeuille")
.Cells(3, 1) = "toto100"
End With
Ce code ajoute une ligne nouvelle de donnée au tableau.
'-------------------------------------
Sub Ajouter_New_Data_To_A_Table()
Dim Sh As Worksheet
Dim T As ListObject, Newrow As ListRow
Set Sh = ActiveSheet
Set T = Sh.ListObjects("Tableau1")
Set Newrow = T.ListRows.Add
With Newrow
.Range(1) = "...." 'Première colonne nouvelle ligne
.Range(2) = "......" 'Deuxième colonne ...
.Range(3) = "Ce que tu veux"
End With
End Sub
'-------------------------------------
Pour ce qui est des textbox, tu as déjà un exemple.
MichD
bonjour,
voici mon fichier avec les problèmes qui se posent à moi,
à savoir:
- enregistrement des informations sur toutes les feuilles de mon classeur
- lorsque l'on passe d'une donnée à une autre dans la combobox1,
les textboxs
qui ont déjà été désactivées ne sont
plus actives sans avoir redémarré le
formulaire.
c'est tout ce qui me pose problème du moins pour le moment :)
https://www.cjoint.com/c/HIlhAauYsFc
toutes modifications seront les bienvenues pour faciliter l'utilisation de mon
projet.
merci à vous et bonne journée
bonjour, MichD et bonjour à toutes et tous,
après modifications, le bouton de commande ne s'active pas.
je te fais suivre le fichier si tu peux me dire d'où vient le problème. Merci
https://www.cjoint.com/c/HIoopETxCJc
par contre as tu la possibilité de m'expliquer quel est le code pour que les textbox soient activés selon le choix de la cmblisting pcq ça ne se fait pas. sans doute une erreur de ma part.
Avatar
Michd
Bonjour,
Je joins un fichier que j'avais créé il y a quelques années afin de donner un exemple sur la manière
de gérer une plage de données sur une feuille de calcul à partir d'un formulaire. Le fait de gérer
ne change pas beaucoup la donne. Comme le nom s'affiche dans le combobox de ton formulaire, tu sais
toujours à quelle feuille de calcul il est fait référence. À chaque changement de feuille, il s'agit
de recharger le contenu du formulaire.
Mon formulaire montre comment retrouver des enregistrements de la feuille, modifier un ou des
enregistrements déjà enregistrés, supprimer l'un ou plusieurs enregistrements ou simplement ajouter
un nouvel enregistrement.
Si tu es débutant en VBA, la compréhension et la réalisation peuvent prendre plusieurs jours.
https://www.cjoint.com/c/HIrk3VA1Bz7
En ce qui me concerne, ta question est vague, de quel bouton de commande parles-tu? Qu'est-ce que ce
bouton de commande devrait faire? Je n'ai pas le temps ni l'envie de monter ton formulaire en pièce
détachée...Il va falloir que tu t'y mettes!
MichD
Avatar
Michd
Une suggestion, pour quoi ne pas utiliser une seule feuille de calcul pour entrer, modifier,
supprimer des données. Rien ne t'empêche de créer sur les autres feuilles, divers tableaux croisés
dynamiques avec les champs désirés. Dès que tu modifies la base de données de la première feuille,
tous les TDC se mettent à jour. C'est plus simple comme gestion.
MichD
Avatar
raptorus1er
Le mardi 18 Septembre 2018 à 16:28 par Michd :
Une suggestion, pour quoi ne pas utiliser une seule feuille de calcul pour
entrer, modifier,
supprimer des données. Rien ne t'empêche de créer sur les
autres feuilles, divers tableaux croisés
dynamiques avec les champs désirés. Dès que tu modifies
la base de données de la première feuille,
tous les TDC se mettent à jour. C'est plus simple comme gestion.
MichD
bonjour MichD
la question que je te posais c'est pourquoi le cmdSave (bouton enregistrer bleu) n'est pas actif lors de la sélection d'un des choix de la cmblisting?
le CmbSave se grise automatiquement et ne se réactive pas même lorsque tous les champs sont remplis.
après il y avait la 2nde question qui était :
à quoi correspond cette commande et comment la réajuster car des txtbox sont manquant?
je ne te demande pas de tout faire à ma place bien au contraire car j'ai envie de tout faire moi même mais une petite explication me permettra de modifier ce que je dois.
j'ai compris qu'il y a le changement de couleur des txtboxs non utilisés par la sélection d'un élément de cmblisting mais comment intégrer les éléments manquants? (txtdate_départ et txtdate_retour par exemple pour le choix OTV dans cmbListing)
'désactivation des TextBoxs inutiles lors de la sélection de la feuille dans CmbListing
Private Sub CmbListing_Change()
Dim Rg As Range, T As Variant, Elt As Variant
Dim C As Control, A As Long, B As Long, X As Long
If Me.CmbListing <> "" Then
With Worksheets(Me.CmbListing.Value)
.Activate
X = Range("A1").CurrentRegion.Columns.Count
T = .Range("A2").Resize(, X).Value
'T = Rg.Value
For A = 1 To UBound(T, 1)
For B = 1 To UBound(T, 2)
T(A, B) = Replace(T(A, B), " ", "_")
Select Case LCase(T(A, B))
Case Is = "Listing", "Agent", "Date_Des_Faits", "Type_De_procédure", "Nature_De_La_Fourrière"
T(A, B) = "Cmb" & T(A, B)
Case Else
T(A, B) = Replace(T(A, B), "_", "")
T(A, B) = "Txt" & T(A, B)
End Select
Next
Next
End With
For Each C In Me.Controls
If Left(C.Name, 5) <> "Label" Then
If Not IsError(Application.Match(C.Name, T, 0)) Then
C.Enabled = True
C.BackColor = &H80000005
Else
If Left(C.Name, 3) <> "Cmb" Then
C.Enabled = False
C.BackColor = &HC0C0C0
End If
End If
End If
Next
End If
End Sub
merci à toi
Avatar
Michd
Voici le fichier modifié. https://www.cjoint.com/c/HIvqJduIXv7
J'ai modifié la macro pour exclure les boutons de commande, j'ai mis une note à cet effet dans le
module du formulaire.
| car des txtbox sont manquant?
**** Je sais. Tu n'as qu'à les ajouter. L'IMPORTANT, leur leur à ces textbox doit débuter par "Txt"
suivi du nom de champ que tu utilises dans la feuille de calcul où il apparaît. Tous les noms de tes
textbox portent un nom reflétant cela. Tu as suffisamment d'exemples sous les yeux pour constater
comment j'ai procédé. Tu n'as pas à modifier le code, il va s'adapter, peu importe le nombre de
textbox que tu ajouteras, et ce, pourvu que tu leurs données un nom tel que convenu.
Ce que je voulais lors du message précédent, ce n'est pas à moi de déterminer quels champs doivent
être ajoutés et dans quelle feuille.
Cette section du code s'occupe simplement du traitement des noms des contrôles afin qu'il y ait
concordance entre les noms des champs des feuilles de calcul et le nom donné aux contrôles.
Exemple :
a) Ajouter les "txt" au début des champs représentant un champ texte...
b) enlever les espaces de noms des champs dans la feuille de calcul...
Le but , boucler dans la deuxième section de la procédure sur tous les contrôles du textbox. Cette
ligne de code requiert le nom de chaque contrôle baptisé dans le formulaire.
If Not IsError(Application.Match(C.Name, T, 0)) Then
Voilà.
MichD
Avatar
Michd
"Michd" a écrit dans le message de groupe de discussion : po37lm$8ls$
Voici le fichier modifié. https://www.cjoint.com/c/HIvqJduIXv7
J'ai modifié la macro pour exclure les boutons de commande, j'ai mis une note à cet effet dans le
module du formulaire.
| car des txtbox sont manquant?
**** Je sais. Tu n'as qu'à les ajouter. L'IMPORTANT, leur leur à ces textbox doit débuter par "Txt"
suivi du nom de champ que tu utilises dans la feuille de calcul où il apparaît. Tous les noms de tes
textbox portent un nom reflétant cela. Tu as suffisamment d'exemples sous les yeux pour constater
comment j'ai procédé. Tu n'as pas à modifier le code, il va s'adapter, peu importe le nombre de
textbox que tu ajouteras, et ce, pourvu que tu leurs données un nom tel que convenu.
Ce que je voulais lors du message précédent, ce n'est pas à moi de déterminer quels champs doivent
être ajoutés et dans quelle feuille.
Cette section du code s'occupe simplement du traitement des noms des contrôles afin qu'il y ait
concordance entre les noms des champs des feuilles de calcul et le nom donné aux contrôles.
Exemple :
a) Ajouter les "txt" au début des champs représentant un champ texte...
b) enlever les espaces de noms des champs dans la feuille de calcul...
Le but , boucler dans la deuxième section de la procédure sur tous les contrôles du textbox. Cette
ligne de code requiert le nom de chaque contrôle baptisé dans le formulaire.
If Not IsError(Application.Match(C.Name, T, 0)) Then
'--------------------------------------------------------
For A = 1 To UBound(T, 1)
For B = 1 To UBound(T, 2)
T(A, B) = Replace(T(A, B), " ", "_")
Select Case LCase(T(A, B))
Case Is = "Listing", "Agent", "Date_Des_Faits",
"Type_De_procédure", "Nature_De_La_Fourrière"
T(A, B) = "Cmb" & T(A, B)
Case Else
T(A, B) = Replace(T(A, B), "_", "")
T(A, B) = "Txt" & T(A, B)
End Select
Next
Next
'--------------------------------------------------------
MichD
1 2 3