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:

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re Pierrot

Je te parlais du code du message 23.
Concernant celui du message 26, peux-tu m'indiquer en te servant du fichier fourni dans mon dernier message (le 29) à quel endroit de la macro dois-je le placer et à la place de quelle partie du code existant:rolleyes: ?
Merci
 

Pierrot93

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re,
je l'ai testé en lieu et place de la macro existante, tu peux coller le code après le "end sub" en modifiant les noms des procédures, jamais 2 noms identiques... exécute le dans un premier temps pas à pas, dans l'éditeur vba, tu positionnes le curseur dans la procédure et utilisation de la touche F8...
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
J'ai testé ton code (je parle bien de celui du message 22;)) en lieu et place de ma macro et il fonctionne très bien. Le problème c'est que lorsque j'essaie de l'inclure dans mon code pour que les tris puissent être faits c'est là que cela bogue:rolleyes:.
Donc soit je m'y prends comme un manche (ce qui est fort possible:eek:), soit la partie de la macro traitant des tris et enregistrée avec XL 2007 présente un problème de compatibilité avec ton code.
Et comme de ton côté tu ne peux tester cette partie de la macro, je ne peux te demander de la placer dans mon code de manière à ce que l'ensemble fonctionne:confused:.
Là, je crois qu'on bloque...
A+
 

Pierrot93

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re,

soit la partie de la macro traitant des tri et enregistrée avec XL 2007 présente un problème de compatibilité avec ton code.
je ne le crois pas trop, une fois le code exécuté, ces lignes de code ne peuvent pas interférer sur la suite des instructions... Attendons de voir l'avis d'une personne sous 2007...
bon courage pour la suite...
 

skoobi

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Salut David,

en attendant que quelqu'un te réponde pour le test avec excel 2007, j'ai remarqué que tu utilises plusieurs fois le tri de ta liste.
Il est possible de réduire la macro en passant par une procédure "avec argument" qui contiendra ces différents tris. Ca fera plus "propre".
Si ça t'intéresse, n'hésite pas à faire signe.
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
bonsoir Skoobi:),
en attendant que quelqu'un te réponde pour le test avec excel 2007, j'ai remarqué que tu utilises plusieurs fois le tri de ta liste.
Il est possible de réduire la macro en passant par une procédure "avec argument" qui contiendra ces différents tris. Ca fera plus "propre".

Cela peut effectivement m'intéresser mais l'univers du VBA étant nouveau pour moi je ne sais pas trop de quoi tu parles:rolleyes:.
Ceci dit, je m'aperçois que ce n'est pas évident de reprendre ce fichier et de "nettoyer" cette macro. Je me suis aperçu notamment que les modifications effectuées entre le fichier initial (celui du message 1) et la version avec retouches (celui du message 29) avait entraîné des perturbations dans l'enregistrement des différentes listes (onglet "listes").
J'en ai tiré la conclusion (peut-être hâtive) qu'il y a de réelles différences entre une macro où la procédure est enregistrée et une macro "rédigée".
De plus comme le fichier original a été fait à base de formules et d'enregistrement de macros, il est peut-être compliqué de le reprendre tel quel.
Donc, outre le fait que j'aimerais autant que possible simplifier les macros existantes de ce fichier (d'où ce fil), je vais également tenter tranquillement de reprendre ce type de fichier à la base en le traitant via VBA. Cela me donnera un objectif (type "travaux pratiques") pour me mettre au VBA car sinon je n'y arriverai pas:confused:.
Je vais donc commencer à attaquer étape par étape en n'hésitant pas à faire appel au forum lorsque je bloquerai.
Donc pour en revenir à ta proposition, bien sûr que cela m'intéresse mais dis-moi de quoi il s'agit STP.
Merci à toi:).
A+

Edit : petite précision concernant les listes placées sur l'onglet "listes" : elles ne servent pas qu'à l'onglet "création" placée dans le fichier allégé placé sur le forum, mais également aux autres feuilles de la base de données (modification d'une fiche, recherche d'information,...).
Ceci-dit, je suis conscient qu'il y a moyen de simplifier tout cela. C'est pour cela que ta proposition m'intéresse. Suites aux conseils de JNP, je suis également allé faire un tour du côté du site de JB pour jeter un œil sur l'utilisation de Dictionary qui pourrait me servir dans le cadre de la refonte du fichier sous l'angle VBA .
 
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Salut David :),
je vais également tenter tranquillement de reprendre ce type de fichier à la base en le traitant via VBA. Cela me donnera un objectif (type "travaux pratiques") pour me mettre au VBA car sinon je n'y arriverai pas:confused:.
Je vais donc commencer à attaquer étape par étape en n'hésitant pas à faire appel au forum lorsque je bloquerai.
Très bonne initiative.
Ceci dit, je m'aperçois que ce n'est pas évident de reprendre ce fichier et de "nettoyer" cette macro
Un conseil: quand tu crés du code, via l'enregistreur ou "à la main", commente le un maximum, ça prend un peu de temps au début mais cela aide énormément pour le reprendre par la suite ;).

Donc pour en revenir à ta proposition, bien sûr que cela m'intéresse mais dis-moi de quoi il s'agit STP.

En fait, une procédure "Sub" peut être, comme je l'ai dis, créée avec des arguments, un peu comme une fonction excel en fait. Elle a besoin de cela pour fonctionner.
Mais un exmple vaut mieux qu'un long discours, pas vrai?
Donc, prenons une macro quelconque:

Code:
Sub test()
If Range("A1").Value = "toto" Then
  [COLOR=red][B]Sheets("Feuil1")[/B][/COLOR].Tab.ColorIndex = [COLOR=blue][B]5[/B][/COLOR]
  [COLOR=orange][B]Range("A2")[/B][/COLOR][COLOR=black].[/COLOR]Value = [B][COLOR=olive]"titi"[/COLOR][/B]
ElseIf Range("A1").Value = "momo" Then
  [B][COLOR=red]Sheets("Feuil2")[/COLOR][/B].Tab.ColorIndex = [COLOR=blue][B]4[/B][/COLOR]
  [COLOR=orange][B]Range("A4")[/B][/COLOR].Value =[COLOR=lime][B] [COLOR=olive]"mimi"[/COLOR][/B][/COLOR]
End If
End Sub

On peut voir qu'entre les deux conditions, il est question de colorier l'onglet d'une feuille et d'écrire du texte dans une cellule. La feuille et la cellule et son contenu change en fonction de la condition. Tu remarqueras que les actions à faire sont les mêmes sauf que les "éléments" changent.
Et bien il est possible de réduire ce code en faisant appel à une procédure avec arguments.
Voici ce que devient le code du module:

Code:
Sub test()
If Range("A1").Value = "toto" Then
  Call test_arg([COLOR=red][B]Sheets("Feuil1")[/B][/COLOR], [B][COLOR=orange]Range("A2")[/COLOR][/B], [B][COLOR=olive]"titi"[/COLOR][/B], [COLOR=blue][B]5[/B][/COLOR])
ElseIf Range("A1").Value = "momo" Then
  Call test_arg([COLOR=red][B]Sheets("Feuil2")[/B][/COLOR], [COLOR=orange][B]Range("A1")[/B][/COLOR], [B][COLOR=olive]"momo"[/COLOR][/B], [COLOR=blue][B]4[/B][/COLOR])
End If
End Sub
Private Sub test_arg([COLOR=red][B]Sh As Worksheet[/B][/COLOR], [COLOR=orange][B]Cel As Range[/B][/COLOR], [B][COLOR=olive]Txt As String[/COLOR][/B], [COLOR=blue][B]Coul As Variant[/B][/COLOR])
  [COLOR=red][B]Sh[/B][/COLOR].Tab.ColorIndex = [COLOR=blue][B]Coul[/B][/COLOR]
  [COLOR=orange][B]Cel[/B][/COLOR].Value = [B][COLOR=olive]Txt[/COLOR][/B]
End Sub
test_arg est cette fameuse procédure qui est appelé, via Call, par la macro test.
Ses arguments sont: Sh, Cel, Txt, et Coul.
Quand un code peut faire quelques 1000 lignes, il y souvent des lignes de code qui se ressemblent, on y gagne en lisibilité et en lecture de code ;).
Dans ton exemple, tu verras que le tri est répété 5 fois, et le principe est le même, une bonne initiation si ça te dis.
Tu remarqueras que "Private" est écris devant "Sub". Cela signifie que la procédure ne peut être lancée que dans le module où elle se trouve et en "sous-procédure" (ne pourra pas être exécuté en premier pusiqu'elle a besoin d'arguments).

Espérant t'avoir éclairé et donné envie d'explorer un peu plus le domaine du VBA ;).

A bientôt :).
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re

Merci pour ces infos:).
Ce que j'en retiens : dans une macro avec un nombre conséquent de lignes de codes quand une même procédure se répète dans la macro
les actions à faire sont les mêmes sauf que les "éléments" changent.
, le fait d'utiliser une procédure avec arguments permet de synthétiser le code et de gagner en lisibilité. Le principe : la sub spécifie les éléments (arguments) et appelle la procédure privée qui les traite.
Est-ce cela ?
A+
 

JNP

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re le fil :),
Je ne vous avais pas abandonné, mais j'ai un peu travaillé avec david en MP ;)...
Sous 2010 64 bits, ça plante. J'ai donc fait des tests sous 2007, mais comme expliqué à David, quand on ne comprends pas les tenants et les aboutissants, c'est dur de corriger un code :eek:... Surtout qu'une bonne partie sert à préparer des listes de menus déroulants...
David étant prêt à repartir sur une base neuve, comme il ne connaissait pas vraiment les USF, je lui ai préparé une première ébauche, ce qui à terme devrait permettre de se passer de toutes les feuilles superflues :p.
Et j'en ai profité pour mettre des arguments comme Skoobi :D.
Si on peux partir sur cette nouvelle base, je pense qu'en 3 USF (nouvelle, recherche/modif et mails), tout sera dit ;).
D'abord, sur le feu, sa fermeture de fichier qui coinçait avec 3 messages. Je n'avait pas compris qu'il souhaitait quitter Excel (personnellement, je laisse toujours Excel ouvert :D) et ses collègues risquent de ne pas apprécier...
Code:
[COLOR=blue]Private Sub[/COLOR] Workbook_BeforeClose(Cancel [COLOR=blue]As Boolean[/COLOR])
[COLOR=blue]Dim[/COLOR] strDate [COLOR=blue]As String[/COLOR], Fichier [COLOR=blue]As String[/COLOR], Chemin [COLOR=blue]As String[/COLOR]
Msg = "Désirez-vous enregistrer ce fichier ?"
réponse = MsgBox(Msg, vbYesNo)
[COLOR=blue]If[/COLOR] réponse = vbYes [COLOR=blue]Then[/COLOR] ActiveWorkbook.Save
Msg = "Désirez-vous sauvegarder ce fichier ?"
réponse = MsgBox(Msg, vbYesNo)
[COLOR=blue]If[/COLOR] réponse = vbYes [COLOR=blue]Then[/COLOR]
strDate = Format([COLOR=blue]Date[/COLOR], "dd-mm-yy") & "_" & Hour(Time) & "h" & Format(Minute(Time), "00")
Fichier = Sheets("Menu").Range("E8")
Chemin = "\\Ventoux\Documents communs\CNDS\" & Fichier
[COLOR=blue]If[/COLOR] Dir(Chemin, vbDirectory) = "" [COLOR=blue]Then[/COLOR] MkDir Chemin [COLOR=green]'crée le répertoire s'il n'existe pas[/COLOR]
[COLOR=blue]If[/COLOR] Dir(Chemin & "\*.xlsm") <> "" [COLOR=blue]Then[/COLOR] Kill Chemin & "\" & Dir(Chemin & "\*.xlsm")
ActiveWorkbook.SaveAs Chemin & "\" & "fichier du_" & strDate & ".xlsm"
[COLOR=blue]End If[/COLOR]
Application.Quit
[COLOR=blue]End Sub[/COLOR]
Bonne fin de journée :cool:
 

Pièces jointes

  • New_BD_asso.xlsm
    125.1 KB · Affichages: 137
  • New_BD_asso.xlsm
    125.1 KB · Affichages: 154
  • New_BD_asso.xlsm
    125.1 KB · Affichages: 158

skoobi

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re, hello Jean-No :),
Re

Merci pour ces infos:).
Ce que j'en retiens : dans une macro avec un nombre conséquent de lignes de codes quand une même procédure se répète dans la macro , le fait d'utiliser une procédure avec arguments permet de synthétiser le code et de gagner en lisibilité. Le principe : la sub spécifie les éléments (arguments) et appelle la procédure privée qui les traite.
Est-ce cela ?
A+

Oui, c'est bien ça :).
 

david84

XLDnaute Barbatruc
Re : VBA Amélioration macro fichier association

Re
Bonsoir JN,
Tout d'abord, un grand merci pour le travail effectué:)!
Concernant la macro de fermeture, chez moi, elle ferme le classeur mais pas l'application:eek:.
J'ai vu également que tu m'avais placé une petite sub dans this workbook "application.enable.Events=True"
Quel est son rôle ?
Concernant l'USF, je trouve que c'est une très bonne idée mais que je ne maîtrise pas pour l'instant (mais cela va ma donner l'occasion de m'y mettre;)).
Une chose cependant : où sont placées les listes des 2 premiers menus déroulants présents dans l'USF ?
Je ne les vois pas:confused:.
A+
 

Discussions similaires

Réponses
7
Affichages
292
Réponses
13
Affichages
260
Réponses
1
Affichages
77
Compte Supprimé 979
C

Statistiques des forums

Discussions
311 720
Messages
2 081 898
Membres
101 834
dernier inscrit
Jeremy06510