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 :

Optimisation code copier_coller


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingénieur énergie
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur énergie
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut Optimisation code copier_coller
    Bonjour à tous,

    J'ai découvert VBA il y a 2 mois, et j'ai beaucoup appris en parcourant ce forum, mais cette fois-ci, je ne trouve pas la réponse à ma question ; d'où mon post (dsl si il existait déjà, et merci de me l'indiquer).

    Bref, j'ai une longue liste de nombres sur une colonne (environ 52600 lignes) et je souhaiterais la transformer en un tableau de 6 colonnes (avec le même nombre d'éléments).

    Voici le code que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub transpose()
    Application.ScreenUpdating = False
    Sheets(1).Select
    Dim n As Integer
        n = 365 * 24
     
    For i = 0 To n - 1
        Range(Cells(2 + i * 6, 2), Cells(7 + i * 6, 2)).Copy
        Range(Cells(2 + i, 7), Cells(2 + i, 12)).PasteSpecial transpose:=True
    Next i
     
    Application.ScreenUpdating = True
    End Sub
    Le problème, c'est que vu le nombre d'opérations, ce code est beaucoup trop long à exécuter.
    Avez-vous des idées pour l'optimiser ?

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Salut

    première indication
    Integer est limité de : -32 768 à 32 767
    vu que tu traite + 50 000 je te conseille de déclarer en Long

    Long est limité de : -2 147 483 648 à 2 147 483 647

    sinon peux- tu donner d'autres détails
    et je souhaiterais la transformer en un tableau de 6 colonnes (avec le même nombre d'éléments).
    comment veux-tu que ce soit :
    a) 6 colonnes pour 8767 lignes
    b) 6 colonnes pour 52600 lignes

    et compte faire une ligne puis la suite sur la ligne suivante
    ou
    une colonne puis la suite sur la colonne suivante ?


    à+

    PS : plutôt que de traité 6 dans une constante utilise directement 6 ! (c'est plus rapide)

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Ca devrait être plus rapide :
    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 transpose()
        Const nbcol As Long = 6
        Dim lig As Long, col As Long, lig1 As Long
        Dim datas, result() As Double
        datas = [A2].Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1)
        ReDim result(1 To UBound(datas) / nbcol, 1 To nbcol)
        For lig = 1 To UBound(result)
            For col = 1 To nbcol
                lig1 = lig1 + 1
                result(lig, col) = datas(lig1, 1)
            Next col
        Next lig
        Sheets("Feuil2").Cells.ClearContents
        Sheets("Feuil2").[A2].Resize(UBound(result, 1), UBound(result, 2)) = result
        Sheets("Feuil2").Activate
    End Sub
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour eriiic, Igloobel, renardor

    De mon coté, j'avais préparé ce code au cas où la longueur du tableau initial n'est pas un multiple de 6
    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
    Sub transposition()
    Dim x As Long, y As Long, z As Long
    Dim Tbl, TbResult(), Derlg As Range
    With Sheets(1)
      Set Derlg = .Range("B" & .Rows.Count).End(xlUp) 'a adapter à la bonne colonne
      Tbl = .Range("B2", Derlg) 'idem
        ReDim TbResult(1 To Int(UBound(Tbl) / 6) + 1, 1 To 6)
        For x = 1 To UBound(TbResult)
            For y = 1 To 6
                z = z + 1
                If z > UBound(Tbl) Then Exit For
                TbResult(x, y) = Tbl(z, 1)
            Next y
        Next x
        .Cells.ClearContents
        .Range("B2").Resize(UBound(TbResult, 1), 6) = TbResult
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Membre averti
    Homme Profil pro
    ingénieur énergie
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur énergie
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut
    Merci à tous de vos réponses rapides

    Il s'agissait bien d'un multiple de 6. Pour être précis, c'était une valeur de puissance appelée à EDF toutes les 10 minutes (10 min par ligne, soit 365*24*6 lignes). Et pour l'intégrer dans une autre macro, il me fallait une ligne par heure et 6 colonnes pour 0,10,20,30,40 et 50 min, soit 365*24 lignes et 6 colonnes.

    Enfin, ton code est excellent eriiic
    Il s'est exécuté en moins d'une seconde !

    Si j'ai bien compris, tu n'as utilisé que des tableaux fictifs, c'est ça ?
    C'est toujours plus rapide de copier un tableau que des cellules une par une ?

    Enfin, ça montre que j'ai encore pas mal de progrès à faire !

    Encore merci

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Oui, si beaucoup de données il faut limiter les lectures/écritures sur les feuilles.
    Là tout est lu en 1 bloc, travaillé en mémoire et collé en 1 bloc.
    eric

  7. #7
    Membre averti
    Homme Profil pro
    ingénieur énergie
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : ingénieur énergie
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Par défaut
    Une dernière question, eriic (ou quelqu'un d'autre qui passerait par là):

    Lorsque tu écrit [A2], est ce que c'est équivalent à range("A2") ou bien cells(2,1) ?

    Je ne connaissais pas ce raccourci, est ce qu'il y en a d'autres qui utiliseraient des références avec des nombres, genre [2,1] (celui là ne marche pas, j'ai déjà essayé).

    Si ça existe, ça allégerait considérablement mes futurs programmes !

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Lorsque tu écrit [A2], est ce que c'est équivalent à range("A2") ou bien cells(2,1) ?
    oui, tout à fait
    Mais attention, ça n'a pas que des avantages. Tu perds l'auto-complétion ce qui peut-être handicapant quand tu débutes.

    genre [2,1] (celui là ne marche pas, j'ai déjà essayé)
    Non, pas d'autre à ma connaissance.
    Si ce n'est with ... end with qui va alléger la lecture, mais qui te fait perdre également l'auto-complétion.

    eric

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

Discussions similaires

  1. [VBA-E optimisation code] ameliorer la méthode pour cacher des lignes
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/07/2008, 09h53
  2. Optimisation Code - Dernière ligne de la feuille
    Par Trust dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/07/2008, 12h25
  3. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  4. Réponses: 13
    Dernier message: 22/02/2008, 18h55
  5. Optimiser code VBA
    Par willytito dans le forum VBA Access
    Réponses: 5
    Dernier message: 19/11/2007, 09h49

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