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 :

Une boucle sur 500000 ligne lente


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Points : 56
    Points
    56
    Par défaut Une boucle sur 500000 ligne lente
    Bonjour,

    J'aimerais rechercher les valeurs qui se trouve dans la colonne D dans le Range ("A2 :B25000 »), et me donner le valeur se trouvant dans la cellule B (qui à droite de la cellule recherchée et trouvée) dans la colonne E Par exemple avec un boucle :

    Je cherche D1=AAA621 dans A2 :B17, je le trouve dans la cellule A2, j'ai besoin de la valeur de la cellule B2 dans la cellule E2, Ensuite je cherche D3=AAB732 dans le range A2 :B17, je le trouve dans la cellule A5, j'ai besoin de la valeur B5 dans la cellule E5.
    . et ainsi de suite.

    au début je l'ai fait avec Vlookup, mais le problème c'est que cette fonction me donne seulement la première valeur rencontrée dans la matrice car dans mes données il y'a des doublons de id mais qui ont un numéro de transit différent que je ressortir.

    alors j'ai fait cette boucle pour faire un indicateur et oublier la première valeur trouvée et aller à la n'ème.

    mais le problème c'est que cette boucle est vraiment lente!!! vu le nombre de ligne que j'ai en réalité.

    Voyez-vous une autre meilleure solution?

    Merci.

    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
    Sub INFIN()
    For i = 2 To 30
        For j = 2 To 30
            If Cells(i, 4) = Cells(j, 1) Then
                If Cells(j, 8) <> 1 Then
                    Cells(i, 6) = Cells(j, 2)
                    Cells(j, 8) = 1
                    Exit For
                End If
     
            End If
        Next j
    Next i
     
    Range("H:H").ClearContents 'pour éffacer l'indicateur
     
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    bonjour

    dans ton cas ,garde ce principe mais sur des variables tableaux se sera certainement plus rapide

    sinon regarde une certaine discussion donc l'auteur est "oliv+-"
    au plaisir

  3. #3
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Salut.
    Autre conseil
    Désactive le calcul auto:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation=xlCalculationManual
    pour activer à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation=xlCalculationAutomatic
    sur une grande boucle il vaut mieux typer tes variables compteur pour alléger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim J as long, I as Long
    cordialement.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 115
    Points : 56
    Points
    56
    Par défaut
    Bonjour Patrick,

    Citation Envoyé par patricktoulon Voir le message
    bonjour

    dans ton cas ,garde ce principe mais sur des variables tableaux se sera certainement plus rapide
    Comme je suis novice en VBA et qu'il m'arrive rarement que je programme, je ne suis pas sûr d'avoir bien compris "variables tableaux"

    Citation Envoyé par patricktoulon Voir le message
    sinon regarde une certaine discussion donc l'auteur est "oliv+-"
    au plaisir
    pour ce qui est de la discussion de Oliv-, est ce que tu fait allusion `acette discussion?

    http://www.developpez.net/forums/d12...-dictionnaire/

    si c'est le cas, c'est très avancé comme code !!!

    Merci.

  5. #5
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Salut.

    La boucle est lente dis-tu.

    Pour une très grande boucle, il vaut mieux utiliser les fonctions Excel dont l'exécution est plus rapide. Bien poser les calculs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E2").FormulaArray"=INDEX($B$1:$C$40000,LARGE(IF(D2=$A$2:$A$40000,ROW($A$2:$A$40000),""),1),5)"
    pour remplir toute la colonne avec cette formule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E2").Autofill Destination:=Range("E2:E40000")

    Transformer les formules par leurs valeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E2:E40000").Value=Range("E2:E40000").Value

    En fait il te faut tester une formule efficace qui répond à tes besoins.

    si tu préfères toujours les boucles:

    dans le corps de ta procédure recopie ceci

    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
    Dim T,Table,D,L as Long,i as Integer
    'T variant devant contenir ta colonne n° 1  (critère)
    'D Variant qui contiendra les Résultats (colonne n° 4 et 5)
    'Table variant qui contiendra Tes colonnes n°: 2 et 3 
    'Affectations implicites en tableau des variants T, D, Table
     
    T=Range("A2:A50000")
    Table=Range("B2:B50000")
    'Ici si la colonne n'est pas vide l'éffacer avec l'instruction Range("D2:D50000").ClearContents
    D=Range("D2:D50000")
     
    L=1
    Do 'boucle externe qui permettra d'avoir un élément à la boucle interne
     
    n=1
     
    Do
     
    If Table(n,1)=T(L,1) Then
    ' instructions...
    'Ex: D(L,1)=Table(1,2)
    Else
    'Instruction...
    End If
    n=n+1
    Loop Until n=Ubound(D)
    L=L+1
     
    Loop Until L=Ubound(D)
     
     
    'Renvoyer le Tableau D dans la colonne 4
    Range("D2:D40000")=D
     
    'En fait l'opération n'agit sur la feuille qu'à la dernière instruction
    il vaut mieux avoir le mode de calcul en manuel si tu as des formules sur ton fichier.

Discussions similaires

  1. Écrire le résultat d'une boucle sur une ligne
    Par Erlen dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 03/05/2012, 15h18
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. [TStringGrid] Une cellule sur plusieurs lignes.
    Par Caine dans le forum Delphi
    Réponses: 15
    Dernier message: 28/03/2007, 12h53
  4. realiser une boucle sur un nom de champs dans un Etat
    Par stephanfromtoulouse dans le forum IHM
    Réponses: 2
    Dernier message: 08/09/2006, 23h09
  5. faire une boucle sur un select
    Par reski dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/03/2006, 19h41

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