Réalisation un ComboBox avecliste déroulante permettant de filter dynamiqu

Bonjour à tous, j’ai besoin de votre assistance pour résoudre un problème qui me dérange.

Dans mes user formes (intervention & livraison), je vœux réaliser une liste déroulante permettant de filtrer dynamiquement une liste dans mes combobox « code » puis afficher dans le text box « Equipement » le nom de l’équipement correspondant à cette code.

Ci-joint un fichier exemple.

Merci d’avance.

Bonjour

- Un premier point est de savoir quelle est votre version excel. Vous indiquez Français mais cela n'aide pas les personnes qui doivent vous répondre. Merci de modifier le profil de votre compte en y indiquant quelle est votre version --> 1997, 2003, 2016. Si vous êtes sous MAC ajoutez cette indication --> MAC + version excel (MAC 2011, MAC 365...).


- Par rapport à votre projet,

1. vous chargez les combo en utilisant l'instruction Rowssource. Comme souvent dit, évitez cette instruction au profil des méthodes ADDITEM ou LIST. Je peux vous donner les changements à effectuer si vous le désirez
2. La feuille Moule contient un tableau au format structuré. Il ne faut jamais laisser de lignes sans données dans ce genre de tableau. Une première chose à faire (si votre fichier est tel que celui que vous avez posté) est de supprimer les lignes 70 à 517 qui sont vides de données


Pour votre demande, la première chose que l'on doit savoir c'est si vous pouvez avoir des doublons possibles en colonne A de la feuille Moule. Cette question car vous chargez les données depuis cette colonne

Cordialement

Bonjour

Merci beaucoup pour l’importance que vous portez à mon problème. J’utile Excel 2016, concernant la feuille moule, on ne doit pas avoir de doublon dans la colonne A.

Je serai ravi si vous pouvez m’aider et je suis dispo à excepter toutes les propositions possibles ; Pour que j’arrive à faire des tries dynamique dans mes user formes (intervention & livraison), contenant le combobox « code » puis afficher dans le text box « Equipement » le nom de l’équipement correspondant à cette code qui ne contient pas des doublons.

Cordiale salutation

A+

Re

Voici ce que vous pouvez déjà faire dans votre fichier

1. Allez dans votre gestionnaire de noms
2. Sélectionnez le nom "section"
3. Dans la rubrique "reférence à", remplacez la formule par celle-ci --> =DECALER('INFO DIV'!$E$4;;;NBVAL('INFO DIV'!$E:$E)-1)
4. Ajoutez tous les noms manquants --> "livraison_avril", "livraison_mai", etc... Attention de corriger l'orthographe sur le mois de mars


5. Prenez ensuite l'USF SaisieLivraison
5-1. Tout en haut de vos codes, ajoutez ces deux instructions

Option Compare Text
Option Explicit

5-2. Comme vous avez déjà supprimé les propriétés rowssource, placez le code ci-dessous dans l'USF

Private Sub UserForm_Initialize()
Dim cel As Range

ComboCode.List = Range("CodeMoule").ListObject.DataBodyRange.Value
With Sheets("INFO DIV")
    ComboSection.List = .Range("section").Value
    For Each cel In .Range("codemachine")
        If cel <> "" And cel <> "CODE" Then CombotypeMachine.AddItem cel.Value
    Next cel
End With
End Sub

5-3. Pour la recherche via la combo et l'ajout dans la textbox, ajoutez ce code dans l'USF

Private Sub ComboCode_Change()
Dim ligne As Integer

TextEquipement = vbNullString
If ComboCode.Value = vbNullString Then Exit Sub

With Range("CodeMoule").ListObject
    ligne = WorksheetFunction.Match(ComboCode.Value, .ListColumns(1).DataBodyRange.Value, 0)
    TextEquipement = .DataBodyRange(ligne, 2).Value
End With
End Sub

Faites un test d'ouverture de l'USF et utilisez la combo afin de voir si tout est ok.

On passera aux points suivants ensuite pour le code Private Sub CmdEnregistrer_Click()

NB : Ne me replacez pas votre ficher, j'ai celui que vous avez posté qui me sert de travail et on évite d'alourdir le forum

Bonjour

Merci pour votre proposition, j’ai mis les codes comme demander, mais à l’ouverture du USF il y a un message d’erreur d’exécution 70 « PERMISSION REFUSEE » qui s’affiche.

Que puis faire pour corriger cette erreur?.

Puis -je envoyé rien que la copie des codes?

Bonjour,

mais à l’ouverture du USF il y a un message d’erreur d’exécution 70 « PERMISSION REFUSEE

Vous avez laissé un rowssource quelque part sur une combo. Vérifiez ce point là

Puis -je envoyé rien que la copie des codes?

Non pas besoin c'est moi qui vous les donne

NB : on est sur l'USF livraison pour le moment

Ok , ok, c'est bon , ca marche maintenant.

OK.

1. Remplacez votre code Effacer_click par celui-ci

Private Sub CmdEffacer_Click()
Dim ctl As MSForms.Control

For Each ctl In Me.Controls
    Select Case TypeName(ctl)
        Case "TextBox": ctl.Text = vbNullString
        Case "ComboBox": ctl.ListIndex = -1
    End Select
Next ctl
End Sub

2. Dans le gestionnaire de noms, avez-vous bien défini tous les noms Livraison_mois ? (livraison_janvier, livraison_fevrier, livraison_mai, etc....) Evitez les accents dans le noms des mois

c'est fait, ca marche aussi !

Ok.

1. Dans chaque feuille Mois, vous devez supprimer toutes les lignes vides pour la partie livraison (donc colonne S à AC). Exemple pour la feuille JAN, votre dernière ligne complétée est la ligne 16, donc supprimer S17 à AC214.

Faites de même pour toutes les autres feuilles Mois

2. Si vous avez bien défini tous les nom "livraison_mois" (les mois doivent être nommés comme dans le code ci-dessous), remplacez le code Enregistrer dans l'USF livraison par celui ci-dessous

Private Sub CmdEnregistrer_Click()
Dim mois As Byte
Dim lig As Integer
Dim sh As String

If Me.TextDate.Value = "" Then MsgBox ("Aucune date saisie"): Exit Sub
On Error Resume Next
mois = Month(CDate(Me.TextDate.Value))
Select Case mois
    Case 1: sh = "JANVIER"
    Case 2: sh = "FEVRIER"
    Case 3: sh = "MARS"
    Case 4: sh = "AVRIL"
    Case 5: sh = "MAI"
    Case 6: sh = "JUIN"
    Case 7: sh = "JUILLET"
    Case 8: sh = "AOUT"
    Case 9: sh = "SEPTEMBRE"
    Case 10: sh = "OCTOBRE"
    Case 11: sh = "NOVEMBRE"
    Case 12: sh = "DECEMBRE"
    Case Else
        MsgBox "Mois non Valide", vbCritical, "Erreur mois"
        Exit Sub
End Select

With Range("livraison_" & sh).ListObject
    If .ListRows.Count = 0 Then 'trouver si ligne dans tableau structuré
        .ListRows.Add: lig = 1 'si pas de ligne
    Else: .ListRows.Add: lig = .ListRows.Count 'si lignes trouvees
    End If
    With .DataBodyRange
        .Item(lig, 19) = CDate(Me.TextDate.Value) 'DATE
        .Item(lig, 20) = Me.CombotypeMachine.Value 'MACHINE
        .Item(lig, 21) = Me.ComboCode.Value 'CODE
        '.item(lig,22) = 'EQUIPEMENT
        .Item(lig, 23) = Me.ComboSection.Value 'SECTION
        .Item(lig, 24) = Me.TextHeureEmission.Value 'Heure Emission
        .Item(lig, 25) = Me.TextHeureLivraison.Value 'heure de livrason
        .Item(lig, 29) = Me.TextNomsExecutants.Value 'GESTIONAIRES
    End With
End With
End Sub

reste à tester l'ajout avant de passer à l'usf suivantes

Dites-moi si ok

test enregistrement ok,

je voulais savoir, dans le combocode, si on tape la première lettre du code, ca peut nous faire sortir rien que les codes qui commencent par cette première lettre ,vue que la liste dans le combo est beaucoup; s'il faut chaque fois parcourir la liste ca va prendre un du temps.

merci beaucoup pour votre soutient.

je voulais savoir, dans le combocode, si on tape la première lettre du code, ca peut nous faire sortir rien que les codes qui commencent par cette première lettre ,vue que la liste dans le combo est beaucoup;

Si vous tapez la première lettre cela va afficher le premier code trouvé. Le souci est que la feuille n'est pas triée en colonne A

Il y a deux manières que l'on peut exploiter :
- On trie la feuille Moule par ordre alphabétique du numéro code
ou
- On trie les items dans la combo sans trier dans la feuille Moule

Dans les deux cas, il vous suffira toujours de taper la première lettre pour avoir le premier code trouvé et les codes suivants contenant la première lettre que vous avez choisie

Le plus simple serait de trier la feuille Moule mais à voir ce que vous désirez

Bonjour

Je tenais à vous exprimer ma profonde gratitude pour votre précieuse aide et explications. Votre soutien et votre expertise ont été d'une grande valeur pour moi et m'ont permis de mieux comprendre mes lacune. Votre générosité et votre patience sont des qualités qui m'ont beaucoup touché et je vous en suis sincèrement reconnaissant.

Encore une fois, un grand merci pour votre implication et pour avoir pris le temps de m'éclairer. Votre gentillesse et votre disponibilité sont très appréciées.

Bonjour

Merci mais il n'y a pas de soucis pour vous aider, c'est avec plaisir

Dites-moi pour la suite et la proposition de Tri pour que je vous donne quoi faire.

Sinon on peut passer à l'USF suivante


Edit : pour l'USF livraison voici trois lignes qui concernent les MSGBOX et que vous pouvez modifier dans le code Enregistrement

If Me.TextDate.Value = "" Then MsgBox "Aucune date saisie", vbCritical, "Saisie date": Exit Sub

MsgBox "Mois non Valide", vbCritical, "Erreur mois"

MsgBox "Données enregistrées avec succès", vbInformation, "Enregistrement"

Cela vous affichera une icone dans la fenêtre et donnera un nom à la MSGBOX

Bonjour,

- Concernant les tris, j'ai opté de le faire dans la feuille Moule , c'est ok!

- Dans le combocode , si je tape la première lettre qui n'ai pas dans la liste des codes ca me renvois directement dans l'Editeur de projet avec un message d'erreur d'exécution 1004. (Impossible de lire la propriété Match de la classe WorksheetFunction)

- dans les trois lignes qui concernent les MSGBOX, a chaque enregistrement, ca envoie MsgBox "Mois non Valide", mais l'enregistrement se passe normalement et la date inscrite aussi est correct

Merci

A+

re

Concernant les tris, j'ai opté de le faire dans la feuille Moule , c'est ok!

D'accord mais pensez que si à chaque fois que vous allez ajouter une ligne, vous devrez trier pour qu'au prochain chargement de l'usf ce soit Ok dans la combo. D'où peut-être l'intérêt de lancer le tri à l'ouverture de l'USF et de prévoir le code


Dans le combocode , si je tape la première lettre qui n'ai pas dans la liste des codes ca me renvois directement dans l'Editeur de projet avec un message d'erreur d'exécution 1004. (Impossible de lire la propriété Match de la classe WorksheetFunction)

Ce n'est pas normal. dès que vous tapez une lettre cela affiche directement le premier code trouvé et la textbox à droite est complétée
Du moins c'est ce que j'ai sur votre fichier ici.
exemple en tapant juste un F

image

Cela peut effectivement arriver si vous n'avez pas de code existant correspondant à la première lettre. Etait-ce le cas dans votre test ?
On peut de toute façon amender le code Combocode_change comme ceci :

Private Sub ComboCode_Change()
Dim ligne As Integer

TextEquipement = vbNullString
If ComboCode.Value = vbNullString Then Exit Sub

With Range("CodeMoule").ListObject
    On Error Resume Next
    ligne = WorksheetFunction.Match(ComboCode.Value, .ListColumns(1).DataBodyRange.Value, 0)
    If ligne = 0 Then MsgBox "Code inexistant", vbCritical, "Erreur code": ComboCode.Value = vbNullString: Exit Sub
    TextEquipement = .DataBodyRange(ligne, 2).Value
End With
End Sub

dans les trois lignes qui concernent les MSGBOX, a chaque enregistrement, ca envoie MsgBox "Mois non Valide", mais l'enregistrement se passe normalement et la date inscrite aussi est correct

Là c'est que n'avez pas attribué les noms "livraison_mois" correctement. Vous devez avoir ceci pour janvier --> "livraison_janvier"
Vérifiez aussi que vous avez bien ajouté Option Compare text en première ligne tout au dessus des codes
Le nom du mois doit être celui qui se trouve dans les instructions CASE sh = .....

Ok!

c'est bon ! tout ai rentré en ordre maintenant!

merci

Re

Ok bien !

- Quid de la proposition de Tri ? --> https://forum.excel-pratique.com/s/goto/1201927 et https://forum.excel-pratique.com/s/goto/1202100
- Ensuite passe-t-on à la deuxième USF ?

Crdlt

Bonjour

Concernant la proposition de Tri, J’ai trié à partir de la feuille Moule par ordre alphabétique du numéro code. Mais à chaque nouveau moule, il faudra qu’on refasse le tri. C’est déjà ok, mais si on peut aussi trier les items dans le combo sans trier dans la feuille Moule, ça serait encours mieux.

Mais on peut passer à la deuxième USF si ça ne vous dérange pas.

Merci

Bonjour

C’est déjà ok, mais si on peut aussi trier les items dans le combo sans trier dans la feuille Moule, ça serait encours mieux.

Bah si vous utilisez toujours l'USF, c'est plus facile de la faire à l'ouverture
Mais on pourrait aussi le faire à chaque enregistrement mais je ne le conseille moins.

En partant de l'idée su tri à l'ouverture de l'USF, voici ce que vous devez modifier,
- Dans l'éditeur VBA, créez un module
- Ajoutez-y le code ci-dessous

Option Explicit
Sub Trier()
Dim ws As Worksheet

Set ws = Worksheets("MOULES")
With ws.ListObjects("Plagemoules")
    With .Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=ws.Range("Plagemoules[CODE MOULE]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        '.SortMethod = xlPinYin
        .Apply
    End With
End With
End Sub

- Allez dans l'USF Livraison
- Dans le code Private Sub UserForm_Initialize(), juste en dessous de la ligne Dim cel as range, ajoutez ceci

Call Trier

Faites un test..


A vous de voir mais c'est inutile de créer un module pour chaque usf que vous devez ouvrir.
Simplifiez ceci au niveau des 2 modules "Saisie....".
Faites un seul module et mettez-y les deux codes ci-dessous pour l'ouverture des deux USF
Exemple :
1 module appelé "Afficher_USF" et dans ce module les deux codes suivants

Sub Ouvrir_UsFSaisieCorrective()
    UsFSaisieCorrective.Show
End Sub

Sub Ouvrir_UsFSaisieLivraison()
    UsFSaisieLivraison.Show
End Sub

Après on passe à l'autre USF

Rechercher des sujets similaires à "realisation combobox avecliste deroulante permettant filter dynamiqu"