IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Reclassement de données par macro ou VBA [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut Reclassement de données par macro ou VBA
    Bonjour,

    suite à un travail d'annotation vidéo, j'obtiens un tableur récapitulatif qui contient, pour chaque annotation, le temps de début, le temps de fin, la durée et la valeur de l'annotation (ex : A) en fonction de catégories fixées à l'avance (ex : Comportement1).

    Ex de données brutes :

    Temps_début----Temps_fin---Durée---Comportement1---Comportement2---Comportement3
    0--------------------60------------60--------A-----------------------------------------------------------------
    0--------------------160-----------160-----------------------------------------------------A------------------
    80------------------100------------20------------------------------A------------------------------------------
    120-----------------200-----------80-------B-----------------------------------------------------------------
    180-----------------280-----------100-----------------------------------------------------B-----------------
    220-----------------260-----------40-------------------------------B-----------------------------------------
    280-----------------320-----------40-------C-----------------------------------------------------------------
    300-----------------420-----------120-----------------------------------------------------C-----------------
    340-----------------420-----------80-------------------------------C-----------------------------------------

    Or, comme vous en conviendrez, ce type de tableur complique l'analyse descriptive...

    Je me trouve donc devant un problème de restructuration de mes données. L'idée serait de pouvoir réarranger les données en fonction d'une chronologie commune.

    Ex de structuration espérée :

    Temps---Comportement1---Comportement2---Comportement3
    0-----------A---------------------------------------------A------------------
    20---------A---------------------------------------------A------------------
    40---------A---------------------------------------------A------------------
    60---------A---------------------------------------------A------------------
    80--------------------------------A----------------------A------------------
    100------------------------------A-----------------------A-----------------
    120-------B----------------------------------------------A------------------
    140-------B----------------------------------------------A-----------------
    160-------B----------------------------------------------A-----------------
    180-------B----------------------------------------------B-----------------
    200-------B----------------------------------------------B-----------------
    220------------------------------B-----------------------B-----------------
    240------------------------------B-----------------------B-----------------
    260------------------------------B-----------------------B-----------------
    280-------C----------------------------------------------B-----------------
    300-------C----------------------------------------------C-----------------
    320-------C----------------------------------------------C-----------------
    340-----------------------------C------------------------C-----------------
    360-----------------------------C------------------------C-----------------
    380-----------------------------C------------------------C-----------------
    400-----------------------------C------------------------C-----------------
    420-----------------------------C------------------------C-----------------

    J'ai essayé plusieurs formules, principalement à partir de la fonction SI (j'ai une expérience limitée d'Excel), mais je ne trouve pas de solution pour automatiser cette restructuration (j'ai en réalité un nombre de lignes très important et un nombre élevé de catégories de comportements).
    Pouvez-vous me conseiller des fonctions ou formules qui me mettraient sur la bonne piste ? Pensez-vous qu'il soit nécessaire de passer par VBA ?

    A toutes fins utiles, je peux joindre les fichiers de mes exemples, pour ne pas avoir à les saisir.

    Je vous remercie pour tout conseil que vous pourrez m'apporter.

    Cordialement,

    Loïc.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Solution VBA avec 3 comportements en utilisant une variable tableau. (Je ne sais pas si ainsi je vous aide vraiment)

    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
    Sub Traitement()
    Dim LastLig As Long, i As Long, j As Long
    Dim N As Long, M As Long, Nb As Long
    Dim k As Byte
    Dim Tb, Res()
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        N = Application.Min(.Range("C2:C" & LastLig))
        If N > 0 Then
            M = Application.Max(.Range("B2:B" & LastLig))
            Nb = M / N + 1
            Tb = .Range("A2:F" & LastLig)
            ReDim Res(1 To Nb, 1 To 4)
     
            For i = 1 To Nb
                Res(i, 1) = N * (i - 1)
                For j = 1 To LastLig - 1
                    If Res(i, 1) >= Tb(j, 1) And Res(i, 1) <= Tb(j, 2) Then
                        For k = 2 To 4
                            If Res(i, k) = "" And Tb(j, k + 2) <> "" Then Res(i, k) = Tb(j, k + 2)
                        Next k
                    End If
                Next j
            Next i
        End If
     
        With .Range("H1")
            .Resize(1, 4) = Array("Temps", "Comportement1", "Comportement2", "Comportement3")
            .Offset(1).Resize(Nb, 4) = Res
        End With
    End With
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Bonjour,

    c'est impeccable, j'en espérais pas tant !! Avec ça, je pense pouvoir me débrouiller pour l'adapter à mes données.

    Merci beaucoup !

    Cordialement,

    Loïc.

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Citation Envoyé par mercatog Voir le message
    (Je ne sais pas si ainsi je vous aide vraiment)

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Bonjour,

    je me permets de relancer cette discussion, parce que je rencontre un problème avec un des fichiers que je dois traiter.

    Le code fourni par mercatog marchait parfaitement, jusqu'à la survenue d'une "incompatibilité de type" avec l'un de mes fichiers...

    Voici le code en question, avec en rouge, la ligne incriminée par le débogueur :

    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
    Option Explicit
    
    Sub b_Reclassement_Donnees_v2()
    
    Dim LastLig As Long, i As Long, j As Long
    Dim N As Long, M As Long, Nb As Long
    Dim LastCol As Integer, k As Integer
    Dim Tb, Res()
    
    Application.ScreenUpdating = False
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Name = "Final Data"
    
    With Worksheets("Data")
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        
        N = 20 
        If N > 0 Then
            M = Application.Max(.Range("B2:B" & LastLig)) 
            Nb = M / N + 1
            Tb = .Cells(2, 1).Resize(LastLig - 1, LastCol)
            ReDim Res(1 To Nb, 1 To LastCol - 2)
     
            For i = 1 To Nb
                Res(i, 1) = N * (i - 1)
                For j = 1 To LastLig - 1
                    If Res(i, 1) >= Tb(j, 1) And Res(i, 1) <= Tb(j, 2) Then
                        For k = 2 To LastCol - 2
                            If Res(i, k) = "" And Tb(j, k + 2) <> "" Then Res(i, k) = Tb(j, k + 2)
                        Next k
                    End If
                Next j
            Next i
        End If
          
        With Sheets("Final Data").Range("A1")
            .Resize(1, LastCol - 2).Value = Worksheets("Data").Cells(1, 3).Resize(1, LastCol - 2).Value
            .Offset(1).Resize(Nb, LastCol - 2) = Res
        End With
    End With
    
    Worksheets("Final Data").Range("A1").Value = "Temps (msec)"
    
    End Sub
    Ne maîtrisant toujours pas les variables tableau, malgré mes efforts pour y remédier, je ne trouve pas d'explication. Comme cette erreur est probablement due au fichier qui la provoque, je me permets de le joindre ici :

    Fichier.xlsx

    Je vous remercie d'avance pour toute l'aide que vous pourrez apporter, sachant que cette étape de mon traitement est la seule que je ne peux pas réaliser "à la main"...

    Loïc.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans avoir analysé le code, j'ai tendance à utiliser la fonction Len. Len(variable) = 0 ou Len(Variable)<>0 à la place de Variable = "" ou Variable <> "").
    La fonction Len() fonctionne quel que soit le type de variable (Alphanumérique ou numérique)
    Dans cet exemple, la ligne 3 renvoie un message d'erreur Incompatibilité de type alors que la ligne 2 fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim Var As Integer
     If Len(Var) Then MsgBox "Vide"
     If Var = "" Then MsgBox "Vide"
    Si tu es certain que ta variable est numérique, il est préférable bien entendu de faire le test par
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 30
    Par défaut
    Bonjour,

    si j'ai bien compris la syntaxe, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Len(Res(i, k)) = 0 And Len(Tb(j, k + 2)) <> 0 Then Res(i, k) = Tb(j, k + 2)
    Mais je rencontre toujours une incompatibilité de type... J'ai aussi tenté de modifier la déclaration de la variable k pour la passer en As Long, mais sans succès. C'est très étrange sachant que ce code a parfaitement fonctionné jusque là.

    Au passage, j'en profite pour mettre à jour le fichier d'exemple, qui ne permettait pas de tester directement le code :

    Fichier.xlsx

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-2010] Ouvrir fichier de données par macro
    Par phoenellion dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 26/06/2013, 11h26
  2. Mise à jour des données par macros.
    Par chpierro62 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 12/01/2012, 13h52
  3. envoie de donnée par mail via vba
    Par swissmade dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/08/2007, 11h43
  4. Masquer champs en mode feuille de données par macro
    Par martino_fr dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2006, 09h57
  5. [VBA-E] Problème pour enregistrer en csv (; et non ,) par macro
    Par bounette dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/12/2005, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo