XL 2010 Création de listes déroulantes interactive

  • Initiateur de la discussion Initiateur de la discussion jeanmi
  • 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 !

jeanmi

XLDnaute Occasionnel
J’ai un onglet « liste articles »

Dans lequel, j’ai 3 colonnes, A, B et C avec des références, des désignations, en C des familles. Les plages A2 :C36 sont nommées « table articles », peut-être pas utile ?

J’ai dans l’onglet « Bon de Cde »

En colonne A, de A27 : A57 des références qui s’afficheront en fonction du choix sélectionné au niveau de désignation (colonne C) et qui ne s’affiche que s’il y a une quantité dans la colonne D, ça fonctionne.

J’ai en colonne B des familles de produit, à partir d’une liste déroulante.

Ce que je voudrais faire, si possible :

Actuellement la liste déroulante qui est affichée au niveau de désignation, en colonne C, prend en compte toutes les données qui sont définies dans l’onglet « liste articles »

Es qu’il est possible que la liste déroulante qui est au niveau de désignation, colonne C, n’affiche que les désignations qui correspondent à la famille sélectionnée au niveau de famille, colonne B ?

J’ai fait beaucoup d’essais, sans arrivé à trouver une solution.

On me dit peut-être tableau croisé dynamique, mais là je ne maitrise pas ni dans le cas d’une solution VBA.

Il faut que je puisse, simplement, par la suite ajouter des informations complémentaires à l’onglet liste articles. Peut-être que la construction de mon fichier n'est pas la bonne ?

Si joins mon fichier d’essai.

Merci pour votre aide.

Cordialement
 

Pièces jointes

Bonjour à tous,
jeanmi, je vous propose le fichier ci-joint. Je n'ai pas utilisé les comboBox en cascades, mais j'ai travaillé avec une listView. Je trouve que c'est plus fluide. Regardez le fichier et dites-moi. A l'ouverture du fichier vous arriverez systématiquement sur la page d'accueil. Vous avez 2 boutons, l'un pour ajouter, modifier ou supprimer un article dans la liste des articles, et l'autre pour alimenter le bon de commande. J'ai rajouté une colonne (Prix Unitaire) dans le tableau de la liste des articles. Si vous avez besoin d'explications (ce dont je ne doute pas), ne pas hésiter.
Bonjour @Piment à tous,

Effectivement ta proposition me semble très bien structurée, mais il faudrait que je réalise des essais afin de comprendre le fonctionnement et pouvoir poser les bonnes questions.

Je vais regarder et revient vers toi, il faut me laissé 1 semaine. SVP.
Là j’utilise la proposition de @goude qui me permet de faire les bons de commandes, plus simplement qu’à la main, c’est déjà un premier pas.

Cordialement
 
Re,
Les colonnes sont dans deux tableaux différents, pas de problème. Mais si tu veux changer, pourquoi pas.
Dans mon tableau le nom _Famille correspond à table_articles[Famille] ou D3 : D38. Pour vérifier dans la zone nom sélectionne _Famille.
Regarde la pièce jointe 1226686
Cordialement
Bonjour @goube à tous,

J’ai tous reconstruit à partir de ton fichier, c'est bon tout fonctionne, je peux donc faire les bons de commandes plus simplement qu'à la main, c’est un début. Merci

J’ai vu la proposition de @Piment, qui est vraiment celle que j’aurais rêvée pouvoir faire, donc avec une sauvegarde des bons, je vais donc essayer de comprendre comment l’utiliser, afin de voir si elle répond à mon besoin.

Merci encore pour l’aide que tu m’as apporté.

Cordialement
 
Bonjour le forum,

Il y avait des espaces superflus dans la liste de validation en colonne C de la feuille "liste articles", je les ai enlevés.

Par ailleurs je trie alphabétiquement la liste de validation Liste et je supprime les doublons éventuels, le code dans "Bon de Cde" :
VB:
Private Sub Worksheet_Activate()
Worksheet_SelectionChange ActiveCell 'lance la macro quand on revient sur cette feuille
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim crit$, P As Range
Application.ScreenUpdating = False
Me.Unprotect "jlejle"
With Range("C27:C" & Rows.Count)
    .Validation.Delete 'RAZ
    If Intersect(ActiveCell, .Cells) Is Nothing Then GoTo 1
    crit = ActiveCell(1, 0)
    If crit = "" Then crit = "*"
    With Sheets("liste articles").ListObjects(1).Range 'tableau structuré
        .AutoFilter 'désactive le filtrage s'il existe
        .Columns(5).Clear 'RAZ
        .AutoFilter 3, crit 'filtrage de la 3ème colonne
        Set P = .Columns(2).Offset(1).SpecialCells(xlCellTypeVisible)
        .AutoFilter 'désactive le filtrage s'il existe
        P.Copy .Cells(1, 5) 'copier-coller
        .Columns(5).Sort .Columns(5), xlAscending, Header:=xlNo 'tri alphabétique
        .Cells(1, 5).CurrentRegion.RemoveDuplicates 1, Header:=xlNo 'supprime les doublons
        .Cells(1, 5).CurrentRegion.Name = "Liste" 'plage nommée
        ActiveCell.Validation.Add xlValidateList, Formula1:="=Liste"
    End With
End With
1 Me.Protect "jlejle"
End Sub
A+
Bonjour @job75 à tous,

Merci pour ta proposition.
Actuellement, je me suis orienté vers la solution de @goude.
Plus tard je vais essayer de comprendre la solution de @Piment qui me plais bien.

Merci pour ta participation.

Cordialement
 
Bonjour @job75 à tous,

Merci pour ta proposition.
Actuellement, je me suis orienté vers la solution de @goude.
Plus tard je vais essayer de comprendre la solution de @Piment qui me plais bien.

Merci pour ta participation.

Cordialement
Bonjour à toutes et à tous.
Jeanmi quelques explications: Lorsque tu ouvres le fichier, tu arrives systématiquement sur la feuille "Accueil". Sur cette feuille, le bouton "Alimenter la liste des Articles" te permet d'ajouter un article à la liste. Ce formulaire te permet également de modifier un article, par exemple son prix, ou encore de supprimer un article. Pour cela, tu vas sur la zone "Modifier ou supprimer" et tu recherches l'article dans la liste avec le comboBox "Rechercher par Famille" ou bien par sa référence. Lorsque tu auras choisi un article, tu verras que la listeView juste en dessous aura remonté l'article sélectionné si tu passes par la recherche par Réf, et si tu fais la recherche par famille, ne remontera que les articles de la famille sélectionnée. Tu cliques alors dans la listeView sur l'article voulu. Lors du clic sur l'article, les zones de texte situées en dessous de la listeView se rempliront des données. Il te suffit alors de modifier les données que tu veux. Avec la touche "Tabulation" de ton clavier, tu te balades d'une zone à l'autre. Tu valides ensuite les modifications en cliquant sur le bouton "Modifier". Les données seront alors modifiées dans le Tableau "Liste des Articles". Pour supprimer un article, même procédure, mais tu cliques sur supprimer. Toute la ligne sera alors supprimée du tableau, et la sub refera le calcul du numéro (Index) pour permettre la saisie d'un nouvel article. Apprivoise dans un premier temps ce formulaire. Je t'apporterai le mode d'emploi de l'autre formulaire dans un 2ème temps. Je reste à disposition pour t'aider à prendre en main l'outil. Ne sois pas effrayé par les sub : quand j'ai commencé il y a 2 ans, je n'y connaissais absolument rien au VBA.
En passant merci à tous ceux qui m'ont permis d'apprendre.
Bonne journée à tous.
 
Bonjour à toutes et à tous.
Jeanmi quelques explications: Lorsque tu ouvres le fichier, tu arrives systématiquement sur la feuille "Accueil". Sur cette feuille, le bouton "Alimenter la liste des Articles" te permet d'ajouter un article à la liste. Ce formulaire te permet également de modifier un article, par exemple son prix, ou encore de supprimer un article. Pour cela, tu vas sur la zone "Modifier ou supprimer" et tu recherches l'article dans la liste avec le comboBox "Rechercher par Famille" ou bien par sa référence. Lorsque tu auras choisi un article, tu verras que la listeView juste en dessous aura remonté l'article sélectionné si tu passes par la recherche par Réf, et si tu fais la recherche par famille, ne remontera que les articles de la famille sélectionnée. Tu cliques alors dans la listeView sur l'article voulu. Lors du clic sur l'article, les zones de texte situées en dessous de la listeView se rempliront des données. Il te suffit alors de modifier les données que tu veux. Avec la touche "Tabulation" de ton clavier, tu te balades d'une zone à l'autre. Tu valides ensuite les modifications en cliquant sur le bouton "Modifier". Les données seront alors modifiées dans le Tableau "Liste des Articles". Pour supprimer un article, même procédure, mais tu cliques sur supprimer. Toute la ligne sera alors supprimée du tableau, et la sub refera le calcul du numéro (Index) pour permettre la saisie d'un nouvel article. Apprivoise dans un premier temps ce formulaire. Je t'apporterai le mode d'emploi de l'autre formulaire dans un 2ème temps. Je reste à disposition pour t'aider à prendre en main l'outil. Ne sois pas effrayé par les sub : quand j'ai commencé il y a 2 ans, je n'y connaissais absolument rien au VBA.
En passant merci à tous ceux qui m'ont permis d'apprendre.
Bonne journée à tous.
Bonjour @Piment à tous

Je n’ai pu résister à regarder ton programme, qui me plais beaucoup et qui est plus que bien, pour moi.

J’ai donc des questions qui sont dans un fichier joint pour simplifier la communication.
j'ai fait evoluer les question avec une image du haut du bon de Cde.

Merci d’avance pour les réponses.

Cordialement
 

Pièces jointes

Dernière édition:
Bonjour le forum,

J'ai simplifié et complété le code VBA :

- dans la feuille "liste articles" il est en effet inutile de créer une 2ème liste, un simple tri suffit

- dans la feuille "Bon de Cde" un fichier PDF est créé :
VB:
Private Sub Worksheet_Activate()
Worksheet_SelectionChange ActiveCell 'lance la macro quand on revient sur cette feuille
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim crit$
Application.ScreenUpdating = False
Me.Unprotect "jlejle"
With Range("C27:C" & Rows.Count)
    .Validation.Delete 'RAZ
    If Intersect(ActiveCell, .Cells) Is Nothing Then GoTo 1
    crit = ActiveCell(1, 0)
    If crit = "" Then crit = "*"
    With Sheets("liste articles").ListObjects(1).Range 'tableau structuré
        .Sort .Columns(3), xlAscending, Header:=xlYes 'tri sur Famille
        .Cells(Application.Match(crit, .Columns(3), 0), 2).Resize(Application.CountIf(.Columns(3), crit)).Name = "Liste" 'plage nommée
        ActiveCell.Validation.Add xlValidateList, Formula1:="=Liste"
    End With
End With
1 Me.Protect "jlejle"
End Sub

Sub Fichier_PDF()
Me.Protect "jlejle", UserInterfaceOnly:=True
Me.PageSetup.PrintArea = Cells(1).Resize(Cells(Rows.Count, 4).End(xlUp).Row, 4).Address 'zone d'impression
Me.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Bon N° " & [C18] & ".pdf"
End Sub
A+
 

Pièces jointes

Bonjour @Piment à tous

Je n’ai pu résister à regarder ton programme, qui me plais beaucoup et qui est plus que bien, pour moi.

J’ai donc des questions qui sont dans un fichier joint pour simplifier la communication.
j'ai fait evoluer les question avec une image du haut du bon de Cde.

Merci d’avance pour les réponses.

Cordialement
Bonjour à tous.
jeanmi, je salue le compatriote des Outremers. Moi je suis de l'Ile de la Réunion dans l'océan Indien.
Je vois ce que je peux faire et je te fais un retour.
Bonne journée
 
Bonjour à tous.
jeanmi, je salue le compatriote des Outremers. Moi je suis de l'Ile de la Réunion dans l'océan Indien.
Je vois ce que je peux faire et je te fais un retour.
Bonne journée
Bonsoir à tous,
jeanmi, je te mets en pièces jointes le nouveau fichier avec les modifications demandées.
Je te mets également ton fichier Word avec les réponses à tes questions.
Si besoin d'explications, ne surtout pas hésiter.
 

Pièces jointes

Bonsoir à tous,
jeanmi, je te mets en pièces jointes le nouveau fichier avec les modifications demandées.
Je te mets également ton fichier Word avec les réponses à tes questions.
Si besoin d'explications, ne surtout pas hésiter.
Bonjour @Piment à tous,

Encore un grand merci pour toutes ces informations.

J'ai bien pris en compte toutes tes remarques et recommandations.
Voici les petites choses ou j’ai besoin d’éclaircissement afin de bien comprendre et utiliser.

Merci d’avance pour les infos.

Pour moi il est largement l’heure d’allé au lit maintenant.

Bonne journée.

Cordialement
 

Pièces jointes

Bonjour @Piment à tous,

Encore un grand merci pour toutes ces informations.

J'ai bien pris en compte toutes tes remarques et recommandations.
Voici les petites choses ou j’ai besoin d’éclaircissement afin de bien comprendre et utiliser.

Merci d’avance pour les infos.

Pour moi il est largement l’heure d’allé au lit maintenant.

Bonne journée.

Cordialement
Bonjour à tous.
jeanmi, bien reçu, je regarde ça et je te fais un retour.
 
Bonjour à tous.
jeanmi, bien reçu, je regarde ça et je te fais un retour.
jeanmi, je te mets ci-joint le fichier avec les corrections.
Fais moi un retour.
Merci Bonne journée
 

Pièces jointes

Bonjour le forum,

@Piment c'est un très gros travail que vous avez fourni, félicitations.

Ceci dit le problème posé est relativement simple, le jeu n'en vaut peut-être pas la chandelle.

Perso je me contenterai d'ajouter les prix et un bouton Imprimer à ce que j'ai déjà fait :
VB:
Private Sub Worksheet_Activate()
Worksheet_SelectionChange ActiveCell 'lance la macro quand on revient sur cette feuille
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim crit$
Application.ScreenUpdating = False
Me.Unprotect "jlejle"
With Range("C27:C" & Rows.Count)
    .Validation.Delete 'RAZ
    If Intersect(ActiveCell, .Cells) Is Nothing Then GoTo 1
    crit = ActiveCell(1, 0)
    If crit = "" Then crit = "*"
    With Sheets("liste articles").ListObjects(1).Range 'tableau structuré
        .Sort .Columns(3), xlAscending, Header:=xlYes 'tri sur Famille
        .Cells(Application.Match(crit, .Columns(3), 0), 2).Resize(Application.CountIf(.Columns(3), crit)).Name = "Liste" 'plage nommée
        ActiveCell.Validation.Add xlValidateList, Formula1:="=Liste"
    End With
End With
1 Me.Protect "jlejle"
End Sub

Sub Fichier_PDF()
Imprimer False
Me.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Bon N° " & [C18] & ".pdf"
Rows.Hidden = False 'affiche tout
MsgBox "Le fichier PDF a été créé..."
End Sub

Sub Imprimer(Optional x = True)
Dim c As Range
Me.Protect "jlejle", UserInterfaceOnly:=True
Me.PageSetup.PrintArea = "A1:F60" 'zone d'impression
Rows.Hidden = False 'affiche tout
For Each c In [D27:D56]
    If IsEmpty(c) Then c.EntireRow.Hidden = True 'masque les lignes non utilisées
Next
If x = False Then Exit Sub
Me.PrintPreview 'affiche l'aperçu avant impression
'Me.PrintOut 'pour imprimer directement
Rows.Hidden = False 'affiche tout
End Sub
A+
 

Pièces jointes

Bonjour le forum,

@Piment c'est un très gros travail que vous avez fourni, félicitations.

Ceci dit le problème posé est relativement simple, le jeu n'en vaut peut-être pas la chandelle.

Perso je me contenterai d'ajouter les prix et un bouton Imprimer à ce que j'ai déjà fait :
VB:
Private Sub Worksheet_Activate()
Worksheet_SelectionChange ActiveCell 'lance la macro quand on revient sur cette feuille
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim crit$
Application.ScreenUpdating = False
Me.Unprotect "jlejle"
With Range("C27:C" & Rows.Count)
    .Validation.Delete 'RAZ
    If Intersect(ActiveCell, .Cells) Is Nothing Then GoTo 1
    crit = ActiveCell(1, 0)
    If crit = "" Then crit = "*"
    With Sheets("liste articles").ListObjects(1).Range 'tableau structuré
        .Sort .Columns(3), xlAscending, Header:=xlYes 'tri sur Famille
        .Cells(Application.Match(crit, .Columns(3), 0), 2).Resize(Application.CountIf(.Columns(3), crit)).Name = "Liste" 'plage nommée
        ActiveCell.Validation.Add xlValidateList, Formula1:="=Liste"
    End With
End With
1 Me.Protect "jlejle"
End Sub

Sub Fichier_PDF()
Imprimer False
Me.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Bon N° " & [C18] & ".pdf"
Rows.Hidden = False 'affiche tout
MsgBox "Le fichier PDF a été créé..."
End Sub

Sub Imprimer(Optional x = True)
Dim c As Range
Me.Protect "jlejle", UserInterfaceOnly:=True
Me.PageSetup.PrintArea = "A1:F60" 'zone d'impression
Rows.Hidden = False 'affiche tout
For Each c In [D27:D56]
    If IsEmpty(c) Then c.EntireRow.Hidden = True 'masque les lignes non utilisées
Next
If x = False Then Exit Sub
Me.PrintPreview 'affiche l'aperçu avant impression
'Me.PrintOut 'pour imprimer directement
Rows.Hidden = False 'affiche tout
End Sub
A+
Bonjour job75, merci pour l'appréciation. J'ai eu des maîtres sur ce forum, et des très bons, dont tu en fais partie. Je ne vous remercierai jamais assez pour cela. Maintenant, je pense que le problème soumis par jeanmi n'est qu'une partie de ce qu'il a en tête.
Je crois que la suite viendra. Cherchez à automatiser l'élaboration d'un bon de commande va forcément entraîner, à minima, la gestion de stock. Et puis je m'amuse, et si ça convient au demandeur, tant mieux.
Moi, ça me permet d'être occupé et de continuer à apprendre. Je suis trop heureux d'être utile à quelqu'un.
 
- 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