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.

33exemple.xlsx (34.35 Ko)

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 Sub

Si 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.

Rechercher des sujets similaires à "creation comande vba complexe"