Création d'une comande VBA complexe
Bonjour,
j'ai tableau à 4 colonnes :
TEMPS/TEMPS ECOULE/EFFACE/ACTION
Je voudrai à partir des données de ce tableau et surtout de la dernière colonne, réaliser un nouveau tableau.
La colonne action on retrouve 3 type de type de données :
1°individus :FLIP,ALDO, FK, REMS , CLINEX , KO , ZORO , 2F , COJAK , ALPHA , MERT , DIGIT , QUASI , FRER , MONO , G403 , LIPS , BOITE , ARTUR , VIN , BO , PELE , L10 , AL , M20 , NEZ , P40 , E66 , 160 , 170 , NARINE , 203 , SŒUR , PIRAT, 274, 277, EPIS, Z, A330, 331, MA, ALPHA F, DIANA, B355, 360, 370, G400, MARILIN, K431, L11, M21, O30, FOFOL, BB1, BB2, BB3
2°ACTION:SUP, MAGO, FRAPER, VOC, ATRAPER, MORDRE, POUR, PRESENTER , GENITAL , MONTE , ATAQ , SG , ALLOG, AFFI, JOUER, REPOC, TRIADE, DEF,COPU, VOISIN
3°AUTRE: D, R, ET, STOP
L’enchainement dans cette colonne est toujours (presque toujours) du type : D ou R/ACTION/INDIVIDU ou INDIVIDUS/STOP
Juste pour voisin, l’enchainement est : VOISIN/INDIVIDU ou INDIVIDUS/STOP
Je voudrais donc réaliser un nouveau tableau de ce type
D/R/ACTION/INDIVIDU/TEMPS INITIAL/TEMPS FINAL/DUREE
Le temps initiale est le temps sur la même ligne que du D ou R, le temps final est celui de STOP
Il faudrait que les actions et les individus (peu importe le nombre) soient classés automatiquement dans leur colonnes.
Je suis conscient de l’ampleur du travail, mais ne connaissant pas le langage de programmation, je ne peux rien faire. C’est pourquoi je m’excuse par avance, et vous remercie de votre aide
Basosa
Bonjour Basosa,
Juste le temps de retrouver ma boule de cristal et je t"envoie le code...
Merci pour ce post qui illumine ma journée
... Taquineries mis à part un fichier avec une partie représentative des données et quelques lignes du tableau souhaité me semble indispensable...sans garanties... Cordialement
Jules
Voilà une démonstration, j'espère que sa pourras aider.
Si non j'ai passé la journée à m'initier au langage, mais sincèrement je bute dès le début, par contre je croie avoir compris la logique, et la succession des instruction a faire, si sa peut aider:
Créer un tableau (avec les colonnes dans le dossier)
ligne par ligne analyser le contenus,
si :
D ou R coller dans le tableau dans la bonne colonne + prendre le temps et le coller dans la colonne Temps Initial
si:
un des comportement (voir liste dans le premier message) coller dans le tableau dans la bonne colonne + prendre le temps et le coller dans la colonne Temps Initiale
Si:
individus (voir liste dans le premier message) coller dans le tableau dans la bonne colonne
Si:
STOP prendre le temps et le coller dans la colonne Temps Final
Voilà sa serait la règle de base, j'aurais besoin de quelques exception mais si j'ai déjà ça c'est énorme.
Re,
j'ai tableau à 4 colonnes :
TEMPS/TEMPS ECOULE/EFFACE/ACTION
Le tableau fourni n'a que 2 colonnes : Temps (je suppose) et ACTION ... On part mal...
Le tableau fourni ne fait que 12 lignes, vu la variété des comportements décrits j'aurais espéré AU MOINS une centaine de lignes avec tout les comportements possibles représentés AU MOINS une fois, ainsi qu'un second tableau plus étoffé.
L’enchainement dans cette colonne est toujours (presque toujours) du type : D ou R/ACTION/INDIVIDU ou INDIVIDUS/STOP Juste pour voisin, l’enchainement est : VOISIN/INDIVIDU ou INDIVIDUS/STOP
Voisin étant une ACTION je ne vois aucune différence de comportement entre ce cas et les autres actions ??? Et VOISIN n'apparait pas dans le tableau fourni pour aider. 'presque toujours' est à clarifier. Ce serait bien d'avoir toutes les règles d'emblée, les exceptions risquant d'entrer en contradiction avec des règles établies 'à l'aveugle' dans le programme.
Que fait-on pour le mot ET ?
La liste commence donc forcément par D ou R ?
En attendant toutes les règles et surtout plus de données.
Jules
Désolé... je vais donc faire un tableau type avec toutes les possibilité, tout les comportements et tout les intividus.
Sa vas prendre pas mal de temps, mais je fait sa au plus vite.
Merci pour ton aide
Salut,
Voilà j'ai fait le tableau, j'espère que se seras assez précis et surtout assez claire.
Merci pour ton aide.
Bonjour Basosa,
Ci-joint un code pour réaliser les opérations demandées, sous réserve d'une bonne compréhension de ma part du dernier fichier et également des exemples précédents. J'ai trouvé en effet quelques contradictions ou erreurs dans le dernier fichiers envoyés.. Un temps dans la mauvaise colonne, ALPHA F ALPHAF ou encore APLHAF quoique les erreurs d'orthographe ne sont pas grave pour les individus. Plus grave, et cela empêchera le fonctionnement, des fautes dans les actions : l'action MAGO du 1er message est devenu AGO, on trouve FRAPER et FRAPPER, PRESENTER est devenu PRESENT. Peut être aussi deux comportements non décrits dans la zone ou il n'était censé y avoir que des comportements déjà vu.. J'espère que les vraies données ne seront pas corrompues ? (issues d'une log). Bref ce code devra être relu au niveau de la liste des actions. Le mot ET n'est toujours pas prévu (donc sera considéré comme un individu).
Donc à tester sur de vraies données et pas sur le tableau fourni (c'est pour ça que je n'envoie pas de fichier). Coller le code dans un module standard et à lancer depuis la feuille contenant les données comme dans l'exemple, c'est à dire en colonne A et B avec ligne de titre et les temps à gauche.
Option Explicit
Sub test()
'a lancer depuis la feuille contenant les données
'tableau comencant en A1 avec ligne de titre, colonne A=temps)
Dim Sh(1 To 2) As Worksheet, i&, Rw&(1 To 2), z%
Set Sh(1) = ActiveSheet
Rw(1) = Sh(1).Cells(Rows.Count, 1).End(xlUp).Row
Sheets.Add
Set Sh(2) = ActiveSheet
Rw(2) = 1
Sh(2).Cells(1, 1) = "D"
Sh(2).Cells(1, 2) = "R"
Sh(2).Cells(1, 3) = "Comportement"
Sh(2).Cells(1, 4) = "Individu"
Sh(2).Cells(1, 5) = "Temps Initial"
Sh(2).Cells(1, 6) = "Temps Final"
For i = 2 To Rw(1)
Select Case UCase(Trim(Sh(1).Cells(i, 2)))
Case "D"
Rw(2) = Rw(2) + 1
Sh(2).Cells(Rw(2), 1) = UCase(Trim(Sh(1).Cells(i, 2)))
Case "R"
Rw(2) = Rw(2) + 1
Sh(2).Cells(Rw(2), 2) = UCase(Trim(Sh(1).Cells(i, 2)))
Case "STOP"
Sh(2).Cells(Rw(2), 6) = Sh(1).Cells(i, 1)
Case "SUP", "AGO", "FRAPER", "VOC", "ATRAPER", "MORDRE", "POUR", "PRESENTER", "GENITAL", "MONTE", "ATAQ", "SG", "ALLOG", "AFFI", "JOUER", "REPOC", "DEF", "COPU", "FRAPPER", "PRESENT"
If Sh(1).Cells(i - 1, 2) <> "D" And Sh(1).Cells(i - 1, 2) <> "R" Then Rw(2) = Rw(2) + 1
Sh(2).Cells(Rw(2), 5) = Sh(1).Cells(i, 1)
Sh(2).Cells(Rw(2), 3) = UCase(Trim(Sh(1).Cells(i, 2)))
Case "VOISIN", "TRIADE"
If Sh(2).Cells(Rw(2), 4) = "" Then Sh(2).Cells(Rw(2) - 1, 4) = ""
Rw(2) = Rw(2) + 1
Sh(2).Cells(Rw(2), 3) = UCase(Trim(Sh(1).Cells(i, 2)))
Sh(2).Cells(Rw(2), 5) = Sh(1).Cells(i, 1)
Case Else
If Sh(2).Cells(Rw(2), 4) <> "" Then Rw(2) = Rw(2) + 1
Sh(2).Cells(Rw(2), 4) = UCase(Trim(Sh(1).Cells(i, 2)))
z = 1
Do While Sh(2).Cells(Rw(2) - z, 4) = ""
Sh(2).Cells(Rw(2) - z, 4) = Sh(2).Cells(Rw(2), 4)
z = z + 1
Loop
End Select
Next i
Sh(2).Columns("A:F").AutoFit
End SubSi tu repères des dysfonctionnements ou des cas non prévu, merci de transmettre alors un fichier avec le tableau original, le tableau obtenu par la macro et le tableau souhaité. Cordialement
Jules
Je te remercie pour tout ça, c'est vraiment énorme, s'il y a quoi que se soit hésiterais pas a venir poser des questions, vers le milieu de la semaine.
Encore milles merci vive ce forum.