Je suis sur qu'on pourrait faire cela en une seule passe avec une requête et une jointure mais ta solution n'est pas mauvaise non plus.
Quelques suggestions :
* Pour ton test
je te suggère de le remplacer par
if rvv.recordcount=0 then
car tester si un objet recordset est égale à une chaîne de caractères même si cela marche (as-tu exécuter ce code ?) ce n'est pas très propre.
Attention avec RecordCount, si tu ne fais pas ObjetRecordset.movelast, recordcount renvoit 0 s'il n'y a pas d'enregistrement et 1 si il y a 1 ou des enregistrement. Si tu fais ObjetRecordset.movelast tu as alors le nombre exact d'enregistrements, ne pas oublier de faire un ObjetRecordset.movefirst après si tu veux lire le contenu des enregistrements.
* Pour
1 2 3 4 5 6
| ' On constitue la requête qui choisi le champ à compter et à utiliser
Set rsc = bd.OpenRecordset("SELECT count(NumTypStat) FROM TypeStatistique ", dbOpenForwardOnly, dbReadOnly)
' On incrémente jusqu'à la valeur maximum
For Each fld In rsc.Fields
NombStat = fld.Value
Next |
rsc ne devrait contenir qu'un seul enregistrement et un seul champ donc le for each fld est un peu 'over-killing'.
Si tu copies ton SQL dans l'éditeur de requête tu vas voir le nom généré automatiquement par Access et tu devrais pouvoir l'utiliser en faisant
nomStat=rsc![NomDuChamp].
* pour la sélection par date il suffit de mettre :
where format(Date(),"yyyy-mm")=format([DateDebutStat],"yyyy-mm")
Cela va t'éviter d'avoir à calculer la date de fin de mois.
* Quand tu as fini d'utiliser un objet Database ou Recordset il est conseillé de le fermer et de le désalouer explictement. Normalement Access s'en occupe mais c'est mieux si tu lui dit de le faire.
donc j'ajouerai :
1 2 3
| rsc.close: set rsc=nothing
rvv.close: set rvv=nothing
bd.close:set bd=nothing |
avant le exit sub.
A+
Partager