Bonjour à tous !

J'avance petit à petit dans le développement de mon petit programme de suivit des activités.
Voici une petite capture d'écran :


Quand l'utilisateur clique sur le bouton "valider et enregistrer", le programme doit "compiler" les renseignements cochés et saisis par l'utilisateur pour les inscrire dans un fichier csv (pour l'instant uniquement inscrit dans un msgbox).
Voici une partie du code que j'ai essayé de réaliser à cet effet :
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
For aa = 1 To a
        ajoutlignesiaet = ""
        isvehicule = 0
        If Controls("ajoutagent" & aa).Value = 1 Then
            ajoutlignesiaet = Text1.Text & ";" & Controls("ajoutagent" & aa).Caption
            Controls("ajoutagent" & aa).Value = 0
 
            For tt = 1 To t
                If Controls("ajouttache" & tt).Value = True Then
                ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajouttache" & tt).Caption
                End If
            Next tt
                For ll = 1 To l
                    If Controls("ajoutlocalis" & ll).Value = 1 Then
                        ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajoutlocalis" & l).Caption& & ";" & Controls("ajoutqtelocalis" & ll).Text
                    End If
                Next ll
                    For vv = 1 To v
                        If Controls("ajoutvehicule" & vv).Value = 1 Then
                           isvehicule = 1
                            ajoutlignesiaet = ajoutlignesiaet & ";" & Controls("ajoutvehicule" & vv).Caption & ";" & Controls("ajouthmvehicule" & vv).Text
                            Controls("ajoutvehicule" & vv).Value = 0
                        End If 
                     Next vv
                        If isvehicule = 0 Then
                            ajoutlignesiaet = ajoutlignesiaet & ";" & ";"
                        End If 
        End If
        If ajoutlignesiaet <> "" Then
        MsgBox ajoutlignesiaet
 
        End If 'agents.
        Next aa
Petites explications sur les valeurs des variables :
a est le nombre total d'agents (comme défini dans l'exemple ci-après),
t est le nombre total de tâches
l ________________ de localisation
v________________ de véhicules

Les checkbox et optionbutton sont créés de façon "dynamique" en fonction du contenu de fichiers csv.
Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
fichier_agents = App.Path & "\liste_agents.csv"
Open fichier_agents For Input As #1
a = 0
Dim ligneagent As String
Do While Not EOF(1)
a = a + 1
Line Input #1, ligneagent
Dim nom As String
nom = Split(ligneagent, ";")(0)
Set ajoutagent = Controls.Add("vb.checkbox", "ajoutagent" & a, Frame_agents)
Controls("ajoutagent" & a).Caption = nom
A des fins de simplifications, je n'ai pas copié ici les définitions des caractéristiques width, , left, visible etc ...

Comme vous l'aurez compris, j'aimerai optimiser et simplifier le 1er code : celui qui lit l'état des objets et qui "construit" la variable ajoutlignesiaet
Comme c'est bien le cas actuellement, cette variable doit être construite comme suit :
date ; nom de l'agent ; tache effectuée ; localisation ; durée ; véhicule ; kilométres
J'ai prévu d'ajouter ensuite les matériaux et leurs quantité

Ca serait simple s'il n'y avait qu'un élément à chaque fois !
Mais là où le code se complexifie, c'est dans l'exemple bidon suivant :
Messieurs Durand et Martin ont fait de l'enrobé dans la rue de l'église pendant 2h, place de la mairie 1h et place des orangers 3h. Ils ont utilisés le véhicule 721 ATL 51 pour 8km et ils ont utilisé 3tonnes de mélange béton

Pour que les données qui seront enregistrées dans le fichier csv soit exploitables, il conviendrait de répercuter les km des véhicules et la quantité des matériaux avec une fameuse réglé de 3 : dans l'exemple ça donnerait :
06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;721atl51;((8/2)/(2+1+3))*2=1.33;mélange béton;((3/2)/(2+1+3))*2=0.5
Avec cette méthode, chaque agent aura une saisie identique.

En pratique il pourrait également être possible de grouper les km de véhicule utilisés sur une localisation sur un seul agent. De même que pour les matériaux et leur quantité. Dans l'exemple ça donnerait :
06/08/2013;DURAND Michel;enrobé;rue de l'église;2;721atl51;(8/(2+1+3))*2=2.67;mélange béton;(3/(2+1+3))*2=1
06/08/2013;MARTIN Jean;enrobé;rue de l'église;2;;;;
Le choix de l'une ou l'autre méthode sera en fonction de la faisabilité du code ! lol

Par contre là où ça se complexifie vraiment, c'est si pour une même tache, 2 agents ont utilisés 5 véhicules sur 3 localisations et ont consommé 4 matériaux différents ! J'ose même pas imaginer un code pour "compiler" un tel bordel ! mdr


Est-ce que quelqu'un qui aurait un bon sens logique et une certaine passion pour les casses-tete aurait une idée de code plus simple et plus optimisé que celui que j'ai créé ?

Merci beaucoup par avance pour votre aide !