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 :

Recopier des lignes en fonction d'un critère


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut Recopier des lignes en fonction d'un critère
    Bonjour à tous,

    J'ai mis en place un code qui devrait me permettre d'extraire d'un tableau Excel toutes les factures qui ont plus de 4 jours de traitement.
    Le délai normal à respecter est dans la colonne S de la feuille "Arrivéefactures"
    et le temps passé dans la colonne T de la même feuille.
    La 1ère saisie est faite en ligne 3 de la feuille

    A l'ouverture du fichier, un message (MsgBox) me previent que des factures ont dépassées le délai en cliquant sur "Yes", copie dans une feuille la liste des factures en question, cette feuille se nomme "Hors délais".

    Mais voilà, toute la liste est recopiée.

    Pouvez-vous m'aider à y voir plus clair s'il vous plait ?
    Merci par avance

    Voici le code en question.
    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
     
    Dim msg As String
    Dim insuf As Boolean
    Dim tablo As Variant
    Dim vRep As Integer
     
        insuf = False
        Sheets("Hors délais").Cells.ClearContents
        tablo = Worksheets("Arrivéefactures").Range("T1:T" & Split(Worksheets("Arrivéefactures").UsedRange.Address, "$")(4)).Value
            For i = 3 To UBound(tablo)
            If tablo(i, 1) < Worksheets("Arrivéefactures").Range("S" & i) Then
                insuf = True
                Exit For
            End If
        Next
        If insuf Then
        vRep = MsgBox("Ces factures ne sont toujours pas traitées", vbYesNo, "Avertissement")
            If vRep = vbNo Then Exit Sub
            End If
            If vRep = vbYes Then
            Sheets("Hors délais").Visible = True
            Sheets("Hors délais").Activate
            Sheets("Hors délais").Select
            Selection.ClearContents
            Sheets("Hors délais").Select
            Range("A1").Select
            Sheets("Arrivéefactures").Range("A2:R" & Worksheets("Arrivéefactures").UsedRange.Rows.Count).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("Select").Range("A1:A2"), CopyToRange:=Range("A1"), Unique:=False
            Sheets("Hors délais").Select
            Else
            Load FrmBonj
            FrmBonj.Show
            End If

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Essaies cette proposition
    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
    Dim sht As Worksheet, shtHD As Worksheet
    Dim LastLig As Long, LastLigHD As Long, i As Integer
    Dim insuf As Boolean
     
     
    Set sht = Sheets("Arrivéefactures")
    Set shtHD = Sheets("Hors délais")
     
    With sht
        LastLig = .Range("T65536").End(xlUp).Row
        insuf = False
        For i = 3 To LastLig
            If .Range("T" & i).Value > .Range("S" & i).Value Then
                insuf = True
                Exit For
            End If
        Next i
     
        If insuf Then
            If MsgBox("Ces factures ne sont toujours pas traitées", vbYesNo, "Avertissement") = vbYes Then
                shtHD.Visible = True
                shtHD.Cells.ClearContents
                LastLigHD = 1
                For i = 3 To LastLig
                    If .Range("T" & i).Value > .Range("S" & i).Value Then
                        .Range("A" & i & ":R" & i).Copy shtHD.Range("A" & LastLigHD)
                        LastLigHD = LastLigHD + 1
                    End If
                Next i
            End If
        End If
    End With
     
    Set sht = Nothing
    Set shtHD = Nothing
    Edit: range("Ai:Ri") au lieu de Rows(i)

  3. #3
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour mercatog et merci pour ton aide.
    Je place ton code et je te tiens informé
    A+

  4. #4
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour mercatog,

    Ton code fonctionne très bien, cependant le délai d'exécution est très long.
    Peut-on remédier à cela, (30 secondes). De plus, je souhaiterai que la feuille "Hors délais" soit apparante sans être obligé de cliquer sur l'onglet comme c'est la cas, ça je pense pouvoir le faire tout seul.

    J'ai modifié i=2 (avant c'était i=3)

    Merci par avance

    Voici le code
    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
     
    Dim sht As Worksheet, shtHD As Worksheet
    Dim LastLig As Long, LastLigHD As Long, i As Integer
    Dim insuf As Boolean
     
     
    Set sht = Sheets("Arrivéefactures")
    Set shtHD = Sheets("Hors délais")
     
    With sht
        LastLig = .Range("T65536").End(xlUp).Row
        insuf = False
        For i = 2 To LastLig
            If .Range("T" & i).Value > .Range("S" & i).Value Then
                insuf = True
                Exit For
            End If
        Next i
     
        If insuf Then
            If MsgBox("Ces factures ne sont toujours pas traitées", vbYesNo, "Avertissement") = vbYes Then
                shtHD.Visible = True
                shtHD.Cells.ClearContents
                LastLigHD = 1
                For i = 2 To LastLig
                    If .Range("T" & i).Value > .Range("S" & i).Value Then
                        .Range("A" & i & ":R" & i).Copy shtHD.Range("A" & LastLigHD)
                        LastLigHD = LastLigHD + 1
                    End If
                Next i
            End If
        End If
    End With
    Set sht = Nothing
    Set shtHD = Nothing

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    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
    Dim sht As Worksheet, shtHD As Worksheet
    Dim LastLig As Long, LastLigHD As Long, i As Integer
    Dim insuf As Boolean
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    Set sht = Sheets("Arrivéefactures")
    Set shtHD = Sheets("Hors délais")
     
    With sht
        LastLig = .Range("T65536").End(xlUp).Row
        insuf = False
        For i = 2 To LastLig
            If .Range("T" & i).Value > .Range("S" & i).Value Then
                insuf = True
                Exit For
            End If
        Next i
     
        If insuf Then
            If MsgBox("Ces factures ne sont toujours pas traitées", vbYesNo, "Avertissement") = vbYes Then
                shtHD.Visible = True
                shtHD.select
                shtHD.Cells.ClearContents
                LastLigHD = 1
                For i = 2 To LastLig
                    If .Range("T" & i).Value > .Range("S" & i).Value Then
                        .Range("A" & i & ":R" & i).Copy shtHD.Range("A" & LastLigHD)
                        LastLigHD = LastLigHD + 1
                    End If
                Next i
            End If
        End If
    End With
    Set sht = Nothing
    Set shtHD = Nothing
     
    Application.ScreenUpdating = true
    Application.Calculation = xlCalculationAutomatic

  6. #6
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour mercatog,

    Tout d'abord je te prie d'accepter mes excuses pour avoir tardé à te répondre mais un problème de santé m'y a contraint.

    J'ai mis en place le code que tu m'as donné, mais c'est toujours aussi long pour l'ouverture de la feuille "Hors délai". Je ne comprends pas.
    Merci par avance

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Prompt rétablissement
    On peut optimiser quelque peu
    d'abord combien tu as de lignes de données?
    ensuite, si tes données sont classé par un un ordre quelconque sur une colonne précise?

    Je te propose ce code, qui permet de copier une seule fois mais avec un tri sur les lignes Hors délai

    je ne sais pas l'ordre de tri initial de tes données; j'ai fais une remarque en commentaire
    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
    Dim sht As Worksheet, shtHD As Worksheet
    Dim LastLig As Long, LastLigHD As Long, i As Integer
    Dim insuf As Boolean
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    Set sht = Sheets("Arrivéefactures")
    Set shtHD = Sheets("Hors délais")
     
    With sht
        LastLig = .Range("T65536").End(xlUp).Row
        insuf = False
        For i = 2 To LastLig
            If .Range("T" & i).Value > .Range("S" & i).Value Then
                insuf = True
                Exit For
            End If
        Next i
     
        If insuf Then
            If MsgBox("Ces factures ne sont toujours pas traitées", vbYesNo, "Avertissement") = vbYes Then
                shtHD.Visible = True
                shtHD.Select
                shtHD.Cells.ClearContents
                LastLigHD = 1
                For i = 2 To LastLig
                    If .Range("T" & i).Value > .Range("S" & i).Value Then
                        .Range("IV" & LastLigHD).Value = "HD"
                        LastLigHD = LastLigHD + 1
                    End If
                Next i
     
                .Range("A2:IV" & LastLig).Sort Key1:=sht.Range("IV2"), _
                    Order1:=xlDescending, Header:=xlNo, OrderCustom:=1, _
                    MatchCase:=False, Orientation:=xlTopToBottom, _
                    DataOption1:=xlSortNormal
     
                .Range("A2:R" & LastLigHD).Copy shtHD.Range("A1")
                .Columns("IV:IV").ClearContents
                'Il faut prévoir de faire un tri inverse <- ICI
            End If
        End If
    End With
    Set sht = Nothing
    Set shtHD = Nothing
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

  8. #8
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Le nombre de lignes est variable, puisque je saisis les factures au fur et à mesure qu'elles arrivent. Au cumulé je peux arriver à prés de 800 lignes en fin d'année. J'ai donc besoin de savoir à tout moment par une alerte quelles sont celles qui ne sont toujours pas traitées.
    Les données ne sont jamais triés, la seule données qui soit triée c'est la date d'enregistrement puisqu'elle est acrémentée.
    Je teste ton code
    Merci

  9. #9
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour 800 lignes de données, je ne pense pas que les 30 secondes viennent de cette procédure.
    J'ai encore regroupé les 2 boucles en une seule
    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
    Dim sht As Worksheet, shtHD As Worksheet
    Dim LastLig As Long, LastLigHD As Long, i As Integer
    Dim insuf As Boolean
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    Set sht = Sheets("Arrivéefactures")
    Set shtHD = Sheets("Hors délais")
     
    With sht
        LastLig = .Range("T65536").End(xlUp).Row
        insuf = False
        LastLigHD = 1
     
        For i = 2 To LastLig
            If .Range("T" & i).Value > .Range("S" & i).Value Then
                insuf = True
                .Range("IV" & LastLigHD).Value = "HD"
                LastLigHD = LastLigHD + 1
            End If
        Next i
     
        If insuf Then
            If MsgBox("Ces factures ne sont toujours pas traitées", vbYesNo, "Avertissement") = vbYes Then
                shtHD.Visible = True
                shtHD.Select
                shtHD.Cells.ClearContents
     
                .Range("A2:IV" & LastLig).Sort Key1:=sht.Range("IV2"), _
                    Order1:=xlDescending, Header:=xlNo, OrderCustom:=1, _
                    MatchCase:=False, Orientation:=xlTopToBottom, _
                    DataOption1:=xlSortNormal
     
                .Range("A2:R" & LastLigHD).Copy shtHD.Range("A1")
                'Il faut prévoir de faire un tri inverse <- ICI
            End If
        End If
     
        .Columns("IV:IV").ClearContents
     
    End With
    Set sht = Nothing
    Set shtHD = Nothing
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Si tu n'as pas d'autres codes en parallèle dans ton classeur?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour, et prompt rétablissement.

    Question: Pourquoi ne pas simplement filtrer sur la feuille de saisie? Ce serait beaucoup plus rapide...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour à tous,

    J'ai besoin d'avoir une alerte lors de l'ouverture du fichier, un simple filtrage n'est pas suffisant. Je dois extraire les lignes concernées.

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

Discussions similaires

  1. [XL-2010] Copier/coller des lignes en fonction de critères
    Par Gexydou dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/01/2013, 10h42
  2. [XL-2010] Formule pour recopier une ligne en fonction d'un critère
    Par odsen.s dans le forum Excel
    Réponses: 2
    Dernier message: 01/07/2010, 16h38
  3. cmt lister des lignes en fonction du mois de la date
    Par Mihalis dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/04/2007, 13h29
  4. incrémenter des lignes en fonction d'un champ "nombre"
    Par bookaro92 dans le forum Access
    Réponses: 2
    Dernier message: 01/12/2006, 16h05
  5. [VBA-E] Créer des lignes en fonction d'un champ
    Par antakini dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/04/2006, 21h23

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