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

Excel Discussion :

Optimisation recherche de quantités pour chaque ligne identique [XL-2010]


Sujet :

Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 86
    Points : 59
    Points
    59
    Par défaut Optimisation recherche de quantités pour chaque ligne identique
    Bonjour à tous,

    Je vous explique ce que je fais:
    J'ai une feuille "Données" qui contient beaucoup de champs dont :
    - Un numéro de service
    - Un prix
    - un code

    Je souhaite alors compter à partir de ces champs le nombre de ligne unique afin de récupérer la quantité de chaque ligne. Je sais pas si je suis claire..Un exemple sera encore mieux :

    si on a dans les données :
    N° --- Prix --- code
    1 --- 54 ---- 002
    3 --- 39 ---- 003
    4 --- 54 ---- 002
    1 --- 54 ---- 002
    3 --- 39 ---- 003
    3 --- 54 ---- 002

    le résultat sera :
    N° --- Prix --- code --- Quantité
    1 --- 54 ---- 002 --- 2
    3 --- 39 ---- 003 --- 2
    4 --- 54 ---- 002 --- 1
    3 --- 54 ---- 002 --- 1

    Pour faire cela, ma méthode est la suivante :
    - je parcours toutes les lignes dans "données" et je colle les champs que je souhaite récupérer dans une feuille "Quantités" (procédure1)
    - dans un second temps je parcours les lignes qui viennent d'être collées dans "Quantités". Ce parcours se fait deux à deux, on prends la première ligne puis on la compare avec toutes les autres. (procédure2)
    - Si une ligne est similaire à la première je la supprime et j'ajoute +1 au compteur.
    - Une fois terminé je passe à la deuxième ligne et ainsi de suite jusqu'à qu'il ne reste plus de doublons.

    Je récupère bien pour chaque ligne la bonne quantité sauf que je traitement est très long (j'ai en moyenne 500lignes). D'où ma question: y'a t-il un moyen d'optimiser cette procédure ?


    Le code que j'utilise

    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
     
     
    'PROCEDURE 1
    Sub CopierLesChampsDansQuantités()
     
    Dim lig As Integer
     
        Sheets("Quantités").Range("D:D").NumberFormat = "@"
     
        Dim derniereLigne As Integer
     
        Set FL2 = Sheets("Données")
     
        ' Recherche de la dernière ligne dans l'onglet "Quantité"
        derniereLigne = Sheets("Quantités").Range("B" & Rows.Count).End(xlUp).Row + 1
     
        If derniereLigne > 8 Then
            Range("B8:E" & derniereLigne).EntireRow.Delete 'On supprime les anciennes données pour coller les nouvelles
        Else
     
            lig2 = 8 ' on commence à coller qu'à partir de la ligne 8
            For lig = 2 To Split(FL2.UsedRange.Address, "$")(4)
                ' N°de service
                Sheets("Quantités").Range("B" & lig2).Value = Sheets("Données").Range("R" & lig).Value
                ' Prix
                Sheets("Quantités").Range("C" & lig2).Value = Sheets("Données").Range("Q" & lig).Value
                ' Code 
                Sheets("Quantités").Range("D" & lig2).Value = Sheets("Données").Range("S" & lig).Value
                ' Quantités
                Sheets("Quantités").Range("E" & lig2).Value = 1
                lig2 = lig2 + 1
            Next
        End If
     
    End Sub
     
    'PROCEDURE 2
     
    Sub CalculQuantite2()
     
    'Déclaration des variables
    Dim lig, lig2, cpt As Variant
    Dim num, num2 As Variant
    Dim Prix, Prix2 As Variant
     
    Set FL1 = Worksheets("Quantités")
     
        'Compare la première ligne avec toutes les autres lignes du fichier
        For lig = 8 To Split(FL1.UsedRange.Address, "$")(4)
            For lig2 = lig + 1 To Split(FL1.UsedRange.Address, "$")(4)
                'Récupère le numéro de service et le prix des deux lignes comparées
                num = Sheets("Quantités").Range("B" & lig)
                num2 = Sheets("Quantités").Range("B" & lig2)
                Prix = Sheets("Quantités").Range("C" & lig)
                Prix2 = Sheets("Quantités").Range("C" & lig2)
                'Si les deux lignes comparées sont identiques
                If (num = num2 And Prix = Prix2) Then
                    cpt = Sheets("Quantités").Range("E" & lig).Value
                    Sheets("Quantités").Range("E" & lig).Value = cpt + 1 'On ajoute une quantité puisqu'une ligne identique a été trouvée
                    Sheets("Quantités").Rows(lig2).Delete 'on supprime la ligne identique à celle comparée
                    lig2 = lig2 - 1 'Vu qu'on vient de supprimer une ligne
                End If
            Next
        Next
     
        Set FL1 = Nothing
     
    End Sub

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    Bonjour
    sans macros ni formules:
    as tu essayé avec un tableau croisé dynamique (TCD)?

    si tu ne connais pas les TCD, regardedans les tutos (investissement en temps très profitable)
    Michel_M

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 86
    Points : 59
    Points
    59
    Par défaut
    Meerci je ne sais pas pourquoi je n'y ai pas pensé avant -_- en tout cas ça marche

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Si vous voulez traiter le résultat autrement que par un TCD, le removeDuplicates marche très bien
    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set InpRng = ThisWorkbook.Wokjsheets("Data").range("A1").CurrentRegion
    InpRng.RemoveDuplicates Columns:=(RngColAR), Header:=RngAsHeader
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  5. #5
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 420
    Points : 16 264
    Points
    16 264
    Par défaut
    Bonjour
    Citation Envoyé par vinc_bilb Voir le message
    Bonjour,

    Si vous voulez traiter le résultat autrement que par un TCD, le removeDuplicates marche très bien
    Oui mais où est le calcul de la quantité ?
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    Et pour reprendre une nième fois la recommandation de Pierre Fauconnier
    "Avant de penser VBA, pensez Excel"
    Michel_M

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

Discussions similaires

  1. [SQL Server 2008] optimisation recherche dans table
    Par dingo200 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/05/2009, 10h22
  2. [Optimisation] recherche text
    Par Jedy dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 18/07/2008, 12h14
  3. [Tableaux] optimisation pour grosse quantité
    Par mdr_cedrick dans le forum Langage
    Réponses: 7
    Dernier message: 30/04/2008, 18h31
  4. [optimisation]recherche-v et gros fichiers
    Par rfufu dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 22h32
  5. Réponses: 1
    Dernier message: 24/05/2007, 14h46

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