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 :

Macro de recopiage de données sur lignes spécifiques [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut Macro de recopiage de données sur lignes spécifiques
    Bonjour voici la macro:

    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
    Sub copie2()
    Dim Origine As Worksheet
    Dim Destination As Worksheet
    Dim Orig As Range
    Dim Dest As Range
    Dim Tableau1() As String
    Dim i As Long
    Dim j As Long
    Dim Derligne1 As Long
    Set Origine = Worksheets("Feuil1")
    Set Destination = Worksheets("Feuil2")
    Set Orig = Origine.Range("A1")
    Set Dest = Destination.Range("A1")
    Orig = Orig.Offset()
    Dest = Dest.Offset()
    Dim Pass1 As Double
    Dim Pass2 As Double
    Pass1 = Timer
    With Sheets("Feuil1")
        Derligne1 = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
     
     
    ReDim Tableau1(0 To Derligne1)
     
    For i = 0 To UBound(Tableau1)
    Tableau1(i) = Orig.Offset(i, 0)
    Next i
     
     
     
     i = 0
     j = 0
     
     Do While Tableau1(i) <> "" And Dest.Offset(j, 0) <> ""
     If Tableau1(i) = Dest.Offset(j, 0) Then
     Dest.Offset(j, 6) = Orig.Offset(i, 2)
        If Dest.Offset(j + 1, 0) = Dest.Offset(j, 0) Then
        i = i
        j = j + 1
        Else
        i = i + 1
        j = j + 1
        End If
     ElseIf (Dest.Offset(j, 0) - Orig.Offset(i, 0)) > "0,1" Then
     i = i + 1
     j = j
     Else
     i = i
     j = j + 1
     End If
     
     Loop
    Pass2 = Timer
    MsgBox Pass2 - Pass1 & " secondes "
    End Sub
    Cette macro marche!
    Elle est juste très lente et j'aimerais la rendre plus rapide et en même temps, l'appliquer à tous les onglets.

    Ce qu'elle fait:
    J'ai 2 feuilles horodatées en ligne A.
    La macro copie les cellules C de la feuille 1 vers les cellules G de la feuille 2, en fonction de l'horodatage des lignes.

    Exemple:
    Feuil1
    Colonne A__________Colonne C
    21/06/2014 19:20__________A
    21/06/2014 19:30__________A
    21/06/2014 19:40__________B
    21/06/2014 19:50__________D
    21/06/2014 20:00__________D

    Feuil2
    Colonne A__________ColonneG
    21/06/2014 19:20__________A
    21/06/2014 19:20__________A
    21/06/2014 19:20__________A
    21/06/2014 19:20__________A
    21/06/2014 19:20__________A
    21/06/2014 19:30__________A
    21/06/2014 19:30__________A
    21/06/2014 19:30__________A
    21/06/2014 19:30__________A
    21/06/2014 19:30__________A
    21/06/2014 19:40__________B
    21/06/2014 19:40__________B
    21/06/2014 19:40__________B
    21/06/2014 19:40__________B
    21/06/2014 19:40__________B
    21/06/2014 19:40__________B
    21/06/2014 19:50__________D
    21/06/2014 19:50__________D
    21/06/2014 19:50__________D
    21/06/2014 19:50__________D
    21/06/2014 20:00__________D
    21/06/2014 20:00__________D

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Le code est .... oui, franchement optimisable
    Vous pourriez m'expliquer comment vous passer de la feuille1 à la feuille2: les enregistrements se rajoutent aux existants?
    Si vous avez un exemple à fournir, c'est encore mieux
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Je vous créer une feuille exemple et je vous l'envoi, par contre le fichier sera trop volumineux pour ce forum.

    Comment procéder ?

    Cdt,

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    et bien ..... bien purgé peut-être
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Voici le fichier avant lancement de la macro (la macro prend environ 1H à s’exécuter)

    https://www.transfernow.net/fr/33bbr4d8bajz

    Prévenez moi si impossibilité de télécharger le fichier exemple.

    Cdt,

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Et bien je ne comprends pas tout .... avec quelques questions, sachant que je n'ai pas tout compris comment marche votre code

    1. Feuille 1
    Vous avez des données du style
    $A$1 6/15/2014 3:00:13 AM
    $A$2 6/15/2014 3:10:15 AM
    => Est-ce-que vous faites un traitement dessus?

    2. Feuille 2
    => Je n'ai pas compris exactement ce que vous vouliez faire avec les enregistrements dans votre partie
    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
     Do While Tableau1(i) <> "" And Dest.Offset(j, 0) <> ""
     If Tableau1(i) = Dest.Offset(j, 0) Then
     Dest.Offset(j, 6) = Orig.Offset(i, 2)
        If Dest.Offset(j + 1, 0) = Dest.Offset(j, 0) Then
        i = i
        j = j + 1
        Else
        i = i + 1
        j = j + 1
        End If
     ElseIf (Dest.Offset(j, 0) - Orig.Offset(i, 0)) > "0,1" Then
     i = i + 1
     j = j
     Else
     i = i
     j = j + 1
     End If
     
     Loop
    Je vous propose déjà un embryon de code qui simplifie un peu:
    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
    Sub SolProp_Vinc1()
     
    Dim InpRng As Range, ResRng As Range, InpCl As Range, ResCl As Range
    Dim ResClFirstAddr As String
     
     
    'On initalise les range Entrée données et résults
        Set InpRng = ThisWorkbook.Worksheets(1).Range("A1").CurrentRegion.Columns(1)    'On prend la 1ere colonne de tous les enregistrements
        Set ResRng = ThisWorkbook.Worksheets(2).Range("A1").CurrentRegion
     
    Debug.Print InpRng.Address, ResRng.Address
     
    ' On Parcout toutes les cellules de InpRng
        For Each InpCl In InpRng.Cells
     
            Debug.Print InpCl.Address, InpCl.Value
     
        ' On cherche celles correspondantes dans ResRng (1ere colonne)
            With ResRng.Columns(1)
     
                Set ResCl = .Find(InpCl.Value, LookIn:=xlValues)
     
                If Not ResCl Is Nothing Then
                    ResClFirstAddr = ResCl.Address
     
                    Do
                        ResCl.Value = ResCl.Value   'Quelquechose à modifier ici
                        Set ResCl = .FindNext(ResCl)
     
                    Loop While Not ResCl Is Nothing And ResCl.Address <> ResClFirstAddr
     
                End If
     
            End With
     
        Next InpCl
     
    End Sub
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  7. #7
    Expert éminent

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

    j'avais bien une méthode rapide à proposer et qui utilise des tableaux virtuels ... mais dans la mesure où on a des dates en Feuil2 pour laquelle il n'existe pas de correspondance en Feuil1 .... le programme tournait en 0.4s et remplissait uniquement les 3900 premières lignes ... il faut voir comment tu gères ce cas du coup.
    En extrapolant par pessimisme, on pouvait s'attendre à un traitement en quelques minutes

    une autre méthode envisageable :

    - pour chaque ligne de référence de la feuille1
    - filtre automatique en feuille2 avec la valeur
    - remplissage de la données en colonne G pour les lignes visibles
    - passage à la ligne suivante.

    mais ça représente 19500 Autofilters à effectuer ...

    j'ai encore d'autres méthode, puisque tes données sont triées ... mais encore une fois le fait qu'il manque des heures de références gâche toute l'optimisation

  8. #8
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    1. Feuille 1
    Vous avez des données du style
    $A$1 6/15/2014 3:00:13 AM
    $A$2 6/15/2014 3:10:15 AM
    => Est-ce-que vous faites un traitement dessus?
    Tout d'abord j'effectue une action manuelle sur ces données qui consiste a supprimer les milliseconde.

    Cela permet d'avoir le meme horodatage en feuille 1 et en feuille 2. Car les millisecondes ne sont pas identiques entre les deux.

    J'active ensuite la macro.

    2. Feuille 2
    => Je n'ai pas compris exactement ce que vous vouliez faire avec les enregistrements dans votre partie
    Je ne suis pas l'auteur de cette macro, je suis donc dans l'imposibilité de décrire son fonctionnement...

    Je ne suis pas d'une grande aide, j'en suis conscient et désolé..

    mais dans la mesure où on a des dates en Feuil2 pour laquelle il n'existe pas de correspondance en Feuil1 ....
    Les dates en feuille 2 avec un horodatage contenant des minutes différentes de 00 10 20 30 40 50, sont des erreurs.

    Je m'en suis rendu compte après l'envoi du fichier. Sans ces horodatages il y aurait une correspondance pour chaque horodatage.

    Donc peut etre que votre solution fonctionnerait.
    (I faut juste supprimer le 23/06)

    Cordialement,

    Voici le lien du fichier sans l'erreur au niveau de l'horodatage.

    https://www.transfernow.net/fr/717ii362t89j

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Rebonjour

    Tout d'abord j'effectue une action manuelle sur ces données qui consiste a supprimer les milliseconde.
    => Horreur et stupéfaction! VBA sait très bien le faire, et excel aussi!

    Je ne suis pas l'auteur de cette macro, je suis donc dans l'imposibilité de décrire son fonctionnement...
    => OK, mais si vous pouviez décrire un peu (avec des mots, désolé, je nai toujours pas compris) ce que vous attendez de la Macro:
    - Si l'enregistrement en feuil1 est trouvé, je fais quoi (enregistrements multiples, ....)
    - Sinon ....

    Bon WE
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  10. #10
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    OK, mais si vous pouviez décrire un peu (avec des mots, désolé, je nai toujours pas compris) ce que vous attendez de la Macro:
    - Si l'enregistrement en feuil1 est trouvé, je fais quoi (enregistrements multiples, ....)
    - Sinon ....
    Alors je vais vous expliquer le contexte et ce que je veux faire:

    En feuille 1 j'ai toutes les 10 min 1 données X
    En feuille 2 j'ai toutes les 10 min 20 données Y

    Ce que je veux c'est faire apparaître les données X (sur la feuille 2) correspondantes aux données Y en fonction de l'horodatage.

    Manuellement ca donnerait:
    (On considère que les données X sont en colonne C (feuille1) et les données Y en colonne D (feuille2))

    Je copie la donnée X de la ligne 1, feuil 1
    Je la colle sur la ligne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 , feuille 2 colonne E (à coté des données Y)

    Je copie la donnée X de la ligne 2, feuil 1
    Je la colle sur la ligne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 , feuille 2

    (vous devriez lancer la macro sur une partie de la feuille que je vous ai fourni, ca devrait être plus clair.)

    N'hésitez pas a me requestionner si vous n'avez toujours pas compris ce que la macro doit faire.

    Cordialement,

  11. #11
    Expert éminent

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

    désolé de dire ça, mais tu expliques vraiment mal + ton fichier ne correspond pas à ta description + ton fichier contient encore des immenses coquilles (des dates en feuille1 et pas en feuille2, et même l'inverse !)

    j'ai réussi à matcher les 3900 premières lignes de feuille2, en y mettant la valeur de la colonne C de la feuille1 dans la colonne G de ta feuille2
    ensuite je ne remonte plus rien ... puisqu'il y a des trous dans tes données

    corriger tes trous ... je suis pas là pour ça
    pallier à ce problème par des conditionnelles ... super, on va perdre le temps que j'économise

    je suis passé à 0.2S pour remplir les 4000 premières lignes


    montre moi un VRAI fichier stable, sans date manquante des deux côtés


    Ps : tu n'effaces pas les millisecondes, tu les masques ! On est obligé dans la procédure de convertir le format de tes données pour les comparer

    Ps2 : si tu te mettais à notre place, comment tu comprend ça ?
    Je copie la donnée X de la ligne 1, feuil 1
    Je la colle sur la ligne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 , feuille 2 colonne E (à coté des données Y)

    Je copie la donnée X de la ligne 2, feuil 1
    Je la colle sur la ligne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 , feuille 2
    je voyais plutôt :

    Je copie la donnée X de la ligne 1, feuil 1
    Je la colle sur la ligne 1 à 20, feuille 2 colonne E (à coté des données Y)

    Je copie la donnée X de la ligne 2, feuil 1
    Je la colle sur la ligne 21 à 40 , feuille 2


    alors si c'est vraiment ça que tu veux ... c'est plus du tout pareil, on et on va pouvoir aller encore plus vite

    MAIS SOIT PRECIS ET CLAIR SVP


    EDIT : et pour info, la macro que tu nous montres ne fait pas ce que tu décris
    elle cherche, pour chaque ligne de la colonne A de la feuille2, la ligne de la colonne A en feuille1 qui contient la même date
    ensuite, après avoir trouvé, elle écrit en colonne G de feuille2, la valeur de la colonne C en feuille1

    ta première Date s'étend sur 63 lignes, la seconde sur environ 115 lignes etc...
    ils sont où tes "20 fois" dedans ?

    on parle bien du même classeur ou pas ?
    quelle perte de temps pour nous ... car tu n'as pas pris le temps de préparer ton sujet ...

  12. #12
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Désolé pour la perte de temps.

    Bon, Oubliez tous ce que j'ai pu dire à présent.

    ***************************************************

    La macro que j'ai présenté dans ce topic a été réalisée lors de mon premier post sur ce forum, à l'aide des infos que j'avais donné, de manière plus claire ()
    Ce post ce trouve ici :

    http://www.developpez.net/forums/d15...l2-boucle-for/

    (vous trouverez sur ce post des fichier exemple plus clair eux aussi)

    Si vous avez encore un peu de temps () sa lecture facilitera la communication entre nous.

    Le sujet a été résolu car cette macro fais ce que je veux.
    Mais sur un fichier plus grand, avec plus de données, cette macro est trop lente. J'aimerais donc l'optimiser ou trouver un autre moyen de faire la même chose...

    Les fichiers que je dois traiter ne sont pas réguliers et pourront manqué de données. C'est pour cela que la macro réalisé par cette personne fonctionne en recherchant pour chaque ligne de la colonne A feuille 2, la ligne de la colonne 1 qui a la même date.

    D'ailleurs joe avait déjà répondu a mon sujet

  13. #13
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 084
    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 084
    Points : 9 872
    Points
    9 872
    Billets dans le blog
    5
    Par défaut
    oui, je me disais bien que :

    - le style d'écriture de la macro ( Eric) me disait quelque chose
    - l'histoire des données uniquement avec les minutes à 0 me parlait aussi (encore un autre sujet)


    Revenons à nos moutons.

    voici une méthode qui associe tes 250 000 dates de la feuille2, aux 20 000 dates possibles de ta feuille1

    si une date existe en feuille2 mais pas en feuille1 : ça écrira "TOTO" dans la colonne G (je te laisse mettre la valeur que tu veux)

    tout ceci étant réalisé en ..... moins de 40 secondes

    j'espère que ça t'ira, t'as gagné 1h30


    j'ai vérifié pas mal de dates différentes, et les valeurs me semblent toutes correctes ... mais charge à toi de vérifier plus minutieusement (normalement c'est ok)


    Bon maintenant, c'est encore optimisable (hey oui !!) et je lance un défi à mes amis les contributeurs : pouvez-vous faire plus rapide que ça ?
    (les plus fins connaisseurs verront immédiatement ce qui est optimisable, mais j'estime que 40 secondes c'est honorable donc je m'arrête la)
    JB, gnain, Patrick, Philippe, Mercatog, bbil (je m'arrête de citer, j'ai une grande liste sinon ) : faites-moi rêver comme vous le faites si bien


    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    Option Base 1
     
    Sub essai2()
    Dim Pass1 As Double
    Dim Pass2 As Double
    Dim i As Long
    Dim j As Long
    Dim Debut As Long
    Dim Existe As Boolean
    Dim Trouve As Boolean
    Dim Plage As Range
     
    Pass1 = Timer
     
    With Sheets("Feuil1")
        TabloOri = .Range(.Cells(1, 1), .Cells(.Cells(1, 1).End(xlDown).Row, 3)).Value
    End With
     
    With Sheets("Feuil2")
        TabloDest = .Range(.Cells(1, 1), .Cells(.Cells(1, 1).End(xlDown).Row, 1)).Value
    End With
     
    Debut = 1
    For i = LBound(TabloDest, 1) To UBound(TabloDest, 1)
        Trouve = False
        For j = Debut To UBound(TabloOri, 1)
            If Format(CDate(TabloDest(i, 1)), "dd/mm/yyyy hh:mm") = Format(CDate(TabloOri(j, 1)), "dd/mm/yyyy hh:mm") Then
                If Not Existe Then
                    ReDim TabloVal(1)
                    TabloVal(1) = TabloOri(j, 3)
                    Existe = True
                Else
                    ReDim Preserve TabloVal(UBound(TabloVal) + 1)
                    TabloVal(UBound(TabloVal)) = TabloOri(j, 3)
                End If
     
                If i < UBound(TabloDest, 1) Then
                    If Format(CDate(TabloDest(i, 1)), "dd/mm/yyyy hh:mm") <> Format(CDate(TabloDest(i + 1, 1)), "dd/mm/yyyy hh:mm") Then
                        Debut = j + 1
                    End If
                End If
     
                Trouve = True
                Exit For
            End If
        Next j
     
        If Not Trouve Then
            ReDim Preserve TabloVal(UBound(TabloVal) + 1)
            TabloVal(UBound(TabloVal)) = "TOTO"
        End If
    Next i
     
    ' application.transpose est limité à 65535 éléments
    ' donc on construit un tableau temporaire
    ' qui contient des paquets de 65535 éléments
    If UBound(TabloVal) > 65535 Then
        ' calcul du nombre de tableaux nécessaires
        nbtab = UBound(TabloVal) / 65535
        If nbtab <> Int(nbtab) Then
            nbtab = Int(nbtab) + 1
        End If
     
        ' pour chaque tableau entier
        For i = 1 To nbtab - 1
            ReDim TabTemp(1)
            TabTemp(1) = TabloVal(1 + (65535 * (i - 1)))
            For j = 2 To 65535
                ReDim Preserve TabTemp(UBound(TabTemp) + 1)
                TabTemp(UBound(TabTemp)) = TabloVal(j + (65535 * (i - 1)))
            Next j
     
            With Sheets("Feuil2")
                Set Plage = .Range(.Cells(1 + (65535 * (i - 1)), 7), .Cells((65535 * (i - 1)) + UBound(TabTemp), 7))
                Plage.Value = Application.WorksheetFunction.Transpose(TabTemp)
            End With
        Next i
     
        ' on gère le dernier tableau à part (il ne contient pas 65535 éléments
        ReDim TabTemp(1)
        TabTemp(1) = TabloVal(1 + (65535 * (nbtab - 1)))
        For j = 2 To (UBound(TabloVal)) - (65535 * (nbtab - 1))
            ReDim Preserve TabTemp(UBound(TabTemp) + 1)
            TabTemp(UBound(TabTemp)) = TabloVal(j + (65535 * (nbtab - 1)))
        Next j
     
        With Sheets("Feuil2")
            Set Plage = .Range(.Cells(1 + (65535 * (i - 1)), 7), .Cells((65535 * (i - 1)) + UBound(TabTemp), 7))
            Plage.Value = Application.WorksheetFunction.Transpose(TabTemp)
        End With
     
    ' si le tableau contient moins de 65535, on peut transposer immédiatement
    Else
        With Sheets("Feuil2")
            Set Plage = .Range(.Cells(1, 7), .Cells(UBound(TabloVal), 7))
            Plage.Value = Application.WorksheetFunction.Transpose(TabloVal)
           End With
    End If
     
    Set Plage = Nothing
    Pass2 = Timer
    MsgBox Pass2 - Pass1 & " secondes "
    End Sub

  14. #14
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    A priori , cela fonctionne.

    Je vous tiens au courant mardi, j'ai pas pris mes fichiers de travail complet avec moi.

    En tout cas, MERCI beaucoup !

  15. #15
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 084
    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 084
    Points : 9 872
    Points
    9 872
    Billets dans le blog
    5
    Par défaut
    Peux-tu nous faire un retour sur un test de temps si possible ?

    - nombre de lignes en feuil1 et de lignes en feuil2
    - temps de traitement avec ton ancien code
    - temps de traitement avec le nouveau


    le temps variant en fonction des performances de l'ordinateur, je ne peux pas savoir le gain réel obtenu sur ta propre machine

  16. #16
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2015
    Messages : 50
    Points : 14
    Points
    14
    Par défaut
    Feuil1 20k
    Feuil2 250k
    Temps ancienne macro 3000 secondes
    Temps nouvelle macro 58 secondes

    Je vous ferais un retour avec mes fichiers complets mardi

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

Discussions similaires

  1. [XL-2007] Macro pour exporter des données sur WORD vers Excel (version 2007)
    Par krokos55 dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 31/10/2012, 13h10
  2. Besoin d'aide Macro récupéré les mêmes données sur classeur fermé
    Par djinero dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/10/2011, 15h40
  3. Excel : Macro pour positionnement sur ligne
    Par danielh dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/10/2006, 08h45
  4. Réponses: 4
    Dernier message: 02/02/2006, 18h13
  5. [Forms6i] Focus sur ligne spécifique
    Par lafouine dans le forum Forms
    Réponses: 4
    Dernier message: 30/08/2005, 11h12

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