Excel VBA utiliser l'option sexe pour corriger une liste déroulante

  • Initiateur de la discussion Initiateur de la discussion fb62840
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

fb62840

XLDnaute Impliqué
Bonjour à toutes et à tous,

J'ai besoin de votre aide pour parvenir à ceci :

Un utilisateur utilise un optionbutton pour spécifier Homme ou Femme
Une liste déroulante a pour source une liste de métiers
Cette liste de métier se présente ainsi :
nom masculin du métier / nom féminin du métier

J'aimerais obtenir que la liste s'adapte pour n'afficher que la portion adaptée du nom de métier par exemple :

Si l'utilisateur est un homme qui souhaite devenir vendeur de chaussures, faire en sorte qu'au lieu d'avoir un choix dans la liste qui soit "Vendeur en chaussures \ Vendeuse en chaussure" il n'est en fait que les choix "masculins" c'est à dire pour ce métier "Vendeur en chaussures"
Le caractère "\" sépare toujours les noms masculins des noms féminins.
De plus, il arrive qu'un nom de métier ne contienne pas le caractère "\" car le nom du métier ne change pas selon qu'il est masculin ou féminin.

Merci pour votre aide.

Bonne journée
 

Pièces jointes

Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Bonjour,

Oui, ça pourrait être une piste, mais la liste complète est de plus de 5400 métiers ce qui alourdirait le fichier et l'exécution de la macro je pense.

Merci
 
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Bonjour fb62840, camarchepas,

Voyez le fichier joint et ces macros dans ThisWorkbook (Alt+F11) :

Code:
Private Sub Workbook_Open()
'Feuil2 et Feuil3 sont les CodeName
Dim tablo, i As Long, t As String, s
Feuil2.[A:A].Copy Feuil3.[A:B]
tablo = [Métiers] 'matrice, plus rapide
For i = 1 To UBound(tablo)
  t = tablo(i, 1)
  If InStr(t, " / ") Then
    s = Split(t)
    tablo(i, 1) = Replace(t, " / " & s(2), "")
    tablo(i, 2) = Replace(t, s(0) & " / ", "")
  End If
Next
Feuil3.[A2:B2].Resize(UBound(tablo)) = tablo
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Feuil3.[A:B].Clear 'effacement
Me.Save 'le fichier est enregistré à chaque fermeture
End Sub
Voyez aussi le nom défini Métiers.

Edit : l'utilisation de la variable tablo permet une exécution très rapide, testez sur 5400 lignes...

A+
 

Pièces jointes

Dernière édition:
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Merci beaucoup pour cette réponse qui devrait me permettre de progresser de façon sensible.

Pourriez-vous m'aider en m'aidant à comprendre un peu mieux ce que vous avez fait ?

Si je comprends bien :
votre macro commence par un copier-coller du contenu de la feuil2 à la feuil3

Vous attribuez à l'array la valeur de "Métiers" qui est un nom défini sur la feuille (=DECALER(Feuil3!$A$1;1;;MAX(NBVAL(Feuil3!$A:$A)-1;1);2)
Ne serait-il pas possible de "nommer" les métiers depuis la macro ?

Vous "balayez" le contenu de l'array pour boucler sur les métiers et attribuer la valeur à une variable "t"

Vous vérifiez ensuite si le caractère \ est présent dans la chaîne de caractère "t" et,

s'il est présent vous séparez le contenu à gauche du contenu à droite,

Mais à ce niveau je ne comprends pas l'utilisation de la variable s
Je parviens à savoir qu'avec :
tablo(i, 1) = Replace(t, " / " & s(2), "")
on obtient : le contenu à gauche est placé dans la dimension "1" de l'array (la première colonne)
et que avec :
tablo(i, 2) = Replace(t, s(0) & " / ", "")
le contenu à droite est placé dans la dimension "2" de l'array (la seconde colonne)

Plus "idiot" de ma part, je ne comprends pas comment sont alimentées les listes déroulantes.

Merci encore pour votre aide.
 
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Re,

Split(t) utilise par défaut l'espace comme séparateur => s(0) = Vendeur, s(1) = "/", s(2) = "Vendeuse".

Les listes de validation sont définis par =INDEX(Métiers;;1+($C2="F"))

ce qui donne la colonne 1 de la plage Métiers si C2 <> "F", la colonne 2 si C2 = "F".

Enfin je ne vois pas du tout l'intérêt de définir la plage Métiers par macro...

A+
 
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Bonjour,

Je vous remercie beaucoup pour ces explications, ainsi tout est clair, à moi maintenant de m'inspirer de vos excellents conseils (et même bien plus) pour adapter mon travail.

Bon après-midi,
Fabrice
 
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Re,

Split(t) utilise par défaut l'espace comme séparateur => s(0) = Vendeur, s(1) = "/", s(2) = "Vendeuse".

Les listes de validation sont définis par =INDEX(Métiers;;1+($C2="F"))

ce qui donne la colonne 1 de la plage Métiers si C2 <> "F", la colonne 2 si C2 = "F".

Enfin je ne vois pas du tout l'intérêt de définir la plage Métiers par macro...

A+

Re-bonjour,

En fait je ne me suis pas bien exprimé, sur votre classeur vous avez placé la listbox.
Dans mon classeur j'utiliserai un formulaire à la place.
Pour l'instant voici comment j'affecte les valeurs à la listbox,

J'utilise la proprié Row et je la définie ainsi :

BDD!A2:12

J'aimerais lorsque l'utilisateur clique sur Masculin comme option de réponse, que la liste soit au masculin, et la liste soit au féminin lorsque l'utilisateur clique sur Féminin.

Voilà je crois que c'est un peu plus clair comme ça.

Merci pour votre aide.
 
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Re,

Dans mon classeur j'utiliserai un formulaire à la place.

Quand on crée un UserForm il faut rédiger les macros liées à chaque contrôle.

Pour l'instant rien n'est fait, ne comptez pas sur moi pour le faire.

Définissez d'abord avec précision ce que vous voulez faire et avancez pas à pas.

A+
 
Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Re,



Quand on crée un UserForm il faut rédiger les macros liées à chaque contrôle.

Pour l'instant rien n'est fait, ne comptez pas sur moi pour le faire.

Définissez d'abord avec précision ce que vous voulez faire et avancez pas à pas.

A+

En effet, dans le fichier test que j'ai placé le formulaire n'est pas articulé aux macros, je n'attends bien entendu pas de votre part que vous rédigiez les macros à ma place, ce serait vraiment impoli de ma part d'une part et d'autre part ça ne mènerait nulle part car tous, vous vous en rendriez rapidement compte.

Je ne demande pas du "clé en main" mais plutôt des pistes de réflexion qui pourrait me mettre sur la piste.
Ce que je souhaite c'est progresser dans ma compréhension de la programmation vba.

Voici le fichier avec les macros. opérationnel
Dans mon fichier, je définie la Rowsource de la liste en utilisant "Métiers" comme nom.
J'ai tenté différentes rédactions avec la fonction Index en vba mais je n'arrive pas à définir la Rowsource sous une forme "conditionnelle", c'est à dire, selon que le sexe et masculin ou féminin, ne retenir que la version masculine ou féminine du métier.

Merci
 

Pièces jointes

Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Re,

Voyez le fichier (2) avec ce code dans l'USF :

Code:
Dim sexe As String 'mémorisation (en haut du code)
'----------
Private Sub OptionButton1_Click()
'Si l'option Homme est activée, la variable Sexe prend comme valeur Homme
sexe = OptionButton1.Caption
CB_metier.List = [Métiers].Columns(1).Value
End Sub

Private Sub OptionButton2_Click()
'Si l'option Femme est activée, la variable Sexe prend comme valeur Femme
sexe = OptionButton2.Caption
CB_metier.List = [Métiers].Columns(2).Value
End Sub
Il est mieux de définir la liste de la ComboBox par sa propriété List.

Bien entendu j'ai supprimé les listes de validation dans la feuille Base.

A+
 

Pièces jointes

Re : Excel VBA utiliser l'option sexe pour corriger une liste déroulante

Bonjour,

Merci beaucoup pour ce code, il fonctionne parfaitement bien dans le classeur test2.

Pour ma part j'ai un problème avec le code ci-dessous :
Il provoque une erreur sur la ligne
For i = 1 To UBound(tablo)

La différence entre votre code et celui ci-dessous, est relatif à la copie :
Je rédige ainsi : Feuil2.[F:F].Copy Feuil1.[A.B]
Feuil1 et Feuil2 sont bien les véritables CodeName de ces feuilles

L'erreur est Erreur d'exécution 13 : "Incompatibilité de type".

Merci pour vos suggestions.

Code:
Private Sub Workbook_Open()
'Feuil1 et Feuil2 sont les CodeName, Feuil2 est la feuille Source
'Feuil1 est la feuille sur laquelle seront séparées les métiers masculins féminins
Dim tablo, i As Long, t As String, s
Feuil2.[F:F].Copy Feuil1.[A:B]
tablo = [Métiers] 'matrice, plus rapide
For i = 1 To UBound(tablo)
  t = tablo(i, 1)
  If InStr(t, " / ") Then
    s = Split(t)
    tablo(i, 1) = Replace(t, " / " & s(2), "")
    tablo(i, 2) = Replace(t, s(0) & " / ", "")
  End If
Next
Feuil1.[A:B].Resize(UBound(tablo)) = tablo
End Sub

Re,

Voyez le fichier (2) avec ce code dans l'USF :

Code:
Dim sexe As String 'mémorisation (en haut du code)
'----------
Private Sub OptionButton1_Click()
'Si l'option Homme est activée, la variable Sexe prend comme valeur Homme
sexe = OptionButton1.Caption
CB_metier.List = [Métiers].Columns(1).Value
End Sub

Private Sub OptionButton2_Click()
'Si l'option Femme est activée, la variable Sexe prend comme valeur Femme
sexe = OptionButton2.Caption
CB_metier.List = [Métiers].Columns(2).Value
End Sub
Il est mieux de définir la liste de la ComboBox par sa propriété List.

Bien entendu j'ai supprimé les listes de validation dans la feuille Base.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour