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