Bonjour à tous
Voila deux heures que je suis sur un problème qui ne me parait reposer que sur quelques bases techniques, mais on dirait que je suis bel et bien bloquée... Après avoir essayé, et essayé, ..., différentes méthodes, j'en fais appel à votre aide :
Je voudrai exporter dans un fichier excel certaines données contenues dans mes tables.
La table en question comprend un numéro de salarié, une date, et un lieu. Le problème est que chaque salarié apparait dans 6 enregistrements différents (à cause de la date : il me fallait un enregistrement par jour ouvrable de la semaine). Je voudrai afficher sur excel les numéros de salarié, mais n'en afficher qu'un seul pour les six enregistrements.
(précision : il me faut laisser 2 lignes vides entre chaque numéro de salarié, et commencer à la ligne 2)
Mon premier code, après moultes bidouillages, a fini par marcher :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 Dim db As DAO.Database Dim rstEmployeLieu As DAO.Recordset Set db = CurrentDb() Set rstEmployeLieu = db.OpenRecordset("T_Association_Employe_Lieu") rstEmployeLieu.MoveFirst Dim Nouveau As Boolean Dim indice As Integer Nouveau = True indice = 2 For i = 0 To rstEmployeLieu.RecordCount - 1 'Pour chaque enregistrement on vérifie si le numéro de salarié est déjà incrit dans le classeur Excel 'j sert à naviguer de ligne en ligne pour la vérification For j = 0 To rstEmployeLieu.RecordCount - 1 If (xlSheet.Cells((j * 3 + 2), 1) = rstEmployeLieu("NoSalarie")) Then '"nouveau" sert à savoir si le numéro de salarié n'a pas été encore affiché une seule fois 'si l'une des cases est égale au numéro de salarié actuel, alors ce n'est pas la première fois, donc on le met à False, et on sort de la boucle Nouveau = False Exit For End If Next j 'Si au contraire il est nouveau, on l'insert dans la feuille Excel If (Nouveau = True) Then xlSheet.Cells((indice), 1) = rstEmployeLieu("NoSalarie") indice = indice + 3 End If rstEmployeLieu.MoveNext Nouveau = True Next i
Le problème de cette méthode est qu'elle est montrueusement longue à l'exécution : pas loin d'une minute, et ce n'est que le tout premier calcul de la feuille... =/
Je me suis donc dit que "sauter" les enregistrements qui font doublon pour le numéro de salarié, bien qu'un peu plus brouillon (puisqu'il faut impérativement les entrer dans l'ordre), serait une méthode beaucoup plus rapide que de vérifier ligne par ligne. J'ai donc écrit ceci :
Là, j'avoue être perplexe : le premier MoveNext fonctionne parfaitement, mais les suivants me disent "aucun enregistrement en cours". Je ne comprends pas la logique : si je n'en mets qu'un, il fera de toute façon un deuxième MoveNext quand il passera à nouveau dans la boucle (et j'ai testé, il n'y a aucun problème dans ce cas), alors pourquoi pas là ? La seule différence est l'incrémentation du i, mais je ne vois pas en quoi ça influe sur mon Recordset...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 rstEmployeLieu.MoveFirst Dim indice As Integer For i = 0 To rstEmployeLieu.RecordCount - 1 xlSheet.Cells((i*3+2), 1) = rstEmployeLieu("NoSalarie") rstEmployeLieu.MoveNext rstEmployeLieu.MoveNext rstEmployeLieu.MoveNext rstEmployeLieu.MoveNext rstEmployeLieu.MoveNext Next i
Pitié j'implore votre aide.... T_T
Partager