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 :

Méthode la plus rapide pour vérifier des conditions sur trois colonnes [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut Méthode la plus rapide pour vérifier des conditions sur trois colonnes
    Bonjour le forum,

    J'ai un feuille de plusieurs dizaines de milliers de lignes qui contient des numéros de commande en colonne G, des codes articles en colonnes K, et des quantités commandées en colonne M.

    Ce que je voudrais, c'est parcourir toutes les lignes d'une même commande (le nombre de lignes étant variable bien sûr), puis vérifier que dans cette commande, figure bien trois articles A, B, et C, et en quantité suffisante.
    Et je cherche la manière la plus rapide possible.

    Pour l'instant, j'arrive à délimiter la plage de chaque commande avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Sub Test_Boucle_Groupement()
    Dim PreLigCommande As Long, DerLigCommande As Long, LigFinBase As Long
    Dim PlageCdes As Range, PlageCommande As Range
    Set WsBase = Worksheets("Base")
    LigFinBase = WsBase.[G65536].End(xlUp).Row
    Set PlageCdes = WsBase.Range("G2:G" & LigFinBase)
     
    For PreLigCommande = 2 To LigFinBase
        DerLigCommande = PlageCdes.Find(WsBase.range("G:" & PreLigCommande), SearchDirection:=xlPrevious).Row
        Set PlageCommande = WsBase.Range("G" & PreLigCommande & ":G" & DerLigCommande)
        PreLigCommande = DerLigCommande
    Next PreLigCommande
    End Sub
    Mais maintenant que je sais que ma première commande, par exemple) se situe entre la ligne 2 et la ligne 5, je sèche sur la meilleure façon de vérifier que le range "K2:K5" contient bien les références A,B, et C, et que la référence A a bien été commandée au moins par 4, la B au moins par 8, et la C au moins par 4.

    Aah, j'espère que c'est clair.
    Mais je sèche un peu sur la meilleure façon de vérifier que la plage "

  2. #2
    Membre actif
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Points : 283
    Points
    283
    Par défaut
    Salut, déjà ton code est faux il ne renvoie pas la bonne plage, même il plante.

    En voici un qui marche:

    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
    Sub Test_Boucle_Groupement()
    Dim PreLigCommande As Long, DerLigCommande As Long, LigFinBase As Long
    Dim PlageCdes As Range, PlageCommande As Range,trouve as range
    Set WsBase = Worksheets("Base")
    LigFinBase = WsBase.[G65536].End(xlUp).Row
    Set PlageCdes = WsBase.Range("G2:G" & LigFinBase)
     
    For PreLigCommande = 2 To LigFinBase
        Set trouve = PlageCdes.Find(Cells(PreLigCommande, 7).Value, PlageCdes.Cells(PlageCdes.Count), xlValues, xlWhole, xlByColumns, xlPrevious)
        If Not trouve Is Nothing Then
        DerLigCommande = trouve.Row
        Set PlageCommande = WsBase.Range("G" & PreLigCommande & ":G" & DerLigCommande)
        PreLigCommande = DerLigCommande
        End If
    Next PreLigCommande
    End Sub

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Salut,

    A quel moment il plante chez toi? Chez moi, il fonctionne...

  4. #4
    Membre actif
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Points : 283
    Points
    283
    Par défaut
    Il plantait au niveau de la ligne find
    Proposition pour récupérer les valeurs de A, B et C:
    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
    Sub Test_Boucle_Groupement()
    Dim PreLigCommande As Long, DerLigCommande As Long, LigFinBase As Long
    Dim Ncom As Integer, NbA As Integer, NbB As Integer, NbC As Integer
    Dim PlageCdes As Range, PlageCommande As Range
    Set WsBase = Worksheets("Base")
    LigFinBase = WsBase.[G65536].End(xlUp).Row
    Set PlageCdes = WsBase.Range("G2:G" & LigFinBase)
     
    For PreLigCommande = 2 To LigFinBase
        Ncom = Cells(PreLigCommande, 7).Value
        NbA = 0
        NbB = 0
        NbC = 0
        Set trouve = PlageCdes.Find(Ncom, PlageCdes.Cells(PlageCdes.Count), xlValues, xlWhole, xlByColumns, xlPrevious)
        If Not trouve Is Nothing Then
        DerLigCommande = trouve.Row
        Set PlageCommande = WsBase.Range("K" & PreLigCommande & ":K" & DerLigCommande)
        For Each c In PlageCommande
        Select Case c.Value
        Case Is = "A"
        NbA = NbA + Cells(c.Row, 13).Value
        Case Is = "B"
        NbB = NbB + Cells(c.Row, 13).Value
        Case Is = "C"
        NbC = NbC + Cells(c.Row, 13).Value
        End Select
        Next c
        MsgBox ("Commande n° " & Ncom & Chr(10) & "Il y a " & NbA & " A commandés" & Chr(10) & "Il y a " & NbB & " B commandés." & Chr(10) & "Il y a " & NbC & " C commandés.")
        PreLigCommande = DerLigCommande
        End If
    Next PreLigCommande
    End Sub
    J'ai rééssayé ton code du début et je ne parviens pas à le faire fonctionné, cette ligne plante et me donne erreur d'éxécution '1004' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLigCommande = PlageCdes.Find(WsBase.Range("G:" & PreLigCommande), SearchDirection:=xlPrevious).Row

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    C'est curieux, je n'ai pas d'erreur... je vais creuser ça.

    Merci pour la suggestion. J'essaie de l'adapter, et je reviens si j'ai encore des soucis.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/02/2012, 19h40
  2. Réponses: 1
    Dernier message: 03/01/2010, 15h36
  3. Méthode rapide pour afficher des carré de couleur
    Par matteli dans le forum DirectX
    Réponses: 7
    Dernier message: 03/12/2006, 20h50
  4. Algo le plus rapide pour trouver une répétition ?
    Par AsmCode dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/07/2005, 01h26
  5. Réponses: 16
    Dernier message: 19/05/2005, 17h20

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