VBA Amélioration macro fichier association

david84

XLDnaute Barbatruc
Bonjour à tous,
J'ai fait il y a quelques temps un fichier permettant l'enregistrement et le suivi d'associations sportives : enregistrer les nouvelles associations, mise à jour de leur coordonnées (adresse, tel , mail,...) possibilité de les contacter par mail,...
Ce fichier a été fait à l'aide de formules et d'enregistrement de macros, auxquelles s'étaient ajoutées une ou deux macros faites par des personnes de ce forum (notamment JNP que je remercie au passage).
Il fonctionne correctement mais j'aimerai maintenant optimiser les codes afin de le rendre plus rapide et de nettoyer les codes des "sélect" et autres informations parasites dues à l'enregistreur de macro, et au besoin reformuler certaines parties de la macro afin de gagner en efficacité.
Pour ce faire et pour simplifier le travail, je voudrais traiter feuille par feuille et avancer au fur et à mesure.
Le but est que je comprenne la manière de faire pour pouvoir ensuite le faire moi-même (je vais le prendre comme des travaux pratiques afin de comprendre un peu plus le VBA).
Dans le fichier ci-joint, ne sont présentes que 3 feuilles :
- une feuille "création" permettant de créer une nouvelle fiche
- une feuille "BD" dans lesquelles les différentes associations sont regroupées
- une feuille "listes" contenant l'ensemble des listes mises à jour.

La macro que je vous demande de m'aider à traiter se trouve dans le module et permet d'enregistrer une fois tous les champs remplis la nouvelle fiche dans la feuille "BD" et de mettre à jour la feuille "listes" afin que les menus déroulants soient à jour.
J'ai bien sûr essayé de le faire moi-même mais il y a toujours quelque chose qui cloche. Je veux donc voir comment vous procéderiez et ne manquerai pas de vous questionner pour comprendre les procédures utilisées.

Je me tiens à votre disposition pour d'éventuelles précisions et vous remercie de votre collaboration.
Cordialement
 

Pièces jointes

  • fichier_NvelleFicheV2.zip
    65.3 KB · Affichages: 231
  • fichier_NvelleFicheV2.zip
    65.3 KB · Affichages: 234
  • fichier_NvelleFicheV2.zip
    65.3 KB · Affichages: 236
Dernière édition:

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re :)
JNP: A partir du moment ou l'on fait l'effort d'utiliser une balise BBCODE
pour améliorer la lisibilité d'un message
celui qui veut tester le code fera l'effort de palier l'inconvénient du copier/coller ;)
Tout du moins c'est comme cela que je l'entends
Sur un code de 45 lignes, tu es gentil, mais moi, je laisse tomber :p.
La XLA de mromain est assez efficace, je ne pense pas toujours à l'utiliser, mais au moins, j'évite de jouer du retour chariot :D.
Bonne suite :cool:
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
C'est surtout qu'il faut tester à l'Exit de la commune si Discipline est vide. Si oui, faire appel à Filtre et à Charge pour remplir les combos Discipline et Association
Que veux tu dire ? Parles-tu du fait que la combobox "disciplines" n'affiche aucune disciplines ? Cela ne sera pas le cas puisque je commence toujours par sélectionner la discipline avant de choisir, soit une commune puis une asso, soit une asso puis une commune... je pense que tu veux me faire comprendre autre chose mais je ne vois pas...

Comme a dit Modeste, finalement, je me sens un peu "parrain", mais c'est une expérience agréable, et j'espère qu'elle t'enrichit
Personnellement, je suis très sensible à l'aide que tu m'apportes:) (et merci également aux autres intervenants;)).
A+
 

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re :),
Que veux tu dire ? Parles-tu du fait que la combobox "disciplines" n'affiche aucune disciplines ? Cela ne sera pas le cas puisque je commence toujours par sélectionner la discipline avant de choisir, soit une commune puis une asso, soit une asso puis une commune... je pense que tu veux me faire comprendre autre chose mais je ne vois pas...
Non, j'avais mal compris, je pensais qu'il voulait choisir une commune pour n'avoir que les disciplines de la commune, puis au choix de la discipline, récupérer les associations de la discipline dans cette commune :eek:.
Dans ce cas là, c'est Association qu'il faut vérifier comme vide en cas d'Exit de Commune pour recharger le combo Association ;).
Bon courage :cool:
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
Veux-tu dire que dans la procédure,il faut d'abord sélectionner la liste "disciplines", puis si je choisis une association en 2, je dois d'abord vider la liste "associations" pour ensuite la recharger en appliquant un filtre sur la discipline sélectionnée (call charge et filtre) ?
Si c'est le cas, je pensais utiliser Clear ou Unload, pour vider la liste...
Suis-je à côté de la plaque ?
Aujourd'hui, je ne peux pas tester mais j'essaierai demain.
Restera ensuite à trouver la solution pour la 3ème liste :rolleyes:...
A+
 

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re :),
Euh... non :p.
Je vais essayer de faire du cas par cas ;).
Pour simplifier la notation :
P : Potentiel : Liste du combobox chargé.
E : Etat : V pour Vide, R pour Renseigné
1) Initialisation de l'USF :
Tous combos : P : tout champs - E : V
2) Choix de Discipline : Association et Commune : P : Uniquement lié Discipline - E : V
3) Choix Discipline puis Association : reste combo : P : pas de changement - tous les champs : E : R (pas de doublon donc uniquement modification)
4) Choix Discipline puis Commune : Association : P : lié à Discipline + Commune - E : V
5) Choix Association : reste combo : P : pas de changement - tous les champs : E : R (pas de doublon donc uniquement modification)
6) Choix Commune : Discipline et Association : P : Uniquement lié Commune - E : V
7) Option : choix CodePostal : Idem ci-dessus avec Commune : P : Uniquement lié
Est-ce plus clair :D ?
A + :cool:
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
si je comprends ton langage:p :
P : Potentiel : Liste du combobox chargé.
chargement du ou des combobox appelés (call charge)
Etat : V pour Vide, R pour Renseigné
la zone de texte est vide ou renseignée
1) Initialisation de l'USF :
Tous combos : P : tout champs - E : V
ça, c'est l'initialisation des combobox via la sub
Private Sub UserForm_Initialize()
2) Choix de Discipline : Association et Commune : P : Uniquement lié Discipline - E : V
là, c'est le cas lorsqu'une fiche est créée (?) : les 3 listes sont indépendantes les unes des autres (toutes les disciplines, toutes les asso, toutes les communes.
Uniquement lié Discipline - E : V
pas compris ce que tu veux dire:rolleyes:.
3) Choix Discipline puis Association : reste combo : P : pas de changement - tous les champs : E : R (pas de doublon donc uniquement modification)
pas compris mais je pense que cela fait référence à une sub du type :
Private Sub Discipline_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set AChercher = Range("Tableau4[DISCIPLINES]").Find(Discipline, lookat:=xlWhole) 'cherche si la discipline existe déjà dans la BD
If AChercher Is Nothing Then Exit Sub
Call Charge(Association, Filtre(Range("Tableau4[DISCIPLINES]"), Range("Tableau4[ASSOCIATIONS]"), Discipline))
'charge uniquement les associations correspondant à la discipline sélectionnée
For I = 14 To 24
Controls(I).Text = "" 'vide les ComboBox et TexteBox
Next I
Association.SetFocus
End Sub
4), 5), 6) Là, je décroche (si jamais ce n'était pas déjà fait avant):(
7) Là c'est la sub existante permettant de ramener le code postal liée à la commune sélectionnée (?).

En fait, le problème, c'est que quand tu dis
Dans ce cas là, c'est Association qu'il faut vérifier comme vide en cas d'Exit de Commune pour recharger le combo Association
,
je ne sais pas de quoi tu parles ni comment faire.
J'ai donc tenté un début de macro rien que "pour voir" car je pense que c'est en essayant quelque chose que je vais finir par comprendre ce que tu veux m'expliquer:eek: :
Private Sub Commune_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Set AChercher = Range("Tableau4[COMMUNES]").Find(Commune, lookat:=xlWhole) 'recherche la commune sélectionnée
If AChercher Is Nothing Then Exit Sub
If Controls(13).Text <> "" And Controls(14).Text = "" Then 'si la discipline est sélectionnée et que la zone de texte "association " est vide
Call Charge(Commune, Filtre(Range("Tableau4[DISCIPLINES]"), Range("Tableau4[COMMUNES]"), Discipline))
End If
Commune.ListIndex = 0
Association.SetFocus

End Sub

Ce code a normalement pour but, suite au choix d'une discipline, de n'avoir que les communes liées à cette discipline.
Quand je teste ce code, voilà ce qui se passe :
- la liste des disciplines est présente dans la combo (ok) : je sélectionne une discipline (ex aïkido").
- je vais ensuite ouvrir la liste des communes : lorsque je l'ouvre, je me retrouve avec l'ensemble des communes présentes dans la liste:confused:
- lorsque j'en sélectionne une au hasard pour voir et que je tape sur "entrée", il ne m'affiche pas la commune sélectionnée, mais la 1ère des communes liées à la discipline sélectionnée (Avignon):confused:
- lorsque je resélectionne immédiatement cette liste, seules les communes liées à la discipline sélectionnée sont alors présentes (Avignon, Isle sur la sorgue, Pertuis, Sorgues) ;
- si je veux en sélectionner une autre (ex sorgues): impossible (seule la 1ère commune parmi les communes liées à la discipline sélectionnée est sélectionnable (les autres apparaissent dans la liste mais je ne peux les sélectionner).
Je pense que cela est notamment dû à ce que tu essaies de me faire comprendre : au fait que la liste commune n'ait pas été préalablement "vidée" (?).

Bon, voilà où j'en suis pour ce soir:(.
Peut-être que j'aurai une révélation durant la nuit mais là je bloque...mais je ne lâche pas !:p
A+

Edit : en me levant ce matin, j'ai eu une idée :rolleyes: : modifier la combo "disciplines" (et non "communes") puisque c'est elle qui est rentrée en 1er et envisager les différents cas que tu m'as énoncé en me servant de if ...then (ou de "select case"). j'ai modifié le code comme suit :
Code:
Private Sub Discipline_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set AChercher = Range("Tableau4[DISCIPLINES]").Find(Discipline, lookat:=xlWhole) 'cherche si la discipline existe déjà dans la BD
If AChercher Is Nothing Then Exit Sub

If Controls(14).Text = "" And Controls(19).Text = "" Then
    Call Charge(Commune, Filtre(Range("Tableau4[DISCIPLINES]"), Range("Tableau4[COMMUNES]"), Discipline))
    'End If
'Commune.ListIndex = 0
Association.SetFocus
Else: Call Charge(Association, Filtre(Range("Tableau4[DISCIPLINES]"), Range("Tableau4[ASSOCIATIONS]"), Discipline))
'charge uniquement les associations correspondant à la discipline sélectionnée
For I = 14 To 24
Controls(I).Text = "" 'vide les ComboBox et TexteBox
Next I
Association.SetFocus
End If
End Sub

Lorsque je sélectionne la commune directement après la discipline, je n'ai que les communes liées à la discipline:)
Bon, quand je sélectionne l'association, pour l'instant, c'est pas au point:confused:, mais est-ce que la logique est la bonne (travailler sur la combo "disciplines" en envisageant les différents cas) ou suis-je à côté de la plaque ?
Je te tiens au courant si j'avance;).
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re :),
Bon, on progresse, mais c'est vrai que c'est pas évident pour toi de raisonner comme moi, et vice versa :p...
Le problème est d'éviter le circulaire :rolleyes:.
Les abréviations, tu as compris. Je vais en rajouter quelques unes :D..
D : Discipline, A : Association, C : Commune, CP : CodePostal ;)
P = P signifie qu'on ne touche pas à la liste du Combo :rolleyes:
1) Initialisation de l'USF :
D : P = Charge - E = V
A : P = Charge - E = V
C : P = Charge - E = V
2) Choix de Discipline :
D : P = P - E = R
A : P = Charge(Filtre D) - E = V
C : P = Charge(Filtre D) - E = V
3) Choix Discipline puis Association :
D : P = P - E = R
A : P = P - E = R
C : P = Charge(Filtre D (Filtre A) -> E = R (et tout les champs R)
4) Choix Discipline puis Commune :
D : P = P - E = R
A : P = Charge(Filtre D (Filtre C) - E = V
C : P = P - E = R
5) Choix Association :
D : P = Charge(Filtre A) - E = R
A : P = P - E = R
C : P = Charge(Filtre A) - E = R (et tous les champs R)
6) Choix Commune :
D : P = Charge(Filtre C) - E = V
A : P = Charge(Filtre C) - E = V
C : P = P - E = R
7) Option : choix CodePostal : Idem ci-dessus avec :
D : P = Charge(Filtre CP) - E = V
A : P = Charge(Filtre CP) - E = V
C : P = Charge(Filtre CP) - E = V
CP : P = P - E = R
Donc le cas que tu as fais sur C Exit pour 6) donnerait en simplifié
Code:
Sub C_Exit
If D = "" & A = ""
D = Charge(Filtre(C))
A = Charge(Filtre(C))
ElseIf D <> "" & A = ""
A = Charge(Filtre C (Filtre D)
ElseIf D = "" & A <> ""
ne sert à rien vu que si l'association est déjà OK, c'est que tout est déjà renseigné :D
End If
Euh, si tu veux, je t'envoie 2 aspros par MP :p...
Bon courage :cool:
PS : Il n'est pas utile de décharger les combo, vu qu'en procédant par égalité, les combo sont chargés directement avec la nouvelle liste ;)
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
Bon, on progresse, mais c'est vrai que c'est pas évident pour toi de raisonner comme moi, et vice versa ...
C'est exactement ça ! En fait, j'ai 3 problème à résoudre :
- comprendre ce que tu veux me dire:(
- essayer (pour l'instant du moins) de ne pas penser "formules" mais "VBA"
- acquérir les connaissances VBA en général (merci au passage à staple qui m'a fait regarder de plus près l'aide Excel;)).
Euh, si tu veux, je t'envoie 2 aspros par MP ...
Seulement 2 ? :D
Sinon, quand je dis qu'il faut en fait
travailler sur la combo "disciplines" en envisageant les différents cas
, ça c'est apparemment faux puisque tu me mets en exemple
Code:
Sub [B]C_Exit[/B]
If D = "" & A = ""
D = Charge(Filtre(C))
A = Charge(Filtre(C))
ElseIf D <> "" & A = ""
A = Charge(Filtre C (Filtre D)
ElseIf D = "" & A <> ""
ne sert à rien vu que si l'association est déjà OK, c'est que tout est déjà renseigné :D
End If
Donc, c'est qu'il faut travailler dans les différentes combo !
Bon, je m'y remets et regarde de plus près ton dernier message (j'ai l'impression (fugace !) que cela s'éclaircit un peu:rolleyes:.
Je fais des tests et te tiens au courant.
A+
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
1 précision STP :
pour la 1ère condition
'If D = "" & A = ""
, apparemment cela focntionne :
If Controls(13).Text = "" And Controls(14).Text = "" Then
'D = Charge(Filtre(C))
'a = Charge(Filtre(C))
Call Charge(Discipline, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune))
Call Charge(Association, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[ASSOCIATIONS]"), Commune))

Pour la 2ème condition :
je traduis
A = Charge(Filtre C (Filtre D)
par
Call Charge(Association, Filtre(Range("Tableau4[COMMUNES]")(Range("Tableau4[DISCIPLINES]")), Range("Tableau4[ASSOCIATIONS]"), Commune))
ça ne fonctionne pas car je dois faire une erreur de syntaxe en imbriquant les filtres que je n'arrive pas à corriger : si c'est la cas, comment imbriquer correctement les filtres ?
 

Staple1600

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Bonjour à tous

David84
(merci au passage à staple qui m'a fait regarder de plus près l'aide Excel;)).

Bah, il est bien content le gars Staple, que tu caresses plus souvent ta touche F1.

Vais pouvoir aller aux champignons cet après-midi

(la mienne , on voit plus ce qu'il y avait écrit dessus, tellement je l'ai titillé )

Vous aviez remarqué que vous étiez en duopole sur ce post ;) ?

Chut! je vous laisse dans votre intimité excelienne à tâter du combo...
 

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re :),
Code:
Call Charge(Association, Filtre(Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune), Range("Tableau4[ASSOCIATIONS]"), Discipline))
serait plus exact ;).
Code:
Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune)
renvoie les lignes de DISCIPLINES qui correspondent à Commune, puis
Code:
Filtre([COLOR=red][B]Résultat[/B][/COLOR], Range("Tableau4[ASSOCIATIONS]"), Discipline)
renvoie ASSOCIATIONS dont Discipline est dans Résultat, ce qui fait qu'on charge bien Discipline ET Commune OK :p.
D'autre part, pour la lisibilité du code
Code:
If Discipline.Text = "" And Associations.Text = "" Then
me parait mieux :D.
Staple1600 à dit:
Vous aviez remarqué que vous étiez en duopole sur ce post ;) ?
Oui, mais c'est ouvert à tous :D
Bon courage :cool:
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
Voilà ce que j'ai tenté de placer dans la combo "commune" :
Code:
Private Sub Commune_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set AChercher = Range("Tableau4[COMMUNES]").Find(Commune, lookat:=xlWhole) 'recherche la commune sélectionnée
If AChercher Is Nothing Then Exit Sub

'If D = "" & A = ""
If Discipline.Text = "" And Association.Text = "" Then 'si les zones de texte "discipline" et "asso" sont vides
'D = Charge(Filtre(C))
'a = Charge(Filtre(C))

Call Charge(Discipline, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune))
Call Charge(Association, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[ASSOCIATIONS]"), Commune))

'ElseIf D <> "" & A = ""
'A = Charge(Filtre C (Filtre D)
ElseIf Discipline.Text <> "" And Association.Text = "" Then
Call Charge(Association, Filtre(Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune), Range("Tableau4[ASSOCIATIONS]"), Discipline))
CodePostal.ListIndex = 0
Cedex.SetFocus
End If
End Sub

Pour la partie
Code:
'If D = "" & A = ""
If Discipline.Text = "" And Association.Text = "" Then 'si les zones de texte "discipline" et "asso" sont vides
'D = Charge(Filtre(C))
'a = Charge(Filtre(C))
, les 2 listes sont présentes et le filtre "commune" joue son rôle.

Par contre pour la partie
Code:
ElseIf Discipline.Text <> "" And Association.Text = ""
, cela ne donne rien : une fois la discipline choisie, la liste des communes ne tient pas compte des filtres (c'est la liste complète qui m'est proposée):confused:.

Sinon, si je "traduis" l'un de tes exemples, par ex
2) Choix de Discipline :
D : P = P - E = R
A : P = Charge(Filtre D) - E = V
C : P = Charge(Filtre D) - E = V
voilà ce que je comprends :
D : P = P - E = R
je ne touche pas à la combo "discipline"
A : P = Charge(Filtre D) - E = V
je vais dans la macro de la combo "asso" et j'appelle "charge", sur lequel j'applique le filtre "discipline"
C : P = Charge(Filtre D) - E = V
je vais dans la macro de la combo "commune" et j'appelle "charge", sur lequel j'applique le filtre "discipline"

P = P signifie qu'on ne touche pas à la liste du Combo
Si ce n'est pas ce que j'ai compris dans l'exemple ci-dessus, alors je n'ai pas compris cette phrase:confused:.
A+
 

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re :),
Quand je disais "vice et versa" :p
Voilà ce que j'ai tenté de placer dans la combo "commune" :
Code:
Private Sub Commune_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set AChercher = Range("Tableau4[COMMUNES]").Find(Commune, lookat:=xlWhole) 'recherche la commune sélectionnée
If AChercher Is Nothing Then Exit Sub
'If D = "" & A = ""
If Discipline.Text = "" And Association.Text = "" Then 'si les zones de texte "discipline" et "asso" sont vides
'D = Charge(Filtre(C))
'a = Charge(Filtre(C))
Call Charge(Discipline, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune))
Call Charge(Association, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[ASSOCIATIONS]"), Commune))
'ElseIf D <> "" & A = ""
'A = Charge(Filtre C (Filtre D)
ElseIf Discipline.Text <> "" And Association.Text = "" Then
Call Charge(Association, Filtre(Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune), Range("Tableau4[ASSOCIATIONS]"), Discipline))
CodePostal.ListIndex = 0
Cedex.SetFocus
End If
End Sub
Parait nickel, sauf que pour mettre CodePostal.ListIndex = 0, il faudrait utiliser Charge avec CodePostal ;).
Pour la partie
Code:
'If D = "" & A = ""
If Discipline.Text = "" And Association.Text = "" Then 'si les zones de texte "discipline" et "asso" sont vides
'D = Charge(Filtre(C))
'a = Charge(Filtre(C))
, les 2 listes sont présentes et le filtre "commune" joue son rôle.
Ok
Par contre pour la partie
Code:
ElseIf Discipline.Text <> "" And Association.Text = ""
, cela ne donne rien : une fois la discipline choisie, la liste des communes ne tient pas compte des filtres (c'est la liste complète qui m'est proposée):confused:.
Euh, c'est le fait d'avoir choisi une commune qui a déclenché la macro, donc Commune est renseigné, pourquoi vouloir avoir une liste dans Commune :confused: ?
Sinon, si je "traduis" l'un de tes exemples, par ex
Code:
2) Choix de Discipline :
D : P = P - E = R
A : P = Charge(Filtre D) - E = V
C : P = Charge(Filtre D) - E = V
voilà ce que je comprends :
je ne touche pas à la combo "discipline"
OK
je vais dans la macro de la combo "asso" et j'appelle "charge", sur lequel j'applique le filtre "discipline"
Non, je suis dans Discipline_Exit pour remplir Association avec Charge Filtre Discipline
je vais dans la macro de la combo "commune" et j'appelle "charge", sur lequel j'applique le filtre "discipline"
Idem, pour remplir Commune avec Charge Filtre Discipline
Si ce n'est pas ce que j'ai compris dans l'exemple ci-dessus, alors je n'ai pas compris cette phrase:confused:.
C'est vrai que c'est pas évident de jongler avec tout cela :rolleyes:.
Grosso modo, on va toujours être dans l'Exit du combo (sur les 3 principaux, on va se focaliser là dessus pour l'instant :D) qu'on vient de renseigner. Quand on sélectionne quelque chose, on va regarder les 2 autres. Si les 2 sont vides, on va charger les 2 combo vides en fonction de ce qu'on vient de choisir. Si un des 2 est renseigné, on va remplir le 3ème en fonction de ce qu'on vient de choisir et de celui déjà renseigné. Et si l'association est renseignée, on va carrément charger tous les champs, vu qu'on considère qu'une association est unique, donc avec une discipline et une adresse unique ;).
A + :cool:
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re +message suivant
Bonjour JN:),
Je pense que je ne suis pas loin, mais ne sachant pas quand je teste si l'erreur est à la partie de code testée ou à autre chose, au bout d'un moment je perds pied:confused: .

Cependant, je pense que la clé est dans cette partie de ton message :
Code:
Grosso modo, on va toujours être dans l'Exit du combo (sur les 3 principaux, on va se focaliser là dessus pour l'instant ) qu'on vient de renseigner. Quand on sélectionne quelque chose, on va regarder les 2 autres. Si les 2 sont vides, on va charger les 2 combo vides en fonction de ce qu'on vient de choisir. Si un des 2 est renseigné, on va remplir le 3ème en fonction de ce qu'on vient de choisir et de celui déjà renseigné. Et si l'association est renseignée, on va carrément charger tous les champs, vu qu'on considère qu'une association est unique, donc avec une discipline et une adresse unique .

Pour réduire le champ des incertitudes, je te propose comme tu l'as suggéré de nous focaliser sur les combo "discipline", "asso" et "commune" en réduisant les macros au strictes infos permettant de les synchroniser.
Alors, je vais te prendre un cas concret en te détaillant les différentes étapes.
Je veux faire en sorte que lorsque je sélectionne une discipline, je puisse ensuite, soit :
- choisir une commune puis l'asso donc D=>C=>A
- choisir une asso puis une commune donc D=>A=>C

Voila ce que je fais :
1) je commence par la partie "choisir une commune puis l'asso" :
a- je me place dans la combo "discipline". Celle-ci étant vide, si j'applique ce que tu me dis (Si les 2 sont vides, on va charger les 2 combo vides en fonction de ce qu'on vient de choisir) et je place donc ce code
Code:
Private Sub Discipline_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set AChercher = Range("Tableau4[DISCIPLINES]").Find(Discipline, lookat:=xlWhole) 'cherche si la discipline existe déjà dans la BD
If AChercher Is Nothing Then Exit Sub
If Association.Text = "" And Commune.Text = "" Then
'filtre "commune" et "asso" en fonction de la discipline
Call Charge(Commune, Filtre(Range("Tableau4[DISCIPLINES]"), Range("Tableau4[COMMUNES]"), Discipline))
Call Charge(Association, Filtre(Range("Tableau4[DISCIPLINES]"), Range("Tableau4[ASSOCIATIONS]"), Discipline))
End If
End Sub
J'ai alors dans les combo "asso" et "commune" uniquement la liste de la discipline concernée

b- je me place ensuite dans la combo "commune" où je place ce code ("discipline" est remplie et " asso" est vide) :
Code:
Private Sub Commune_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set AChercher = Range("Tableau4[COMMUNES]").Find(Commune, lookat:=xlWhole) 'recherche la colonne commune
If AChercher Is Nothing Then Exit Sub
If Discipline.Text <> "" And Association.Text = "" Then 'agit sur la combo "asso"
Call Charge(Association, Filtre(Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune), Range("Tableau4[ASSOCIATIONS]"), Discipline))
End If
End Sub

Cela donne le résultat escompté puisque lorsque je sélectionne la combo "asso", seules les assos répondant à la discipline et à la commune sélectionnées sont présentes :).

Par contre, je bloque pour la suite, à savoir :
2) choisir une asso puis une commune
Ce que je pense qu'il faut faire :
(le A de 1) ne change pas donc je n'interviens pas dans la combo "discipline")
- se placer dans la combo "asso" ("Si un des 2 est renseigné, on va remplir le 3ème en fonction de ce qu'on vient de choisir et de celui déjà renseigné") et lui dire que si discipline.texte <>"" et commune.texte ="", je sélectionne la liste "commune" à laquelle j'applique d'abord le filtre "discipline", puis le filtre "asso".

Si mon raisonnement n'est pas bon, indique-moi où il pêche.
S'il est bon, c'est peut-être que je me mélange dans l'application des filtres.
Sans pour autant me donner la réponse, dis-moi si j'interprète correctement la partie ci-dessous (peut-être que je ne la comprends pas) :
Call Charge(Discipline, Filtre(Range("Tableau4[COMMUNES]"), Range("Tableau4[DISCIPLINES]"), Commune))
Discipline=le nom de la liste appelée
Filtre(Range("Tableau4[COMMUNES]")=la colonne filtrée
Range("Tableau4[DISCIPLINES]=la colonne sur laquelle agit le filtre
Commune= la combo sélectionnée

Merci de ta patience;)
A+
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
292
Réponses
13
Affichages
261
Réponses
1
Affichages
78
Compte Supprimé 979
C

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof