Macro liste déroulante avec ajout dynamique

david84

XLDnaute Barbatruc
Bonjour à tous,
voici mon problème : je crée une petite base de données destinée à enregistrer des données qui concernent des associations sportives (leur coordonnées, disciplines d'affiliation (athlé, foot,tennis,...), ...
J'ai donc plusieurs feuilles :
- les données sources (BD)
- une feuille "menu" pour pouvoir naviguer vers les différents onglets
- une feuille "création" pour pouvoir créer une nouvelle fiche "association"
- une feuille "consultation" qui me permet de consulter ou modifier une fiche existante.
- 2 feuilles "liste" où sont répertoriées les différentes listes (disciplines, associations, communes, code postaux) me permettant de renseigner ces cellules par le biais de listes déroulantes (ces listes étant dynamiques).

Jusque-là tout va bien.

Mon soucis est le suivant : lors de la saisie d'une nouvelle discipline et/ou d'une nouvelle association, d'une nouvelle commune ou d'un nouveau code postal ( feuille "création" ou consultation/modification" ), je voudrais que ces nouvelles données soient automatiquement placées dans la liste déroulante concernée et, si possible, dans l'ordre alphabétique .

Pour cela, j'ai trouvé une macro proposée sur son site par Jacques Boisgontier (liste en cascade avec ajout dynamique de champs).

http://boisgontierjacques.free.fr/fichiers/DonneesValidation/DV_CascadeSansNomsAjoutDynamique.xls

J'ai essayé de l'adapter aux spécificités de ma requête mais, ne maîtrisant pas langage vba, je patauge complétement.

Voici la macro de Jacques Boisgontier ( merci à toi au passage !):

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$2" And Target <> "" And Target.Count = 1 Then
If IsError(Application.Match(Target.Value, [choix1], 0)) Then
If MsgBox("On ajoute?", vbYesNo) = vbYes Then
[choix1].End(xlToRight).Offset(0, 1) = Target.Value
Else
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
Else
Target.Offset(0, 1) = Sheets("listes").Range("choix2")(1).Offset(1, Application.Match(Target, [choix1], 0) - 1)
End If
End If
If Target.Address = "$C$2" And Target <> "" And Target.Count = 1 Then
d = Application.Match(Target.Offset(0, -1), [choix1], 0) - 1
If IsError(Application.Match(Target.Value, [choix2].Offset(0, d), 0)) Then
If MsgBox("On ajoute?", vbYesNo) = vbYes Then
n = Application.CountA([choix2].Offset(0, d))
c = Sheets("listes").Range("choix2").Column
Sheets("listes").Cells(n + 1, c + d) = Target.Value
Else
On Error Resume Next
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End If
End If
End Sub

Voici ma tentative d'adaptation :
Sub ajouter_donnees()

If Target.Address = "$E$6" And Target <> "" And Target.Count = 1 Then
If IsError(Application.Match(Target.Value, [disciplines], 0)) Then
If MsgBox("On ajoute?", vbYesNo) = vbYes Then
[disciplines].End(xlToRight).Offset(0, 1) = Target.Value
Else
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
Else
Target.Offset(0, 1) = Sheets("liste disc-ass").Range("associations")(1).Offset(1, Application.Match(Target, [choix1], 0) - 1)
End If
End If
If Target.Address = "$E$7" And Target <> "" And Target.Count = 1 Then
d = Application.Match(Target.Offset(0, -1), [disciplines], 0) - 1
If IsError(Application.Match(Target.Value, [associations].Offset(0, d), 0)) Then
If MsgBox("On ajoute?", vbYesNo) = vbYes Then
n = Application.CountA([associations].Offset(0, d))
c = Sheets("liste disc-ass").Range("associations").Column
Sheets("liste disc-ass").Cells(n + 1, c + d) = Target.Value
Else
On Error Resume Next
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End If
End If

End Sub

Je ne sais pas d'où vient le problème (je m'y prend mal pour enregistrer la macro, je ne sais pas l'adapter, la lancer ?).

Merci de me donner un coup de main car là je suis bloqué !

Je vous ai joint mon fichier que j'ai auparavant converti au format 97-2003
 

david84

XLDnaute Barbatruc
Re : Macro liste déroulante avec ajout dynamique

Je pense que mon fichier n'est pas passé la 1ère fois.
J'ai enlevé certains éléments pour des pb de confidentialité et l'ai placé sur ci-joint.fr

Cijoint.fr - Service gratuit de dépôt de fichiers
 

david84

XLDnaute Barbatruc
Re : Macro liste déroulante avec ajout dynamique

C'est tjrs moi.

J'ai essayé de retravailler la macro en l'adaptant à mon fichier.
Lorsque je la lance, elle bogue (apparaît en jaune) sur la partie que j'ai mise en gras (cf ci-dessous) et m'affiche "erreur d'exécution 13 incompatibilité de type". Quelqu'un peut-il m'aider ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Address = "$E$6" And Target <> "" And Target.Count = 1 Then
If IsError(Application.Match(Target.Value, [disciplines], 0)) Then
If MsgBox("On ajoute?", vbYesNo) = vbYes Then
[disciplines].End(xlToRight).Offset(0, 1) = Target.Value
Else
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
Else
Target.Offset(0, 1) = Sheets("liste disc-ass").Range("associations")(1).Offset(1, Application.Match(Target, [disciplines], 0) - 1)
End If
End If
If Target.Address = "$E$7" And Target <> "" And Target.Count = 1 Then
d = Application.Match(Target.Offset(0, -1), [disciplines], 0) - 1
If IsError(Application.Match(Target.Value, [associations].Offset(0, d), 0)) Then
If MsgBox("On ajoute?", vbYesNo) = vbYes Then
n = Application.CountA([associations].Offset(0, d))
c = Sheets("liste disc-ass").Range("associations").Column
Sheets("liste disc-ass").Cells(n + 1, c + d) = Target.Value
Else
On Error Resume Next
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End If
End If

End Sub
 

Discussions similaires

Réponses
2
Affichages
145

Statistiques des forums

Discussions
312 354
Messages
2 087 548
Membres
103 586
dernier inscrit
julie30620