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 :

Vba Fusion d'un ensemble de colonnes [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut Vba Fusion d'un ensemble de colonnes
    Bonjour,

    Avant toute chose, j'ai déja regardé pas mal de discusion sur ma question mais je n'ai pas vraiment compris comment cela marchait (je débute en vba).

    Pour résumer mon problème, je dispose d'une feuille contenant : 1er colonne : des id (sous forme d'int) , 2ieme colonne des int (nombres de SMS), 3 ième colonne des int (nombre de requetes FTP), et une 4iem qui est la somme du nombre de SMS et de FTP (int).
    Ces colonnes sont pour un jour donné. Ce schema se répete à peu près 50 fois . (id,int,int,int, id,int,int,int, id,int,int,int .......).
    Ce que je voudrais faire ,et que j'arrive pas du tout à faire, c'est réussir à fusionner toutes les colonnes id (sachant que ces id ne sont pas forcement les même en fonctions des jours) et de faire la somme de leurs valeurs des SMS,des FTP. Le tout sur 3 colonnes et grâce à une macro.

    Si quelqu'un pouvait m'aiguiller sur une marche a suivre ca serai super
    Merci d'avance pour les éventuelles réponses.

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Bonjour,
    Je n'ai pas tout à fait compris la construction de ta feuille. Pourrais-tu nous transmettre une copie d'écran pour que nous voyions à quoi cela ressemble?
    S'agit-il de prendre n tableaux qui sont les uns à côté des autres pour les mettre les uns en-dessous des autres? Et ensuite de faire une étude statistique de ce tableau (nombre de SMS par ID etc...)?

  3. #3
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Merci de cette réponse super rapide.

    Ci-joint un bout de l'ensemble de données que je possède ( il y a beaucoup plus de lignes et de colonnes).Chaque 4drinome correspond en fait à un jour ( dans le screen il y a 4 jours)

    J'aimerai bien avoir une colonne avec tout les id,sans doublons, une autre avec la sommes de ses SMS et une autre avec celle des FTP
    Images attachées Images attachées  

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Voilà ce que je te propose de faire :
    1. De tous ces tableaux n'en faire qu'un seul
    2. Faire un tableau croisé dynamique pour connaître la somme des SMS (et autres) par ID

    Maintenant, tu vas me dire : oui, mais comment ?
    Avant de te donner des pistes, j'au moi-même des questions :
    • Le nombre de lignes par tableau est-il toujours le même?
    • Le nombre de tableaux dans ton document est-il toujours le même?


    1. On peut déjà commencer par écrire une méthode qui à partir d'une colonne donnée, copie le tableau qui commence à cette colonne et le colle à la suitedu premier tableau. (par exemple, si on lui donne colonne E, elle va copier le tableau de E2 à H5 à la suite du tableau qui commence en A1).
      Supposons qu'on ne connaît pas à l'avance le nombre de lignes dans le tableau. Pour connaître la dernière ligne non vide de la colonne A (colonne n° 1) on utilise :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Dim derLig As Long
      derLig = Cells(Rows.Count, 1).End(xlUp).Row
      Pour copier, on utilise:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Range("A1:A10").Copy destination:=Range("B1")
      Ceci copie les cellules A1 à A10 et les colles à partir de la cellule B1.
      Pour avoir la première cellule vide de la colonne A, on utilise :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
      On cherche la dernière cellule non vide et on se décale d'une ligne
      Je préfère t'aider à écrire le code, plutôt que te le donner sans que tu le comprennes, alors voici une aide :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      Sub copierTableau(col As Long)
          Dim derLig As Long     'dernière ligne du tableau
          Dim celColle As Range      'cellule où nous allons coller
       
          '1. trouver derLig du tableau
          '2. trouver la cellule où l'on doit coller
          '3. Copier-coller
      End Sub
      Essaie de compléter et reviens vers nous si tu as encore du mal
    2. Une fois qu'on a une méthode qui permet de copier-coller un tableau, on peut faire une méthode qui copie-colle tous les tableaux. Pour cela, il faut faire une boucle sur l'ensemble des tableaux et à chaque fois appeler la méthode qui copie-colle un tableau.
      On sait que les tableaux commencent toutes les 4 colonnes, donc il suffit de faire une boucle sur toutes les colonnes à partir de la colonne E et avec un pas de 4.
      Boucle avec un pas de 4 :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      For i = 1 to 13 Step 4
          MsgBox i
      Next i
      A comprendre et compléter :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      Sub copierTout()
          Dim colVide As Long     'première colonne vide (première colonne sans tableau) --> on s'arrêtera ici
          '1. Trouver la première colonne vide (inspire toi du code pour trouver la première ligne vide)
          '2. Faire une boucle avec un pas de 4 de la colonne 5 (E) à colVide - 4
          '3. Dans la boucle appeler la méthode pour copier un tableau
      End Sub
    3. On fera un tableau croisé dynamique à parti du tableau final. Pour connaître le code correspondant à la création d'un TCD : utilise l'enregistreur de macro. N'oublie pas d'adapter le code obtenu, en particulier pour trouver la bonne plage de cellules source.
      On fera une méthode permettant de créer un TCD à partir du tableau final.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      Sub creationTCD()
          Dim derLig As Long    'dernière ligne du tableau
          '1. chercher la dernière ligne du tableau
          '2. Créer un TCD avec comme plage source : A1:DderLig
      End Sub
    4. On fera une méthode générale qui appelera à la suite la méthode qui copie tous les tableaux, puis la méthode qui fait le TCD


    J'espère que tu pourras bien avancer avec cela

  5. #5
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Merci beaucoup pour ton message ( et désolé de mon temps de réponse ).

    Avant de te donner des pistes, j'au moi-même des questions :

    Le nombre de lignes par tableau est-il toujours le même?
    Le nombre de tableaux dans ton document est-il toujours le même?
    Le nombre de ligne par tableau n'est pas toujours le même.
    Le nombre de tableau n'est pas toujours le même non plus.

    Après pour une meilleur lisibilité je vais essayé de faire un résultat comme ca :

    colonne id balise ( sans les doublons) | colonne MSG Jour 1 ( contenant 3colonnes : 1 SMS, 1FTP, 1 Somme des Messages) | colonne MSG Jour 2 ( contenant 3colonnes : 1 SMS, 1FTP, 1 Somme des Messages) ..... |colonne Finale ( contenant 3colonnes : 1 SMS contenant la somme des SMS, 1FTP contenant la somme des FTP, 1 contenant la somme des Somme des Messages)

    Je vais essayé tout ca et je reviens vers toi pour te dire ce qu'il en retourne

  6. #6
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Ca avance bien, j'arrive à avoir ma liste d'id avec les 3 colonnes par jour (SMS,FTP,TT).
    Parcontre je fais face à un problème de taille : La macro prends vraiment beaucoup trop de temps : 40sec a peu pres pour 9 colonnes de traitements.
    Quelqu'un aurait il des conseils d'optimisation de code ? (j'ai vu certains poste qu'on pouvait optimiser grâce aux Variances :
    https://www.developpez.net/forums/d1...on-d-code-vba/
    mais j'avoue que j'ai du mal à l'appliquer à mon code)

  7. #7
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Pourrais-tu nous montrer le code que tu as pour l'instant, stp? On pourra mieux t'aider.

  8. #8
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Voila le code ( j'ai enlevé la partie FTP et TT car c'est la même chose que SMS et pour une meilleure lisibilité) :


    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
    Sub CopierTableauTry()
     
        Application.ScreenUpdating = False ''''' inhib le rafraichissement automatique
        ReDim ObjcCell(1) As Long   ''''' tableau qui va contenir les id
        Dim col As Long, col2 As Long, col3 As Long, col4 As Long
        Dim nbColonne As Integer, i As Integer
     
        '''''Donne le nombre de colonne'''''
        nbColonne = Cells(1, Cells.Columns.count).End(xlToLeft).Column
     
        ObjcCell(0) = 55555
        col = 1 ''''' Colonne id
        col2 = 2 ''''' Colonne SMS
        col3 = 3 ''''' Colonne FTP
        col4 = 4 ''''' Colonne TT
     
        '''''On collecte l'ensemble des identifiants de balise, et sans doublon
        While col <= nbColonne
            Idcompare col, ObjcCell()
            col = col + 4
        Wend
     
        i = 2
        While col2 <= nbColonne
            SMScompare col2, i
            col2 = col2 + 4
            i = i + 3
        Wend
     
        i = 3
        While col3 <= nbColonne
            FTPcompare col3, i
            col3 = col3 + 4
            i = i + 3
        Wend
     
        i = 4
        While col4 <= nbColonne
            Totalcompare col4, i
            col4 = col4 + 4
            i = i + 3
        Wend
     
    Application.ScreenUpdating = True
     
    End Sub
    J'ai mis 55555 au tableau pour l'initialisé et faire que ca plante pas dans la partie Id, je sais que c'est pas très joli mais j'ai pas trouvé d'autre moyen sur le coup


    Pour les id :
    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
    Sub Idcompare(col As Long, ObjcCell() As Long)
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''
        ''''''''                ID                 ''''''''
     
        Dim derLig As Long, derLig2 As Long
        Dim i As Integer, j As Integer
        ''''' Boolean permettant de vérifier si l identifiant existe dans notre tableau (False : existe dedans)
        Dim boo As Boolean
     
     
        derLig = Sheets("Feuil1").Cells(Rows.count, col).End(xlUp).Row
     
        j = 2
        For Each cellule In Range(Cells(j, col), Cells(derLig, col))
            boo = True
            i = 0
            Do While Not (i = UBound(ObjcCell))
            '''''Si la valeur de la cellule appartient au tableau :
                If cellule.Value = ObjcCell(i) Then
                    boo = False
                    Exit Do
                End If
                i = i + 1
            Loop
            If (boo = True) Then
                    derLig2 = Sheets("Feuil2").Cells(Rows.count, 1).End(xlUp).Row
                    cellule.Copy Destination:=Sheets("Feuil2").Cells(j, 1)
                    ReDim Preserve ObjcCell(UBound(ObjcCell) + 1) '''''On redimentionne le tableau (+1)
                    ObjcCell(UBound(ObjcCell)) = cellule '''''On ajoute au tableau le nouvel Id
            End If
            j = j + 1
        Next cellule
     
    End Sub
    Pour les SMS :
    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
    Sub SMScompare(col2 As Long, alpha As Integer)
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''
        ''''''''                SMS                 '''''''
     
     
        derLig = Cells(Rows.count, col2).End(xlUp).Row  ''''' derniere ligne de la colonne dans Feuil1
        derLig2 = Sheets("Feuil2").Cells(Rows.count, 1).End(xlUp).Row ''''' derniere ligne de la colonne dans Feuil2
     
        ''''''''Dim rg As Range
        ''''''''Dim v As Variant
        ''''''''Set rg = Worksheets("Feuil2").Range("A2 : A" & derLig2)
        '''''Sheets("Feuil2").Range("A2 : A" & derLig2)
        ''''''''v = rg
        j = 2
     
        For Each cellule2 In Range(Cells(j, col2), Cells(derLig, col2))
            boo = True
            i = 0
              For Each vnull In Sheets("Feuil2").Range("A2 : A" & derLig2)
                If cellule2.Offset(0, -1).Value = vnull.Value Then
                ''''''
                    cellule2.Copy Destination:=Sheets("Feuil2").Cells(vnull.Row, alpha)
     
                    Exit For
                End If
                Next vnull
            '''''j = j + 1
        Next cellule2
    End Sub
    Ce code marche mais il est trèèèèèèès long à s'exécuter

  9. #9
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    J'ai l'impression que tu t'es embarqué dans qqc de beaucoup plus compliqué que ce que je t'avais proposé.
    Es-tu sûr d'avoir compris l'intérêt du tableau croisé dynamique? En effet, si je comprends bien ton code, tu essaies de mettre toutes les données d'un même identifiant sur une même ligne (pour les sommer à la fin, j'imagine). Du coup, tu fais une liste sans doublons d'identifiant, et identifiant par identifiant, tu cherches ses données.
    Le TCD te permet d'éviter tout cela et d'être beeaucoup plus rapide :
    1. Mettre toutes tes données les unes en dessous des autres sans essayer de regrouper les données par identifiant --> il s'agit seulement de copier-coller tous tes tableaux (sans les en-têtes) à la suite en dessous du premier tableau.
    2. Créer un TCD à partir du nouveau tableau --> le TCD va regrouper tout seul les données par identifiant.

    Relis le message où je t'explique tout cela.

    Néanmoins, quelques commentaires sur ton code, pour la culture.
    1. Quand on cherche la cellule dont la valeur est une valeur donnée, on ne fait pas une boucle sur toutes les cellules pour comparer la valeur de la cellule avec la valeur cherchée. Il y a plus efficace et moins long. Si la cellule est sur une plage de cellules, on utilise la méthode Find. Si on cherche la ligne de la cellule, connaissant la colonne, on peut utiliser la méthode Application.Match. Dans ton cas, on peut utiliser Application.Match. Par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Dim i As Long
      i = Application.Match(Range("A1").Value, Range("B:B"), 0)
      Ici, on cherche la ligne pour laquelle la valeur de A1 apparaît dans la colonne B. Ceci renvoie une erreur si on ne trouve pas de valeur.
    2. Ces deux codes sont équivalents :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      Dim i As Integer
      '1.--------------------
      i = 1
      While i <= 5
          MsgBox i
          i = i + 1
      Wend
       
      '2.--------------------
      For i = 1 To 5
          MsgBox i
      Next i
      Cependant la boucle For paraît plus appropriée, car elle intialise et incrémente i de façon "automatique". C'est le but de la boucle For.
      Même remarque pour des boucles Do While.
    3. Ces deux codes sont équivalents :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      '1.--------------------
      Do While Not (i = UBound(ObjcCell))
          If cellule.Value = ObjcCell(i) Then 
              boo = False
              Exit Do
          End If
          i = i + 1
      Loop
       
      '2.--------------------
      While Not (i = UBound(ObjcCell)) And boo = True
          If cellule.Value = ObjcCell(i) Then boo = False
          i = i + 1
      Wend
      Mais le deuxième me paraît un peu plus simple, du moins plus léger.
    4. En ce qui concerne l'intialisation de ObjcCell, pour éviter d'avoir une erreur, il suffit que dans ta méthode Idcompare, tu ajoutes une condition si le tableau est vide et que tu écrives un autre traitement dans ce cas.
    5. Quand tu créés le tableau ObjcCell, tu écris au fur et à mesure les valeurs composant ce tableau dans des cellules. Il vaut mieux que tu constitue tout le tableau sans écrire les valeurs dans la feuille. Ensuite, une fois que tu as écris tout le tableau, tu "copies" toutes les valeurs dans la feuille, d'un coup --> http://silkyroad.developpez.com/vba/tableaux/#LI :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Range("A1:A10").Value = monTableau
      En supposant bien sûr qu'il y a 10 éléments dans le tableau.
    6. Tu as mélangé 2 types de boucle For (boucle For et boucle For Each). Tu écris quelque chose du type :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      j = 2
      For Each cellule In Range(Cells(j, col), Cells(derLig, col))
          MsgBox cellule.Row
          j = j + 1
      Next cellule
      La plage de cellule dans laquelle on se "déplace" ne devrait pas varier pendant la boucle. La syntaxe "For Each" indique que cellule va prendre toutes les instances de la plage indiquée après "In".
      Soit tu écris :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      For Each cellule In Range(Cells(2, col), Cells(derLig, col))
          MsgBox cellule.Row
      Next cellule
      Soit tu écris :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      For j = 2 To derLig
          MsgBox Cells(j, col).Row
      Next j

    Ceux sont des remarques par rapport à ton code, mais je te conseille de procéder autrement (cf. le début de mon message).

  10. #10
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Petite question, le tableau que tu donnes en exemple dans le post #3 montre qu'il n'y a aucune cellules et lignes vides,
    est ce le cas dans la réalité ?
    Le nombre de lignes est il identiques entre chaque jour de rajouter ? (puisque les données son rajouter toutes les 4 colonnes vers la droite)
    Pourquoi le jours (les 4 colonnes) ne sont pas rajouter les uns en dessous des autres ?? Est ce une macro qui fait ça ?

    Edit : j'ai bien une petite idée mais j'attends le retour …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  11. #11
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Salut

    @riaolle :

    Je n'ai pas appliqué le système que tu m'as proposé car j'ai pensé que les mettres comme j'ai fait me permet apres de mettre un code couleur( j'ai réussis a le faire aujourd'hui ^^) ce qui me permet de voir concretenant et rapidement ce qui ces passé chaque jour.

    Quand on cherche la cellule dont la valeur est une valeur donnée, on ne fait pas une boucle sur toutes les cellules pour comparer la valeur de la cellule avec la valeur cherchée. Il y a plus efficace et moins long. Si la cellule est sur une plage de cellules, on utilise la méthode Find. Si on cherche la ligne de la cellule, connaissant la colonne, on peut utiliser la méthode Application.Match. Dans ton cas, on peut utiliser Application.Match. Par exemple :
    Je viens de changé mon code,grâce a ta méthode je n'ai plus besoin d'un tableau, après ca rame toujours beaucoup
    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
    Sub Idcompare(col As Long)
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''
        ''''''''                ID                 ''''''''
     
        Dim derLig As Long, derLig2 As Long
        Dim i As Integer, j As Integer
        ''''' Boolean permettant de vérifier si l identifiant existe dans notre tableau (False : existe dedans)
        Dim boo As Boolean
        Dim valuerEx As Variant, valuecel As Long
     
     
        derLig = Sheets("Feuil1").Cells(Rows.count, col).End(xlUp).Row
        j = 2
        For Each cellule In Range(Cells(j, col), Cells(derLig, col))
            derLig2 = Sheets("Feuil2").Cells(Rows.count, col).End(xlUp).Row
            valuerEx = Application.Match(cellule.Value, Worksheets("Feuil2").Range("A1:A" & derLig2), 0)
            If IsError(valuerEx) Then
                    derLig2 = Sheets("Feuil2").Cells(Rows.count, 1).End(xlUp).Row
                    cellule.Copy Destination:=Sheets("Feuil2").Cells(j, 1)
            End If
            j = j + 1
        Next cellule
     
    End Sub
    Cependant la boucle For paraît plus appropriée, car elle intialise et incrémente i de façon "automatique". C'est le but de la boucle For.
    Même remarque pour des boucles Do While.
    Je ne peux pas appliqué ca car je dois l'incrémenter de 4 et avec le next ca ne le permet pas ( sauf si on peut faire : Next i+4 ( ce qui voudrait dire qu'on incremente de 4 ou de 5 ?))

    Je te remercie énormement de tes conseils


    @RyuAutodidacte Normalement il n'y a pas de vide.
    Pour ce qui est de l'ajout j'ai créé une autre macro qui me genere a partir d'autre fichiers excel le format : id|SMS|FTP|TT|id|SMS .....

    Voila voila

  12. #12
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Je viens de calculer le temps d'execution : 11 minutes ....
    je sais pas quoi faire ='(

  13. #13
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Attention tu melanges encore une fois les deux types de boucle For : relie mon point 6. dans mon message precedent. De plus, tu calcules 2 fois derLig2, une fois suffit
    derLig n'est-il pas la dernière ligne de la colonne A en Feuille 1? Revoie ce que valent derLig et derLig2.
    Dans le cas où on ne trouve pas l'ID (cas où la condition If est vérifée), sur quelle ligne en Feuil2 veux-tu coller? Est-ce bien Feuil2 que tu veux coller?
    Quand tu exécutes le code que tu as maintenant, est-ce que ça fait vraiment ce que tu veux obtenir à la fin?
    Tu n'as plus besoin de la variable boo.
    Quelle est la feuille active? Car lorsque tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each cellule In Range("A1:A10")
        '...
    Next cellule
    la boucle s'effectue sur les cellules A1:A10 de la feuille active. Il faut ajouter en "préfixe" la feuille, si tu ne veux pas que cela s'effectue sur la feuille active, mais sur une autre feuille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Idcompare(col As Long)
     
        Dim derLig As Long, derLig2 As Long
        Dim i As Integer, j As Integer
        Dim valuerEx As Variant, valuecel As Long
        derLig = Sheets("Feuil1").Cells(Rows.count, col).End(xlUp).Row
     
        For Each cellule In Range(Cells(2, col), Cells(derLig, col))
            derLig2 = Sheets("Feuil2").Cells(Rows.count, col).End(xlUp).Row
            valuerEx = Application.Match(cellule.Value, Worksheets("Feuil2").Range("A1:A" & derLig2), 0)
            If IsError(valuerEx) Then cellule.Copy Destination:=Sheets("Feuil2").Cells(cellule.Row, 1)
        Next cellule
     
    End Sub
    Je ne peux pas appliqué ca car je dois l'incrémenter de 4 et avec le next ca ne le permet pas ( sauf si on peut faire : Next i+4 ( ce qui voudrait dire qu'on incremente de 4 ou de 5 ?))
    On peut incrémenter de 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 13 Step 4
        MsgBox i
    Next i
    Affiche les chiffres 1;5;9;13. Par défaut, une boucle For à un pas de 1 (Step 1).

  14. #14
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Attention tu melanges encore une fois les deux types de boucle For : relie mon point 6. dans mon message precedent.
    Oui effectivement, j'ai corrigé le tir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 13 Step 4
        MsgBox i
    Next i
    Oki cool :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For col = 1 To nbcolonne Step 4
            Idcompare col
        Next col
    Je lance mes macros a partir de la feuille 1 ( celle où il y a id|SMS|FTP|TT|id|....) et ca va me generer l'affichage voulu dans la feuille 2.

    Sinon, j'obtiens bien ce que je veux (enfin je crois maintenant j'ai le doute) mais c'est assez lent (11 minutes ). Après je ne sais pas trop si cst à cause de mon code ou des données ( j'ai 90 colonnes et à peu près 1020 lignes)

  15. #15
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,

    désolé pas très présent vu le peu de temps que j'ai et j'avoue avoir lu le post en diagonal mais en me basant sur le post #1 et #3 voilà ce que je propose:
    2 macros dont l'une fait partie d'un post auquel j'avais répondu (je n'ai pas fait les pointages sur la 1ère macro mais sur mes tests tout est fait sur la même feuille)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Donnees()
    Dim Rg As Range, DL&
     
    Application.ScreenUpdating = False
    For i = 5 To Cells(1).CurrentRegion.Columns.Count Step 4
        DL = Cells(Rows.Count, 1).End(xlUp)(2).Row
        Set Rg = Cells(2, i).Resize(Cells(Rows.Count, i).End(xlUp).Row - 1, 4)
        Range("A" & DL).Resize(Rg.Rows.Count, Rg.Columns.Count).Value = Rg.Value
    Next
    Cells(1).CurrentRegion.Offset(, 4).Clear
    Application.ScreenUpdating = True
    Set Rg = Nothing
    SommeDoublons
    End Sub
    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
    Sub SommeDoublons()
    Dim cLig As New Collection, c As Byte, L&, R&, VA, VR, X
        With Feuil1
            VA = .Cells.CurrentRegion.Value
            ReDim VR(1 To UBound(VA) - 1, 1 To 4)
            ReDim X(1 To UBound(VA) - 1)
        For R& = 2 To UBound(VA)
                X(R - 1) = VA(R, 1)
                On Error Resume Next
                L = cLig(X(R - 1))
                On Error GoTo 0
            If L Then
                VR(L, 2) = VR(L, 2) + VA(R, 2)
                VR(L, 3) = VR(L, 3) + VA(R, 3)
                VR(L, 4) = VR(L, 4) + VA(R, 4) '
            Else
                L = cLig.Count + 1
                cLig.Add L, X(R - 1)
                For c = 1 To 4:  VR(L, c) = VA(R, c):  Next
            End If
                    L = 0
        Next
            If cLig.Count < UBound(VR) Then
                .Range("A2:D2").Resize(cLig.Count).Value = VR
                .Rows(cLig.Count + 2 & ":" & UBound(VA)).Delete
            End If
        End With
    Set cLig = Nothing
    End Sub
    Le lien de la 2ème macro : https://www.developpez.net/forums/d1...s/#post8675891

    Edit : Re, pour expliquer le principe :
    Le 1er code permet de créer le tableau en mettant l'ensemble des donnée de la colonne de 1 à 4 (A à D), les données se trouvant déjà sur les colonnes A à D ne bougent pas,
    seul les données commençant à partir de la 5è colonne (E), s'ajoutent à la suite du tableau principal considéré sur les 4 premières colonnes (A à D).
    Bien sur, on se retrouve avec les doublons, c'est la qu'intervient la 2ème macro qui va supprimer les doublons et en même temps faire les sommes correspondantes (la 2ème macro est appelée par la 1re macro)
    Donc tout se fait sur la même feuille, il faudra juste préciser les pointages feuille sur les 2 macros

    Pour ce qui est de l'ajout j'ai créé une autre macro qui me genere a partir d'autre fichiers excel le format : id|SMS|FTP|TT|id|SMS .....
    Cette fameuse macro qui te génère les données à partir d'autres fichiers pourrait le faire à partir de la colonne 5. Pourquoi ?
    Car le code que j'ai fait sur la 1re macro peut te rassembler l'ensemble des données sur les 4 premières colonnes à la suite des données déjà traiter pour compléter avec les nouvelles données les sommes et ceux sans doublons avec la 2ème macro.

    Voilà

    Edit 2 : la 2éme macro "SommeDoublons" a été adapter au contexte du post, celle se trouvant sur le lien étant légèrement différente pour un autre traitement de données.
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  16. #16
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    @RyuAutodidacte Merci pour ton aide ( et tu n'as pas besoin de t'excuser ! ).
    En Fait depuis le post #3 pas mal de chose on changé, notemanet sur ma vision du rendu final ( la somme de l'ensemble n'est plus une priorité).
    Mais je pense que je vais essayé d'appliquer tes macros dans une 3ieme Feuille pour donner une autre vision des résultats.

    Pour ce qui est des problèmes de lenteurs je pense faire comme cela :

    les macros que j'ai ne devront être utilisé qu'à l'initiation. Apès pour rajouté un jour, je vais mettre une macro qui va regardé si le fichier a deja été utilisé. Sinon les données seront rajoutées sur la Feuil1 à la suite des autres.
    Une autre macro s'occupera d'ajouter ces nouvelles valeurs à la suite des autres dans la Feuil2.
    Qu'en pensez vous?

    En tout cas mille merci pour vos aides

  17. #17
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,
    Citation Envoyé par A2ll_ Voir le message
    Je n'ai pas appliqué le système que tu m'as proposé car j'ai pensé que les mettres comme j'ai fait me permet apres de mettre un code couleur( j'ai réussis a le faire aujourd'hui ^^) ce qui me permet de voir concretenant et rapidement ce qui ces passé chaque jour.
    Citation Envoyé par A2ll_ Voir le message
    En Fait depuis le post #3 pas mal de chose on changé, notemanet sur ma vision du rendu final ( la somme de l'ensemble n'est plus une priorité).
    Mais je pense que je vais essayé d'appliquer tes macros dans une 3ieme Feuille pour donner une autre vision des résultats.

    Pour ce qui est des problèmes de lenteurs je pense faire comme cela :

    les macros que j'ai ne devront être utilisé qu'à l'initiation. Apès pour rajouté un jour, je vais mettre une macro qui va regardé si le fichier a deja été utilisé. Sinon les données seront rajoutées sur la Feuil1 à la suite des autres.
    Une autre macro s'occupera d'ajouter ces nouvelles valeurs à la suite des autres dans la Feuil2.
    Tout cela n'est pas très clair, comme les règles du forum le spécifie, il faut nous donner des explications claires et exhaustives en précisant le but final avec tous ces tenants et aboutissants !
    Mais j'ai l'impression que tout n'est pas très bien défini et que c'est encore dans l'ébauche ? Est ce que je me trompe ?
    En tout cas ce qui est important au départ c'est les besoin réel (but), qui va l'utiliser, dans quels conditions, …?
    pour après pourvoir conceptualiser correctement l'outil et la manière de le faire;
    ce qui va nous amener à une structure bien définie des données, permettant de concevoir le code correctement par la suite.
    Sur ce forum il a été déjà démontré qu'avec 200 000 lignes faciles on pouvait faire des codes assez rapides.
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  18. #18
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    re,
    Tu as tout a fait raison, je me suis assez mal exprimé (désolé je ne savais pas par quoi commencer pour expliquer mon problème).
    Après le problème ne vient pas du nombre de ligne mais de ce qu'il traite. Dans mon cas c'est des comparaisons qui alourdissent énormement l'exécution.

  19. #19
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Dans ce cas là :
    il faut nous donner des explications claires et exhaustives en précisant le but final avec tous ces tenants et aboutissants !
    Alors …
    Dont en plus, comment sont récupérées les données sources (en brut) pour en faire quoi au final ?
    Ne pas lésiné sur les détails !!
    Edit : comparer quoi à quoi ??
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  20. #20
    Membre confirmé Avatar de A2ll_
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Les données brutes je les recoit par mail (elles doivent être collecté sur une BDD) sous forme de xls.
    Ma 1er macro me permet de les récupérer sous le format que j'ai mis dans le com #3

    La mon but est d'obtenir a partir de ces valeurs ce résultat :

    1er colonne : les ids
    autres colonnes que les SMS ( par exemple) des différents jours, sachant qu'il y a des jours où il peut y avoir apparition de nouveaux id,et d'autre peuvent disparaitre ( ils peuvent s'integrer en plein milieu (exemple : J1 : id1,id3,id8 ;J2:id1,id2,id8)
    derniere colonne : la somme de tout les SMS de chaque id

    Je pense avoir réussis a le faire maintenant ( grâce au super conseil de riaolle ). Par contre je suis un peu dans l'impasse à cause de ces problèmes de temps d'exécution.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA] Masquer les sélecteurs de ligne/colonnes (1,2..,A,B,C)
    Par skual dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/03/2006, 09h52
  2. [VBA-E]définir l'ensemble des cellules d'une feuille?
    Par yaya54 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 02/03/2006, 09h46
  3. [VBA-E] PROBLEME de recherche entre colonnes
    Par july92 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/02/2006, 10h35
  4. [VBA Excel] Trier une plage à plusieurs colonnes
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 22/12/2005, 18h04
  5. [D-7][PostGres]Récuperer l'ensemble des colonnes d'une table
    Par Escandil dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/10/2005, 10h17

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