Bonjour,
J'utilise ACCESS depuis peu pour un stage de 2 mois et bien qu'ayant de bonnes bases en Java je n'ai jamais touché au VBA jusque là.
Bien sur je pourrais commencer par les bases et progressivement m'améliorer jusqu'à résoudre moi même mes problèmes cependant le temps manque et j'ai un besoin bien précis concernant une table d'une base de données et je pense avoir trouvé des éléments de réponse.
Le problème reste tout de même la syntaxe pour réaliser ma macro VBA qui va agir sur ma table dans ACCESS.
Pour rentrer dans le vif du sujet voici le cadre général:
J'ai une table ACCESS "Table Geo" qui comporte un certain nombre de champs. Chaque ligne représentant des informations sur des interventions (l'inspecteur, le numéro d'intervention, le lieu...) et notamment le nombre d'UO (heures d'interventions) et la date (qui peut être "Du...au..." ou "Entre Le...et le..." si les choses ne sont pas claires ou que l'intervention a durée plusieurs jours).
Mon objectif est de repérer les lignes de ma tables qui on un nombre d'UO supérieur à 8 (une journée de travail étant de 8h) et de dupliquer la ligne d'intervention en faisant des paquets de 8UO max. Bien sur afin de ne pas avoir des lignes strictement identiques j'incrémente la valeur d'un champ "ORDRE_NUMERO" initialement à 1 dans toute la table.
Ex:
J'ai initialement dans ma table "Table Geo" une intervention placée entre 2 dates dont le nombre d'UO est de 18.
Je souhaite à l'issue du fonctionnement de ma macro avoir à la place 3 lignes identiques à l'exception que:
_ La première ai: [ORDRE_NUMERO] = 1 et [UO]=8
_ La seconde ai: [ORDRE_NUMERO] = 2 et [UO]=8
_La troisième ai: [ORDRE_NUMERO] = 3 et [UO]=2
Les requêtes SQL simplifiées d'ACCESS ne permettent pas de faire des boucles mais uniquement des requêtes de sélection, mise à jour et ajout.
Pour info j'ai déja rajouté une colonne [Int UO/8] qui donne la partie entière du nombre d'UO/8.
Or en pseudo code voila ce dont j'ai besoin:
_Pour i variant de 1 à Max[Int UO/8] faire:
_Sélectionner dans Table Geo les interventions dont [Int UO/8]>=i
_Les copier dans une table Tampon
_Incrémenter [ORDRE_NUMERO] dans cette table tampon
_Soustraire 8*i à [UO]
_Ajouter cette table Tampon à la table initiale "Table Geo"
Fin de la boucle
_Sélectionner dans la Table Geo les interventions dont le nombre d'UO est strictement supérieur à 8 et les remplacer ce nombre par 8 (afin d'avoir le [UO]=8 quand [ORDRE_NUMERO]=1 pour des interventions de plus de 8 UO comme dans l'exemple ci-dessus).
J'espère ne pas avoir fait d'erreur de logique.
Et maintenant la partie marrante pour ceux qui s'y connaissent un minimum en VBA, mon code à ce jour directement copié de Visual Basic:
PS: ceci est issu de copier-collers de différents forums et d'un peu de pseudo code donc désolé si ça pique un peu les yeux mais j'y ai mis de la bonne volonté
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 Option Compare Database '------------------------------------------------------------ ' Macro11 ' '------------------------------------------------------------ Function Macro11() On Error GoTo Macro11_Err ' Macro qui Duplique les lignes de la Table "Table Geo" d'interventions supérieures à 9 UO en les découpant par paquets de 8 UO et en incrémentant ORDRE_NUMERO 'Déclaration des variables Dim MonSql As String Dim Db As DAO.Database Dim Tampon As DAO.Recordset Ouverture de la base de données Set Db = CurrentDb For i = 1 To Max 'max de [Table Geo].[Int UO/8] 'Création d’une requête SQL en mode Texte qui sélectionne les interventions dont le nombre d'UO est supérieur à 9 et dont le nombre de paquets de 8UO est donné par l'objet MonSql = "SELECT * FROM Table Geoconcept WHERE ((([Table Geo].UO)>9) AND (([Table Geo].[Int UO/8])<=" & i & "))" * 'Ouverture du Recordset Set Tampon = Db.OpenRecordset(MonSql) 'Modifier le numéro d'ordre avant l'injecter dans la Table Geoconcept Tampon.Edit Tampon ![ORDRE_NUMERO] = i + 1 Tampon.Update 'Fonction de copie de la table Tampon vers Table Geo Sub CopieTampon() ' Création des deux Recordsets Dim myRS1 As New DAO.Recordset Dim myRS2 As New DAO.Recordset myRS1.Open "Tampon" myRS2.Open "Copie de Table geoconept", CurrentProject.Connection, adOpenDynamic, adLockOptimistic ' Parcours du RS pour ajouter à table1 (tout en supprimant de table1) Do Until myRS1.EOF With myRS2 .AddNew Array("Champ1", "Champ2", "Champ3"), _ Array(myRS1("Alpha"), myRS1("Beta"), myRS1("Gamma")) 'là tout est faut, il faut adapter mais je ne sais pas trop comment!!!! .Update End With 'On vide la table Tampon myRS1.Delete myRS1.MoveNext Loop Il manque ce qui concerne la troncature des champs restant avec [ORDRE_NUMERO] = 1 et [UO]>8 mais s'il ne me reste plus que ça à faire je pourrai même le faire dans une requête après la macro ' Fermeture des Recordsets myRS1.Close myRS2.Close Set myRS1 = Nothing Set myRS2 = Nothing End Sub End If Macro11_Exit: Exit Sub Macro11_Err: MsgBox Error$ Resume Macro11_Exit End Sub
Merci de m'apporter un coup de pouce pour arriver à mes fins![]()
Partager