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 :

Extraction de Données entre 2 dates par numero client et transférer le Résultat dans une autre feuille


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de BERRACHED SAID
    Inscrit en
    Janvier 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2009
    Messages : 192
    Points : 125
    Points
    125
    Par défaut Extraction de Données entre 2 dates par numero client et transférer le Résultat dans une autre feuille
    bonjour le forum et bonne journée

    je voudrais faire une extraction sur une base de données se trouvant dans la feuille nommée "Polices" cette extraction repose sur 3 critères N°de Client et Date de début puis Date Fin puis transférer le résultat sur une autre feuille nommée "INTERFACE" j'avais un code qui est sur la même logique seulement le résultat est transférer dans un listview j'ai voulu l'adapter
    pour qu'il transfère une dans feuille de calcul au lieu d'un listview mais en vain je galère depuis ce matin.

    merci a vous et bonne journée mes amis.

    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
    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
    Private Sub CommandButton1_Click()
    'On Error Resume Next
    Dim wsBD As Worksheet
        Dim derLig As Long
        Dim Lig As Long
        Dim plage As Range
        Dim CritRente As String
        Dim CritDateDeb As String
        Dim CritDateFin As String
        Dim LigList As Long
        Dim Cumul As Currency
        Dim nc As Integer, s As String
     
        s = Trim(TextBox3): nc = Len(s)
        If nc = 0 Then Exit Sub
        Set wsBD = Worksheets("Polices")
        ' Dernière ligne dans la feuille BD
        derLig = wsBD.Range("A" & Cells.Rows.Count).End(xlUp).Row
        If derLig < 2 Then Exit Sub
     
        ' Définition de la plage en colonne A
        Set plage = wsBD.Range("A2:A" & derLig)
     
        ' Définition des critères
            ' N° De client
        CritRente = IIf(TextBox3.Value = "", "*", TextBox3.Value)
     
            ' Date Début
        CritDateDeb = TextBox1.Value
        If TextBox1.Value = "" Or Not IsDate(TextBox1.Value) Then
            CritDateDeb = Format(Application.WorksheetFunction.Min(plage), "dd/mm/yyyy")
        End If
            ' Date Fin
        CritDateFin = TextBox2.Value
        If TextBox2.Value = "" Or Not IsDate(TextBox2.Value) Then
            CritDateFin = Format(Application.WorksheetFunction.Max(plage), "dd/mm/yyyy")
        End If
        CritDateFin = DateAdd("d", 1, CritDateFin)
        'LigList = 1
        ' Vider la listview
        'ListView1.ListItems.Clear
     
        ' Boucle sur toutes les lignes
        For Lig = 2 To derLig
            ' Rechercher par rapport aux critères
            If CDate(wsBD.Range("B" & Lig).Value) >= CDate(CritDateDeb) And _
                CDate(wsBD.Range("B" & Lig).Value) < CDate(CritDateFin) And _
                CStr(wsBD.Range("A" & Lig).Value) Like CritRente Then
                ' Remplir la première colonne de la feuille INTERFACE
                With Sheets("Interface")
                 LigList = .Range("A65000").End(xlUp).Row + 1
                .Range("A10" & LigList) = wsBD.Range("A" & Lig).Value
                .Range("B10" & LigList) = wsBD.Range("E" & Lig).Value
                .Range("C10" & LigList) = wsBD.Range("F" & Lig).Value
                .Range("D10" & LigList) = wsBD.Range("G" & Lig).Value
                .Range("E10" & LigList) = wsBD.Range("H" & Lig).Value
                End With
                 LigList = LigList + 1
            End If
        Next Lig
     
    End Sub
    juste pour votre information la base de données contiens 412264 lignes

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 103
    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 103
    Points : 9 908
    Points
    9 908
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    la configuration semble se prêter à l'utilisation (par ordre de préférence) :

    - des filtres avancés (AdvanceFilters), un excellent tutoriel de Philippe Tulliez ici http://philippetulliez.developpez.co...dvancedfilter/
    - des filtres automatiques (AutoFilters), quelques pistes dans la FAQ http://excel.developpez.com/faq/?pag...eNonVideFiltre


    pour les filtres avancés, tu peux exporter le resultat
    pour les filtres automatiques, tu peux copier la plage visibles après application du filtre et la mettre dans une autre feuille

    et bien sûr, réaliser les choses manuellement pour reproduire le résultat voulu par macro
    l'enregistreur de macro fournira ensuite une base à adapter
    si tu as besoin d'aide pour adapter le code, prépare-le et montre nous où tu es coincé

    ton souhait va tenir sur environ 20 lignes de code (à vue d'oeil), pas plus

  3. #3
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.

    Il faut certainement supprimer le "10" dans tes commandes.

    Exemple: Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A10" & LigList) = wsBD.Range("A" & Lig).Value
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A" & LigList) = wsBD.Range("A" & Lig).Value
    Cordialement

    Docmarti.

  4. #4
    Membre habitué Avatar de BERRACHED SAID
    Inscrit en
    Janvier 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2009
    Messages : 192
    Points : 125
    Points
    125
    Par défaut
    bonjour Docmarti

    merci pour la réponse

    effectivement j'ai un peu modifier le code apparemment il marche sauf il me reste 2 choses :

    1 - intégrer un message (MsgBox) si bien-sure les données recherchées n'existe pas
    2- il est trop lourd dans la recherche est parfois il bloque

    si tu as une idée je suis preneur

    mille merci

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 103
    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 103
    Points : 9 908
    Points
    9 908
    Billets dans le blog
    5
    Par défaut
    tes deux problèmes ont une résolution quasi-native avec mes propositions, mais je pense avoir parlé dans le vide.

    ton code effectue des tests sur chaque cellule, tests consistant en la validation de 3 conditions sur plus de 400 000 lignes

    tu m'étonnes que ça soit long .... mes méthodes fonctionnent en quelques instants (voir moins d'une seconde)

  6. #6
    Membre habitué Avatar de BERRACHED SAID
    Inscrit en
    Janvier 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2009
    Messages : 192
    Points : 125
    Points
    125
    Par défaut
    bonjour joe.levrai

    merci encore de l’intérêt que vous porté a mon problème

    voici le code que j'utlise actuellement :
    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
     On Error Resume Next
    Dim wsBD As Worksheet
        Dim derLig As Long
        Dim Lig As Long
        Dim plage As Range
        Dim CritRente As String
        Dim CritDateDeb As String
        Dim CritDateFin As String
        Dim LigList As Long
        Dim Cumul As Currency
        Dim nc As Integer, s As String
     
        s = Trim(TextBox3): nc = Len(s)
        If nc = 0 Then Exit Sub
        Set wsBD = Worksheets("Polices")
        ' Dernière ligne dans la feuille BD
        derLig = wsBD.Range("A" & Cells.Rows.Count).End(xlUp).Row
        If derLig < 2 Then Exit Sub
     
        ' Définition de la plage en colonne A
        Set plage = wsBD.Range("A2:A" & derLig)
     
        ' Définition des critères
            ' N° De client
        CritRente = IIf(TextBox3.Value = "", "*", TextBox3.Value)
     
            ' Date Début
        CritDateDeb = TextBox1.Value
        If TextBox1.Value = "" Or Not IsDate(TextBox1.Value) Then
            CritDateDeb = Format(Application.WorksheetFunction.Min(plage), "dd/mm/yyyy")
        End If
            ' Date Fin
        CritDateFin = TextBox2.Value
        If TextBox2.Value = "" Or Not IsDate(TextBox2.Value) Then
            CritDateFin = Format(Application.WorksheetFunction.Max(plage), "dd/mm/yyyy")
        End If
        CritDateFin = DateAdd("d", 1, CritDateFin)
         'LigList = 1
        ' Vider la listview
        'ListView1.ListItems.Clear
     
        ' Boucle sur toutes les lignes
            For Lig = 2 To derLig
            ' Rechercher par rapport aux critères
            If CDate(wsBD.Range("B" & Lig).Value) >= CDate(CritDateDeb) And _
                CDate(wsBD.Range("B" & Lig).Value) < CDate(CritDateFin) And _
                CStr(wsBD.Range("A" & Lig).Value) Like CritRente Then
                ' Remplir la première colonne de la feuille INTERFACE
                With Sheets("INTERFACE")
                 LigList = .Range("A65000").End(xlUp).Row + 1
                .Range("A" & LigList) = wsBD.Range("A" & Lig).Value
                .Range("B" & LigList) = wsBD.Range("E" & Lig).Value
                .Range("C" & LigList) = wsBD.Range("F" & Lig).Value
                .Range("D" & LigList) = wsBD.Range("G" & Lig).Value
                .Range("E" & LigList) = wsBD.Range("H" & Lig).Value
                End With
                 'LigList = LigList + 1
            End If
        Next Lig
         Unload Me
    il m'affiche bien le resultat souhaité mais parfois il sort complétement il ne reconnais pas le userform1 et parfois il bug sur
    ce macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ouvre()
    UserForm1.Show
    End Sub
    il me demande a chaque fois d'enregistrer une copie du classeur

    mille merci

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut



    Bonjour,

    avec l'instruction On Error Resume Next masquant les erreurs, difficile !

    Suivre le code en mode pas à pas via la touche F8 tout en contrôlant la fenêtre des Variables locales


    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Membre habitué Avatar de BERRACHED SAID
    Inscrit en
    Janvier 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2009
    Messages : 192
    Points : 125
    Points
    125
    Par défaut
    bonjour Marc-L

    incomplet je comprend pas moi c'est un code que j'avais déjà mais il fonctionne pour Listview je l'ai adapter pour une feuille quant au transfère
    ou il est incomplet ???

    merci Marc

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 103
    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 103
    Points : 9 908
    Points
    9 908
    Billets dans le blog
    5
    Par défaut
    Sans parler du

    il me demande a chaque fois d'enregistrer une copie du classeur
    qui a peut-être rendu le fichier instable de part la récupération multiple faite sur le fichier


    je reste sur ce que j'ai dis : filtre automatique ou avancé

    sinon, c'est mettre un pansement sur une jambe de bois + prendre un vélo pour faire le voyage de Paris vers New-York plutôt que d'utiliser l'avion
    (toutes considérations écologiques exclues)

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 907
    Points : 28 882
    Points
    28 882
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    je reste sur ce que j'ai dis : filtre automatique ou avancé
    Comme l'a très bien écrit Joe, je ne peux que te conseiller d'utiliser les filtres avancés.
    Après avoir défini les zones Data, de critères et d'exportation, la ligne de code en VBA fait une ligne.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut


    J'avais corrigé mon message entre temps Saïd !
    Le code du post #6 a l'air incomplet vu qu'il n'y a pas de déclaration de procédure;
    mais en remontant sur le post initial …

    Retirer la fâcheuse ligne On Error permettra de détecter les erreurs de conception mais de toute manière,
    une des deux solutions les plus rapides est bien le filtre ou le filtre avancé, si ce n'est la meilleure …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Membre habitué Avatar de BERRACHED SAID
    Inscrit en
    Janvier 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2009
    Messages : 192
    Points : 125
    Points
    125
    Par défaut
    bonjour le forum et bonne journée

    Merci beaucoup pour vos réponses, mon problème d'affichage a été résolu grâce à DoEvents et Me.Repaint et Cela m'a l'air d'un phénomène bien connu pour un affichage dans une boucle longue.

    voici le code si ça peut intéressé quelqu’un :
    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
     'On Error Resume Next
    Dim wsBD As Worksheet
        Dim derLig As Long
        Dim Lig As Long
        Dim plage As Range
        Dim CritRente As String
        Dim CritDateDeb As String
        Dim CritDateFin As String
        Dim LigList As Long
        Dim Cumul As Currency
        Dim nc As Integer, s As String
     
        s = Trim(TextBox3): nc = Len(s)
        If nc = 0 Then Exit Sub
        Set wsBD = Worksheets("Polices")
        ' Dernière ligne dans la feuille BD
        derLig = wsBD.Range("A" & Cells.Rows.Count).End(xlUp).Row
        If derLig < 2 Then Exit Sub
     
        ' Définition de la plage en colonne A
        Set plage = wsBD.Range("A2:A" & derLig)
     
        ' Définition des critères
            ' N° De client
        CritRente = IIf(TextBox3.Value = "", "*", TextBox3.Value)
     
            ' Date Début
        CritDateDeb = TextBox1.Value
        If TextBox1.Value = "" Or Not IsDate(TextBox1.Value) Then
            CritDateDeb = Format(Application.WorksheetFunction.Min(plage), "dd/mm/yyyy")
        End If
            ' Date Fin
        CritDateFin = TextBox2.Value
        If TextBox2.Value = "" Or Not IsDate(TextBox2.Value) Then
            CritDateFin = Format(Application.WorksheetFunction.Max(plage), "dd/mm/yyyy")
        End If
        CritDateFin = DateAdd("d", 1, CritDateFin)
         'LigList = 1
        ' Vider la listview
        'ListView1.ListItems.Clear
     
        ' Boucle sur toutes les lignes
            For Lig = 2 To derLig
             DoEvents
            ' Rechercher par rapport aux critères
            If CDate(wsBD.Range("B" & Lig).Value) >= CDate(CritDateDeb) And _
                CDate(wsBD.Range("B" & Lig).Value) < CDate(CritDateFin) And _
                CStr(wsBD.Range("A" & Lig).Value) Like CritRente Then
                ' Remplir la première colonne de la feuille INTERFACE
                With Sheets("INTERFACE")
                 LigList = .Range("A65000").End(xlUp).Row + 1
                .Range("A" & LigList) = wsBD.Range("A" & Lig).Value
                .Range("B" & LigList) = wsBD.Range("E" & Lig).Value
                .Range("C" & LigList) = wsBD.Range("F" & Lig).Value
                .Range("D" & LigList) = wsBD.Range("G" & Lig).Value
                .Range("E" & LigList) = wsBD.Range("H" & Lig).Value
                End With
                 'LigList = LigList + 1
            End If
        Next Lig
        Me.Repaint
         Unload Me
    merci mes amis et bonne journée.

    Said

  13. #13
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 103
    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 103
    Points : 9 908
    Points
    9 908
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    on peut avoir une estimation du temps que met ta procédure pour balayer les 400 000 lignes ?

    par ailleurs, dans ton code, tu calcules ta première ligne vide en partant de la ligne 65 000 ... je préfère t'en aviser pour ne pas avoir de mauvaises surprises un jour

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

Discussions similaires

  1. copier donnée valide dans une autre feuille
    Par marie33000 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 16/04/2009, 20h25
  2. Réponses: 7
    Dernier message: 02/03/2009, 11h10
  3. Réponses: 3
    Dernier message: 24/11/2008, 14h09
  4. Copie de données filtrées dans une autre feuille
    Par papagei2 dans le forum Excel
    Réponses: 1
    Dernier message: 30/08/2007, 16h16
  5. Réponses: 1
    Dernier message: 17/10/2006, 17h37

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