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 :

Problème Classer des données excel VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut Problème Classer des données excel VBA
    Bonjour,

    Je dispose d'un classeur Excel dans lequel je dois regrouper les lignes du classeur selon des conditions sur les colonnes. Par exemple :

    1 - je prends la première ligne du fichier

    2 - je compare les éléments de colonnes suivants : le prix, le libelle, le code client

    3 - s'ils sont égaux, j'assemble toutes les lignes ensemble ensuite, je décale deux lignes et je recommence

    J'espère avoir été clair ! Mon problème est que le classeur compte plus de 130 000 lignes, si chaque ligne doit être comparé aux 123 000 autres lignes, je pense que je ne m'en sortirai pas ! Je viens humblement vous demander de l'aide ( des idées, des exemples déjà traités), pourrait-il avoir un autre moyen sans passer par du VBA par exemple ?

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je n'ai pas tout compris :

    1) On la première ligne : OK
    2) On regarde dans les autres lignes si le trio [le prix, le libelle, le code client] est identique
    3) Tu entends quoi par "assembler" ??

    Ne voudrais-tu pas, par hasard, trier tes 130 000 lignes afin que toutes les lignes ayant [le prix, le libelle, le code client] identiques soient disposés à la suite sur ta feuille ... et en séparant chaque "tas" par 2 lignes ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Ne voudrais-tu pas, par hasard, trier tes 130 000 lignes afin que toutes les lignes ayant [le prix, le libelle, le code client] identiques soient disposés à la suite sur ta feuille ... et en séparant chaque "tas" par 2 lignes ?
    Bonjour joe,

    Vous avez encore une fois compris le problème mieux que moi même !

    Je souhaite en effet que toutes les lignes identiques soient disposées à la suite dans un autre onglet, en séparant chaque tas par des lignes ! J'ai oublié de préciser qu'on ne passe pas à la comparaison de ces trois colonnes (prix, libelle et code client) si et seulement si le nom du groupe est le même.

    Le but est de regrouper toutes les lignes ayant [le prix, le libelle, le code client] identiques pour chaque groupe pour établir en quelque sorte "un périmètre" !

    Je souhaite faire ceci dans un autre onglet parce que je voudrais après(quand j'aurai fini le regroupement) ajouter des boutons qui permettront à l'utilisateur d'ajouter ou supprimer des lignes dans un périmètre en se servant de la base de départ !

    Merci pour votre aide

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je te propose, suite à ta contrainte de groupe et d'avoir ça dans une nouvelle feuille, la proposition suivante :

    - une feuille par groupe
    - on fait nos regroupements de libellé/prix/code client
    - plus besoin de séparer de deux lignes


    Car le problème d'insérer deux lignes vides, c'est qu'il devient compliqué d'utiliser par la suite des outils de filtres (par exemple)

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Citation Envoyé par Thautheme Voir le message
    Bonjour le fil, bonjour le forum,

    Juste avant de réponde je viens de rafraîchir le post et je vois qu'il y a une nouvelle condition de groupe que ne gère pas le code que je te propose. Je vois aussi que Joe a vu juste et qu'un simple tri pourrait suffire...

    Il te faudra adapter le(s) code(s) ci-dessous car tu ne précises pas quelles sont les colonnes qui contiennent le Code Client, le Libellé et le prix (et le groupe).
    • La Macro1 ne rassemble que les élément contenant plusieurs occurrences.
    • La Macro2 rassemble toutes les lignes...
    Code commenté :
    Merci infiniment Tauthème, je vais essayer de l'adapter et je vous reviendrai si j'ai un souci ! Merci

    Citation Envoyé par joe.levrai Voir le message
    Je te propose, suite à ta contrainte de groupe et d'avoir ça dans une nouvelle feuille, la proposition suivante :

    - une feuille par groupe
    - on fait nos regroupements de libellé/prix/code client
    - plus besoin de séparer de deux lignes


    Car le problème d'insérer deux lignes vides, c'est qu'il devient compliqué d'utiliser par la suite des outils de filtres (par exemple)
    J'avais carrément écarter l'option du filtre dès qu'on m'a fait comprendre qu'il fallait séparer les "périmètres" par des lignes !

    Créer une feuille pour chaque groupe me paraît être la meilleure solution, cela rendrait l'ajout ou la suppression d'une ligne d'un groupe bien plus facile.

    Le problème (je ne sais si c'en est vraiment un) est que le nombre de groupes est ou aussi important, dans ce cas, il va alors falloir pouvoir créer une sorte de "boîte de dialogues" avec le nom de tous les groupes (feuilles) permettant à l'utilisateur d'atteindre la feuille (le groupe) lorsqu'il clique sur un nom de feuille ?

    Aussi, j'ai un autre problème, le fichier se plante déjà tout seul juste quand il reste ouvert assez longtemps (peut être parce qu'il a trop de données dans la feuille), créer d'autres feuilles n'aggraverait-il pas la solution ? Ou bien faudra t-il les mettre dans un autre classeur ?

    Merci pour votre aide et votre disponibilité

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je ne comprend pas bien tes dernières remarques

    on peut changer notre fusil d'épaule !

    1) on fait les regroupements
    2) on ne sépare pas les tas avec deux lignes vides
    3) un simple filtre automatique (voir avancé si tu veux exporter les données) te permettra de choisir un groupe ou plusieurs groupes si besoin

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Juste avant de réponde je viens de rafraîchir le post et je vois qu'il y a une nouvelle condition de groupe que ne gère pas le code que je te propose. Je vois aussi que Joe a vu juste et qu'un simple tri pourrait suffire...

    Il te faudra adapter le(s) code(s) ci-dessous car tu ne précises pas quelles sont les colonnes qui contiennent le Code Client, le Libellé et le prix (et le groupe).
    • La Macro1 ne rassemble que les élément contenant plusieurs occurrences.
    • La Macro2 rassemble toutes les lignes...
    Code commenté :


    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Private OS As Worksheet 'déclare la variable OS (Onglet Source)
    Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Private NL As Long 'déclare la variable NL (Nombre de Lignes)
    Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)
     
    Sub Macro1()
    Dim D As Object 'déclare la variable ND (Dictionnaire)
    Dim CC As String 'déclare la variable CC (Concaténation de Colonnes)
    Dim TL() As Variant 'déclare la variable TL (Tableai de Lignes)
    Dim I As Long 'déclare la variable I (Incrément de lignes)
    Dim J As Integer 'déclare la variable J (incrément de lignes)
    Dim K As Long 'déclare la variable K (incrément de lignes)
    Dim L As Integer 'déclare la variable L (incrément de colonnes)
    Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
     
    Set OS = Sheets("Feuil1") 'définit l'onglet source OS (à adapter)
    Set OD = Sheets("Feuil2") 'définit l'onglet destination OD (à adapter)
    TC = OS.Range("A1").CurrentRegion 'définit le tableau de cellules TC (à adapter)
    NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellulles TC
    NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellulles TC
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionaire D
    For I = 2 To NL 'boucle sur toutes les ligne du tableau de cellues TC (en partant de la seconde)
        'définit la concaténation CC
        'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
        CC = CStr(TC(I, 1)) & CStr(TC(I, 2)) & CStr(TC(I, 3))
        D(CC) = D(CC) + 1 'alimente le dictionnaire avec le concaténation CC
    Next I 'prichaine ligne de la boucle
    TE = D.keys 'récupère tableau TE (Tableau des Éléments) les éléments du dictionnaire D sabs doiblon
    TOC = D.items 'récupère tableau TOC (Tableau des OCcurrences) le nombre d'occurrence de chaque élément de TE
    For I = LBound(TE) To UBound(TE) 'boucle sur tous les éléments de TE
        If TOC(I) > 1 Then 'condition 1 : si l'élément a plusieurs occurrences
            K = 1 'initialise la variable K
            For J = 2 To NL 'boucle 1 sur toutes les lignes J du tableau de cellules TC (en partant de la seconde)
                'condition 2 : si la concaténation des colonne 1 deux et trois est égale à TE(I)
                'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
                If CStr(TC(J, 1)) & CStr(TC(J, 2)) & CStr(TC(J, 3)) = TE(I) Then
                    'redimensionne le tableau de lignes TL (autant de ligne que TC a de colonnes,K colonnes)
                    ReDim Preserve TL(1 To NC, 1 To K)
                    For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
                        TL(L, K) = TC(J, L) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)
                    Next L 'prochaine colonne de la boujcle 2
                    K = K + 1 'incrémente K
                End If 'fin de la condition 2
            Next J 'prochaien ligne de la boucle 1
            If K > 1 Then 'condition 3 : si K est supérieur à 1 (au moins une occurrence trouvée)
                'définit la cellue de destination DEST
                Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(3, 0))
                'revoie dans DEST redinensionnée le tableau TL transposé
                DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
            End If 'fin de la condition 3
            Erase TL 'vide le tableau TL
        End If 'fin de la condition 1
    Next I 'prochain élément du tableau TE
    End Sub
     
    Sub Macro2()
    Dim D As Object 'déclare la variable ND (Dictionnaire)
    Dim CC As String 'déclare la variable CC (Concaténation de Colonnes)
    Dim TL() As Variant 'déclare la variable TL (Tableai de Lignes)
    Dim I As Long 'déclare la variable I (Incrément de lignes)
    Dim J As Integer 'déclare la variable J (incrément de lignes)
    Dim K As Long 'déclare la variable K (incrément de lignes)
    Dim L As Integer 'déclare la variable L (incrément de colonnes)
    Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
     
    Set OS = Sheets("Feuil1") 'définit l'onglet source OS (à adapter)
    Set OD = Sheets("Feuil2") 'définit l'onglet destination OD (à adapter)
    TC = OS.Range("A1").CurrentRegion 'définit le tableau de cellules TC (à adapter)
    NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellulles TC
    NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellulles TC
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionaire D
    For I = 2 To NL 'boucle sur toutes les ligne du tableau de cellues TC (en partant de la seconde)
        'définit la concaténation CC
        'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
        CC = CStr(TC(I, 1)) & CStr(TC(I, 2)) & CStr(TC(I, 3))
        D(CC) = D(CC) + 1 'alimente le dictionnaire avec le concaténation CC
    Next I 'prichaine ligne de la boucle
    TE = D.keys 'récupère tableau TE (Tableau des Éléments) les éléments du dictionnaire D sabs doiblon
    For I = LBound(TE) To UBound(TE) 'boucle sur tous les éléments de TE
        K = 1 'initialise la variable K
        For J = 2 To NL 'boucle 1 sur toutes les lignes J du tableau de cellules TC (en partant de la seconde)
            'condition 1 : si la concaténation des colonne 1 deux et trois est égale à TE(I)
            'remplace 1, 2 et 3 par le numero des colonnec contenant le "Code Clien", le "Libellé" et le "Prix"
            If CStr(TC(J, 1)) & CStr(TC(J, 2)) & CStr(TC(J, 3)) = TE(I) Then
                'redimensionne le tableau de lignes TL (autant de ligne que TC a de colonnes,K colonnes)
                ReDim Preserve TL(1 To NC, 1 To K)
                For L = 1 To NC 'boucle 2 : sur toutes les colonnes de TC
                    TL(L, K) = TC(J, L) 'récupère dans la ligne de TL la valeur de la colonne de TC (transposition)
                Next L 'prochaine colonne de la boujcle 2
                K = K + 1 'incrémente K
            End If 'fin de la condition 1
        Next J 'prochaien ligne de la boucle 1
        If K > 1 Then 'condition 2 : si K est supérieur à 1 (au moins une occurrence trouvée)
            'définit la cellue de destination DEST
            Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(3, 0))
            'revoie dans DEST redinensionnée le tableau TL transposé
            DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
        End If 'fin de la condition 2
        Erase TL 'vide le tableau TL
    Next I 'prochain élément du tableau TE
    End Sub

Discussions similaires

  1. Importer des données Excel vers BD Access
    Par technopole dans le forum Access
    Réponses: 1
    Dernier message: 03/07/2006, 14h37
  2. Insérer des données Excel dans une table ACCESS
    Par anikeh dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 22h42
  3. Importer des données excel vers outlook
    Par faayy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/10/2005, 09h30
  4. Insérer des données Excel dans une base Access ?
    Par MaTHieU_ dans le forum Access
    Réponses: 3
    Dernier message: 22/06/2005, 15h11
  5. Récupérer des données Excel vers Interbase ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 20/07/2003, 18h16

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