Alternative aux listes déroulantes et éviter les doublons

Bonjour à toute la communauté !

Je viens de créer le squelette d'un document qui va servir au suivi de la formation professionnelle. Le document est articulé de la façon suivante.

"Suivi des formations" -> il y aura un UserForm avec deux listes déroulantes. Une pour la recherche d'agents (environ 100 personnes) et une autre pour les formations environ (70).

L'onglet "Listes des formations" et "Agents" servent comme base de données et m'aideront pour mon analyse.

Aujourd'hui mon problème se situe plus au niveau de l'ergonomie du document. Chercher un agent parmi les 100 ou une formation pourrait avoir l'effet attendu inverse. Je cherche une solution simple rapide et ergonomique.

Je fais donc appel à vos connaissances et votre créativité. En vous remerciant d'avance pour contribution et le temps passé à m'aider.

Bien cordialement.

28test-fp.xlsm (42.26 Ko)

Bonjour,

Une solution est d'utiliser un control ComboBox

la propriété MatchEntry,

le contrôle trouve la première occurrence qui correspond à l'entrée en fonction de l'ordre des éléments de liste. Par exemple, la saisie de "abc" ou "bc" déclenche l'événement Click pour la liste suivante :

abcde

bcdef

abcxyz

bchij

les Constantes suivante de MatchEntry sont très utile,

fmMatchEntryFirstLetter

0 Correspondance de base. Le contrôle recherche l'entrée suivante qui commence par le caractère saisi. La frappe répétée de la même lettre parcourt toutes les entrées commençant par cette lettre.

fmMatchEntryComplete

1 Correspondance étendue. Pour la frappe de chaque caractère, le contrôle recherche une entrée correspondant à tous les caractères saisis (par défaut).

Bonsoir,

ci-jointe une proposition de listes déroulantes progressives en tapant la première lettre, puis la seconde ….

Sélectionner la cellule et double-cliquer pour obtenir la liste déroulante.

NB : Tout le code est écrit en utilisant la classe des objets tableau "ListObjects"

96test-fp1.xlsm (65.36 Ko)

Un grand merci a vous deux !!

Thev ta solution est top, c'est exactement ce que j'attendais. Mais comment tu as fais ça ?

Mais comment tu as fais ça ?

1- Comme indiqué par Sabv, création de 2 contrôles ActiveX Combobox liés à feuille Feuil2 (Suivi des Formations)

2- Ecriture d'un code associé aux procédures événementielles de la feuille Feuil2 .

Par ailleurs, j'ai clarifié le code associé à ton UserForm en utilisant la classe de l'objet tableau "ListObjects"

Bonjour à vous,

J'ai apporter quelques modifications, mais ma jeune expérience en VBA montre déjà ses limites.

Au final, une simple liste déroulante dans un UserForm me convient parfaitement, je peux écrire les premières lettres ou chercher directement dans la liste déroulante.

J'ai relu plusieurs fois mon code et je ne vois pas où ça bloque. De plus, j'aimerais savoir comment peut-on éviter les doublons ou quasi-doublons, sachant qu'un agent peut suivre plusieurs formations dans l'année et qu'une formation peut être suivie par plusieurs agents à des dates différentes.

Merci d'avance.

23plan-fp.xlsm (54.90 Ko)

Bonjour,

Je salue votre logique d'identification des données qui permet d'avoir un code plus parlant. Dans cette perspective, il est plus simple et plus clair d'utiliser les propriétés et méthodes de l'objet tableau "ListObject".

Par ailleurs, au niveau de la définition de chaque donnée, il faut préciser son type sinon par défaut, elle est de type Variant.

exemple :

Dim i, j as integer ==> i est variant et j est entier

Dim i as integer, j as integer ==> i est entier et j est entier

Au niveau de l'UserForm, pour accéder à ses données dans la procédure d'un autre module :

1- le charger avec l'instruction "Load"

2- si l'on veut alimenter une variable de la procédure du Useform, il faut la déclarer en tête du module et de type Public.

Une première proposition.

Pour les doublons dans la BD Suivi des Formations, il faudrait définir le ou les critères d'unicité.

8plan-fp1.xlsm (58.04 Ko)

Un très grand merci !

Tes explications sont claires et pédagogiques !

Juste un point, c'est clairement pas dérangeant mais je cherche juste à savoir pourquoi et si possible de le modifier. Lorsqu'on ouvre l'UserForm "Ajouter", le curseur n'est pas dans la 1ère cellule "Nom" mais la 2ème "Code Action".

Ma prochaine mission : réussir à comprendre la gestion des doublons, j'aurais sûrement besoin encore de vos précieux conseils.

Je suis déjà fier du rendu, c'est encore mieux qu'espéré. Débutant sans connaissances ni support externe, avec de la dextérité et du partage on peut être surpris du résultat. Merci encore à l'ensemble du forum !

Juste un point, c'est clairement pas dérangeant mais je cherche juste à savoir pourquoi et si possible de le modifier. Lorsqu'on ouvre l'UserForm "Ajouter", le curseur n'est pas dans la 1ère cellule "Nom" mais la 2ème "Code Action".

2 solutions :

1- à la compilation, modifier la propriété Tabindex de chaque contrôle en leur affectant un numéro d'ordre séquentiel avec 1 pour le contrôle salarié.

2- à l'exécution via la méthode "SetFocus" (CB_Salarié.SetFocus)

ci-joint exemple avec modif de la propriété Tabindex.

Ma prochaine mission : réussir à comprendre la gestion des doublons,

Tout dépend de quels doublons, il s'agit :

  • soit une liste de valeurs définie sur une seule colonne ou une seule ligne. Plusieurs méthodes possibles et au vu de la fréquence de cette situation, j'ai même développé une fonction personnalisée permettant le tri + le dédoublonnage.
  • soit des éléments d'une base données. C'est au cas par cas car il faut d'abord définir par rapport aux champs les critères de lignes identiques.
14plan-fp2.xlsm (58.58 Ko)

Mon souhait serait d'empêcher l'ajout d'une formation à un même agent et à la même date. Car un agent peut être inscrit à une même formation plusieurs fois dans l'année mais à deux dates différentes (pour augmenter ses chances d'être accepté).

Mon souhait serait d'empêcher l'ajout d'une formation à un même agent et à la même date. Car un agent peut être inscrit à une même formation plusieurs fois dans l'année mais à deux dates différentes (pour augmenter ses chances d'être accepté).

Dans ce cas, il faut déjà définir dans vos bases de données "Suivi des formations" non pas une colonne période mais 2 dates : date début et date fin.

Ensuite vérifier que lors de l'ajout d'une formation à un même agent, la plage de dates ne se recoupe pas avec une précédente. Un petit algorithme est nécessaire.

Modification notée, dès que j'ai un peu de temps dans la journée, je vais ajouter début et fin.

L'algorithme devra être écrit dans l'UserForm, un module ou la feuille "Suivi des formations" ?

L'algorithme devra être écrit dans l'UserForm

ci-dessous exemple de code en supposant l'ajout de 2 colonnes (Date début et Date fin) ravec l'algorithme nécessaire

        'Vérification possibilité d'inscription si période non occupée  .........................................
        période_occupée = False
        For i = 1 To .ListRows.Count
            If Me.CB_Salarié = .ListColumns("Nom").DataBodyRange.Rows(i)  _
            And i <> MaLigneDemande Then
                DateDebut_formation = .ListColumns("Date début").DataBodyRange.Rows(i)
                DateFin_formation = .ListColumns("Date fin").DataBodyRange.Rows(i)
                If (DateDebut_saisie >= DateDebut_formation And DateDebut_saisie <= DateFin_formation) _
                Or (DateDebut_saisie <= DateDebut_formation And DateFin_saisie >= DateDebut_formation) Then
                    période_occupée = True: Exit For
                End If
            End If
        Next i
        If période_occupée Then
            ligne_feuille = i + .HeaderRowRange.Row
            MsgBox "Inscription impossible car chevauchement avec la ligne :" & ligne_feuille & ", veuillez réessayer."
            Exit Sub
        End If

ce code serait à placer après l'instruction :

If MaLigneDemande = 0 Then MsgBox "erreur mode modification": Exit Sub

Sincèrement merci !

Malgré ton code, je bloque quand même. Il y a quelques points qui me sont encore obscures.

Dans ma feuille "Suivi de formation", j'ai bien rajouté "Date début" et "Date fin". Dans ta ligne de code, tu as commencé par "période_occupée" mais il est défini comment comme une variable déterminé par un Dim période_occupée AS Variant ou Integer.

Ou alors on défini le nom des colonnes "Date début" et "Date fin" par "période_occupée". Ou bien, c'est ni l'un ni l'autre ?

Je sais pas si j'ai été très clair.

Par avance, merci !

5plan-fp2.xlsm (55.83 Ko)

Bonjour,

Dans ta ligne de code, tu as commencé par "période_occupée"

C'est une variable booléenne qui ne peut donc prendre que les valeurs vrai ou faux.

Dim période_occupée as Boolean

Au niveau des dates, il est impératif de mettre la fonction de conversion CDate car le contenu d'une TextBox est toujours du texte. Une date dans Excel est un nombre . Ce nombre est le nombre de jours depuis le 1er janvier 1900.

Donc pour la durée en jours de ton tableau, une simple soustraction suffit.

Par ailleurs, j'ai développé une macro complémentaire permettant d'insérer un calendrier pour la saisie des dates. Si tu es intéressé, je te la fournis avec procédure d'installation et d'utilisation.

ci-jointe version avec algorithme de détection des doublons.

12plan-fp3.xlsm (59.69 Ko)

Je me suis mal exprimé, pour le calcul de la durée on ne peut se fier au date de la formation, sachant qu'une formation peut durer 0.5jours et que la période peut-être scindé en plusieurs période (Ex : une formation de 4 jours peut commencer du 21/22/23 avril et reprendre le 05 mai). Un agent peut être suivre inscrit à la même formation mais à des dates différentes. Une formation peut être suivie par plusieurs agents.

Si je suis ton code, je ne peux rentrer la même date dans début et fin de formation.

j'ai essayé plusieurs algorithme mais ça ne fonctionne pas pour autant. Et pareil, j'ai fais une recherche V et bloque sur la dernière ligne. Je ne vois pas où se situe mon erreur.

5plan-fp2.xlsm (57.39 Ko)

la période peut-être scindé en plusieurs période (Ex : une formation de 4 jours peut commencer du 21/22/23 avril et reprendre le 05 mai)

Avant toute programmation, il faut déjà décider de la façon de le gérer au niveau de votre BDD : suivi des formations .

solution 1 : tout gérer dans votre BDD suivi des formations avec plusieurs lignes par périodes continues

[u]solution 2/u] : créer une nouvelle BDD : périodes de formation avec un identifiant du style P1, P2, .... rattaché au type de formation et reporté dans votre BDD : suivi des formations.

pour le calcul de la durée on ne peut se fier au date de la formation,

OK. Au niveau du code, c'est donc une info à ramener de vore BDD "Liste des formations"

C'est bien ça mon problème . Vu que je me forme tout seul, je grille des étapes .

Idéalement, ce que je souhaiterais serait un simple message me prévenant que la formation que j'enregistre est déjà dans la BDD Suivi de formation.

Par rapport a à vos deux solutions, laquelle me conseilleriez vous pour mon cas ?

Par rapport a à vos deux solutions, laquelle me conseilleriez vous pour mon cas ?

Je serai partisan de la solution 2. Vous n'auriez pas forcément besoin d'une BDD supplémentaire et pourriez utiliser la BDD Liste des formations avec une colonne identifiant la formation et des colonnes supplémentaires pour les dates des différentes sessions.

ci-joint un exemple avec 3 sessions max pour une formation.

17plan-fp4.xlsm (57.36 Ko)

Excuse moi j'ai pas pris le temps de te remercier ! C'est clairement parfait ! Dynamique et ergonomique tout ce que je recherchais.

Il ne reste plus que des détails, mais je peux dès a présent commencer à utiliser ce document. Un très grand merci !

Rechercher des sujets similaires à "alternative listes deroulantes eviter doublons"