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 :

Temps de calcul avec "Datediff" [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    CP en Telecom
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : CP en Telecom

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Temps de calcul avec "Datediff"
    Bonjour à toutes et tous

    Je pense que je fais fausse route...
    Pour faire simple: Je cherche à recopier des lignes entières d'une feuille "source" sur une "cible" en fonction de la date d'une colonne (la première pour l'exemple) de la feuille "source".
    La ligne est copiée si la date en colonne A est supérieure à 6 mois
    Voici l’idée:
    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
     
    Sub test2()
    Dim deltaD As Integer            'Ecart en mois entre la date de la colonne 1 et aujourd’hui feuille source
    Dim deltaDmax As Integer       'Selection des dates a recopier
    Dim lignedesign As Long         'Cosmetique > Pour selectionner où recopier les lignes sur feuille cible
    deltaDmax = 6                      'Definition du nb de mois
    lignedesign = 11
     
        Worksheets("cible").Cells.ClearContents
     
        For Each ligne In Worksheets("source").Range("1:6500").Rows
        deltaD = DateDiff("m", ligne.Cells(1, 1), Now)
     'Recopie la ligne de la feuille "source" sur le feuille "cible" si la date est plus eloignee ou égale de 6 mois
        If deltaD >= deltaDmax Then
        ligne.Copy Destination:=Worksheets("cible").Rows(lignedesign).Cells(1, 1)
        lignedesign = lignedesign + 1
        End If
        Next
     
    End Sub
    Le résultat est celui que je souhaite... mon problème est que la macro prend....20 secondes pour traiter 10 lignes.
    Le fichier final en comprend 2000.. Je n’ose même pas y penser...

    Éternel débutant, je pense que je ne prends pas les choses par le bon bout... Me tourne donc vers vous :-)

    Merci beaucoup pour votre aide.
    Cordialement.

  2. #2
    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 677
    Points
    18 677
    Par défaut
    Bonjour !

    Oublier le VBA un moment et se poser la question côté Excel, comment effectuerais-tu le test ?

    Car déjà en appliquant le B-A-BA d'Excel par code, une boucle - forcément longue - serait totalement inutile !

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    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)

  3. #3
    Membre régulier
    Homme Profil pro
    Évaluation de la performance
    Inscrit en
    Avril 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Évaluation de la performance
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2018
    Messages : 39
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Pour faire du pouce sur le dernier commentaire, as-tu pensé à utiliser un filtre élaboré en recopiant les données filtrés sur une autre feuille.
    Tu évites ainsi de passer par la boucle et tu devrais obtenir le même résultat.

    Cordialement

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, à lire et pratiquer : Les filtres avancés ou élaborés dans Excel

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Une piste avec copie du filtre (les entêtes sont aussi copiées) :
    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
     
    Sub CopieFiltre()
     
        Dim Plage As Range
     
        With Worksheets("source")
     
            'date en colonne A
            Set Plage = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
     
            Plage.AutoFilter 1, ">" & CLng(Date - 180)
     
            .AutoFilter.Range.EntireRow.Copy Worksheets("cible").Cells(1, 1)
     
            Plage.AutoFilter
     
        End With
     
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je t'invite à regarder du côté de filtre avancé ou élaboré ansi que datedif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datedif("M",date,"2018-01-01")>6
    Dateserial
    Code filtre élaboré : Sélectionner tout - Visualiser dans une fenêtre à part
    <dateserial(year(date),mounth(date)-6,day(date))
    Dernière modification par Invité ; 12/04/2018 à 08h15.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    CP en Telecom
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : CP en Telecom

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Effectivement, tellement plus simple et ... rapide.

    Pourquoi faire simple quand on peut faire compliqué...
    Mon souci est résolu !

    Encore une fois... MERCI infiniment pour vos lumières !!!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/08/2008, 17h05
  2. Temps de calcul avec deux écrans
    Par Shaga dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/11/2005, 09h24

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