XL 2019 Liste déroulante et modification par vba

Tableau123

XLDnaute Nouveau
Bonjour,
J'ai besoin de votre aide pour créer une liste déroulante par vba. J'ai pas mal cherché sur internet mais je n'ai pas réussi à trouver ce je voudrais.
Ci-joint un fichier TEST pour vous aider à comprendre ma demande.
Dans l'onglet TEST, je souhaiterais créer une liste déroulante par vba dans la cellule G7. Quand je sélectionne une référence, je voudrais que le nom apparaît dans la cellule G9 et le prénom G11. Puis, si je modifie le nom ou le prénom, je voudrais que la modification apparaît dans la bonne cellule de l'onglet BASE.
D'avance, mille mercis!!!!
 

Pièces jointes

  • TEST.xlsx
    10.6 KB · Affichages: 9

Jacky67

XLDnaute Barbatruc
Bonjour,
J'ai besoin de votre aide pour créer une liste déroulante par vba. J'ai pas mal cherché sur internet mais je n'ai pas réussi à trouver ce je voudrais.
Ci-joint un fichier TEST pour vous aider à comprendre ma demande.
Dans l'onglet TEST, je souhaiterais créer une liste déroulante par vba dans la cellule G7. Quand je sélectionne une référence, je voudrais que le nom apparaît dans la cellule G9 et le prénom G11. Puis, si je modifie le nom ou le prénom, je voudrais que la modification apparaît dans la bonne cellule de l'onglet BASE.
D'avance, mille mercis!!!!
Bonjour,
Une proposition avec ces codes en PJ
VB:
Private Sub Worksheet_Activate()
    With Feuil2
        ActiveWorkbook.Names.Add Name:="Référence", RefersTo:=.Range("A2:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
    End With
    With [g7].Validation
        .Delete
        .Add Type:=xlValidateList, Formula1:="=Référence"
    End With
End Sub
'************************************************
Private Sub Worksheet_Deactivate()
    [g7:g11].ClearContents
End Sub
'************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Target.Address = "$G$7" Then
        If Target <> "" Then
            [g9] = Feuil2.Cells(Application.Match([g7], [Référence], 0) + 1, 2)
            [g11] = Feuil2.Cells(Application.Match([g7], [Référence], 0) + 1, 3)
        End If
    End If

    If Target.Address = "$G$9" Or Target.Address = "$G$11" Then
        If [g7] <> "" Then
            Feuil2.Cells(Application.Match([g7], [Référence], 0) + 1, 2) = [g9]
            Feuil2.Cells(Application.Match([g7], [Référence], 0) + 1, 3) = [g11]
        Else
            MsgBox "Référence Manquante", vbInformation, "Information": [g7].Activate
        End If
    End If
    Application.EnableEvents = True
End Sub
 

Pièces jointes

  • tableau123.xlsm
    19.1 KB · Affichages: 6
Dernière édition:

Tableau123

XLDnaute Nouveau
Bonjour Jacky,
Merci pour votre aide.
J'ai essayé de transposer votre code, en l'adaptant bien-entendu à mon cas, mais, malheureusement ça ne fonctionne pas.
Je n'arrive pas à télécharger le fichier, il est trop volumineux. J'ai pourtant supprimé pas mal de choses mais il est toujours aussi volumineux. Je ne comprends pas.
Pourrais-je vous envoyer le fichier en MP ?
 

Jacky67

XLDnaute Barbatruc
Bonjour Jacky,
Merci pour votre aide.
J'ai essayé de transposer votre code, en l'adaptant bien-entendu à mon cas, mais, malheureusement ça ne fonctionne pas.
Je n'arrive pas à télécharger le fichier, il est trop volumineux. J'ai pourtant supprimé pas mal de choses mais il est toujours aussi volumineux. Je ne comprends pas.
Pourrais-je vous envoyer le fichier en MP ?
Re..
Quel est le message d'erreur ?
Le codes sont à placer dans le module de la feuille (test dans l'exemple)
Il suffit d'un classeur avec les 2 feuilles concernées et une vingtaine de données
Cela ne devrait pas peser très lourd :rolleyes:
**Attention toutefois..
Dans mon code les noms de feuille sont appelés par leurs CodeName
"Feuil2" peut-être remplacé par ===> Sheets("Base")
Dans le cas ou la feuille "Base" dans le classeur réel n'est pas "Feuil2"
 
Dernière édition:

Tableau123

XLDnaute Nouveau
Après avoir adapté votre code à mon fichier, il bug dans la partie en gras ci-dessous.
Je ne sais pas si vous arrivez à comprendre sans le fichier.

Application.EnableEvents = False
If Target.Address = "$D$4" Then
If Target <> "" Then
[D6] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 1)
[D8] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 2)
[D10] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 3)
[D12] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 5)
[D14] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 6)
[D16] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 7)
[D18] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 8)
[D20] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 9)
[D22] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 12)
[D24] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 15)
[D26] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 16)
[D28] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 20)
[D30] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 23)
[G20] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 10)
End If
End If

If Target.Address = "$D$6" Or Target.Address = "$D$8" Or Target.Address = "$D$10" Or Target.Address = "$D$12" Or Target.Address = "$D$14" Or Target.Address = "$D$16" Or Target.Address = "$D$18" Or Target.Address = "$D$20" Or Target.Address = "$D$22" Or Target.Address = "$D24" Or Target.Address = "$D$26" Or Target.Address = "$D$28" Or Target.Address = "$D$30" Or Target.Address = "$G$20" Then
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 1) = [D6]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 2) = [D8]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 3) = [D10]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 5) = [D12]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 6) = [D14]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 7) = [D16]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 8) = [D18]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 9) = [D20]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 12) = [D22]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 15) = [D24]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 16) = [D26]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 20) = [D28]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 23) = [D30]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 10) = [G20]
End If
Application.EnableEvents = True
 

Jacky67

XLDnaute Barbatruc
Après avoir adapté votre code à mon fichier, il bug dans la partie en gras ci-dessous.
Je ne sais pas si vous arrivez à comprendre sans le fichier.

Application.EnableEvents = False
If Target.Address = "$D$4" Then
If Target <> "" Then
[D6] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 1)
[D8] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 2)
[D10] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 3)
[D12] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 5)
[D14] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 6)
[D16] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 7)
[D18] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 8)
[D20] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 9)
[D22] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 12)
[D24] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 15)
[D26] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 16)
[D28] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 20)
[D30] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 23)
[G20] = Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 10)
End If
End If

If Target.Address = "$D$6" Or Target.Address = "$D$8" Or Target.Address = "$D$10" Or Target.Address = "$D$12" Or Target.Address = "$D$14" Or Target.Address = "$D$16" Or Target.Address = "$D$18" Or Target.Address = "$D$20" Or Target.Address = "$D$22" Or Target.Address = "$D24" Or Target.Address = "$D$26" Or Target.Address = "$D$28" Or Target.Address = "$D$30" Or Target.Address = "$G$20" Then
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 1) = [D6]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 2) = [D8]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 3) = [D10]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 5) = [D12]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 6) = [D14]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 7) = [D16]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 8) = [D18]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 9) = [D20]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 12) = [D22]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 15) = [D24]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 16) = [D26]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 20) = [D28]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 23) = [D30]
Feuil12.Cells(Application.Match([D4], [Dossier], 0) + 4, 10) = [G20]
End If
Application.EnableEvents = True
Re..
Vérifier ce qu'il y a en D4 au moment du plantage
Un classeur s'impose.....
 

Tableau123

XLDnaute Nouveau
Je pense que tu as sûrement raison de me proposer de faire un userform mais, n'étant pas une spécialiste de vba, je ne voudrais pas m'aventurer vers quelque chose que je ne maitrise pas.
J'ai adapté ton code à mon cas et ça fonctionne ! Je suis trop contente :) .
Cependant, j'ai deux questions à te poser :
1/ La base de données de mon classeur fait plusieurs centaines de lignes. Si le D4 reprend exactement la liste des dossiers de la feuil12, il n'y a aucun problème. Mais si on trie cette liste par ordre alphabétique, le D4 ne reprend plus les bonnes lignes. Peut-on corriger ce problème ?
2/ J'ai créé un bouton sur un autre onglet qui, si l'on clique dessus, nous emmène directement vers la bonne feuille, soit la feuil3. Or il m'emmène à chaque fois vers une mauvaise feuille. Et pourtant, dans vba, en cliquant sur le triangle vert, il m'emmène vers la bonne feuille. Comment cela est-il possible ? Je n'ai pas réussi à trouver la réponse sur internet.
Si je peux encore abuser de ta gentillesse… :D
 

Jacky67

XLDnaute Barbatruc
Je pense que tu as sûrement raison de me proposer de faire un userform mais, n'étant pas une spécialiste de vba, je ne voudrais pas m'aventurer vers quelque chose que je ne maitrise pas.
J'ai adapté ton code à mon cas et ça fonctionne ! Je suis trop contente :) .
Cependant, j'ai deux questions à te poser :
1/ La base de données de mon classeur fait plusieurs centaines de lignes. Si le D4 reprend exactement la liste des dossiers de la feuil12, il n'y a aucun problème. Mais si on trie cette liste par ordre alphabétique, le D4 ne reprend plus les bonnes lignes. Peut-on corriger ce problème ?
2/ J'ai créé un bouton sur un autre onglet qui, si l'on clique dessus, nous emmène directement vers la bonne feuille, soit la feuil3. Or il m'emmène à chaque fois vers une mauvaise feuille. Et pourtant, dans vba, en cliquant sur le triangle vert, il m'emmène vers la bonne feuille. Comment cela est-il possible ? Je n'ai pas réussi à trouver la réponse sur internet.
Si je peux encore abuser de ta gentillesse… :D
RE..
1/ Je n'observe pas ce qui est d'écrit. La seule chose qui change en cas de tri de la BD, c'est l'ordre d'affichage de la liste de validation. La recherche se fait par un equiv() (Match).
Il ne peut y avoir erreur que si le tri est fait sur une seule colonne.
2/Je n'ai pas compris......
Dans l'exemple en PJ
1-J'ai fait un tri dans la BD, j'obtiens bien les bons résultats
2-J'ai mis un bouton pour afficher la feuil3
 

Pièces jointes

  • tableau123 v2.xlsm
    39.4 KB · Affichages: 11
Dernière édition:

Tableau123

XLDnaute Nouveau
Pour le bouton, j'ai enfin compris d'où venait le problème : certaines feuilles du classeur sont protégées par un mot de passe. J'ai donc déprotégé ces feuilles dans le module de la feuil3 pour que les modifications puissent y être reportées, puis replacé la protection à la fin. Aujourd'hui, j'ai enlevé ces déprotection/protection et ça marche enfin !

Je tenais à te remercier pour ton aide, ta patience et ta disponibilité. Tu as très vite compris ma demande et as su apporter toutes les solutions nécessaires.
Bravo ! ;)
 

Discussions similaires

Réponses
12
Affichages
254

Statistiques des forums

Discussions
311 711
Messages
2 081 782
Membres
101 817
dernier inscrit
carvajal