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 de code


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut Optimisation de code
    Bonjour,

    J'ai essayé d'appliquer les conseils de cette discussion, à savoir de supprimer tous les select, mais je bloque sur ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Sheets("Parametres").Cells.Copy
        Sheets("FAN").Select
        Cells.Select
        ActiveSheet.Paste
        Rows("1:2").Delete
    Ca fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Sheets("Parametres").Cells.Copy
        Sheets("FAN").Cells.Paste
        Rows("1:2").Delete
    Ca ne fonctionne plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Sheets("Parametres").Cells.Copy
        Sheets("FAN").Cells.Select
        ActiveSheet.Paste
        Rows("1:2").Delete
    Non plus...

    Pourquoi donc ?
    Pour tout le reste ça marche mais pas pour les collage...

  2. #2
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 74
    Points : 47
    Points
    47
    Par défaut
    Tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Sheets("Parametres").Cells.Copy Sheets("FAN").Range("A1")
            Rows("1:2").Delete

  3. #3
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut Copie
    Bonjour Ffguy, Bonjour le Forum,

    Encore que.

    J'ai toujours été sceptique quant à la copie de l'intégralité des cellules d'une feuille (surtout depuis Office 2007).

    La définition des zones à copier peut s'effectuer de plusieurs manières (UsedRange, End(Xl..)...).

    D'autre part, je pense qu'il est utile d'attacher chaque objet à son parent.

    Ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Essai_copy()
    Sheets("Parametres").UsedRange.Copy Destination:=Sheets("FAN").Range("A1")
    Sheets("FAN").Rows("1:2").Delete
    End Sub

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  4. #4
    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 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour Marcel,
    D'autre part, je pense qu'il est utile d'attacher chaque objet à son parent.
    A 100% d'accord avec toi, c'est une mesure de prudence et j'ajouterais également le classeur.
    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

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut
    Je suis désolé mais je pense que je passe à coté de quelque chose... Lorsque j'essai d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Parametres").UsedRange.Copy Destination:=Sheets("FAN").Range("A1")
    Ca me renvoie l'erreur 1004...

    J'ai changé ce 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub Macro4()
     
    Sub Macro4()
        Dim Periodes, Over, Prod As Integer
        Periodes = WorksheetFunction.CountA(Sheets("Parametres").Columns("D:D")) - 1
        Over = WorksheetFunction.CountA(Sheets("Parametres").Columns("O:O")) - 2
        Prod = WorksheetFunction.CountA(Sheets("Parametres").Columns("A:A")) - 1
            If Over = 0 Then
                Over = 1
                Else
            End If
            For i = 0 To Prod - 1
            Sheets("PARAMETRES").Cells(i + 3, 1).Copy
                Sheets("PREPA").Select
                Range(Cells(i * Periodes + 1, 6), Cells((i + 1) * Periodes, 6)).Select
                ActiveSheet.Paste
            Sheets("PARAMETRES").Cells(i + 3, 2).Copy
                Sheets("PREPA").Select
                Range(Cells(i * Periodes + 1, 8), Cells((i + 1) * Periodes, 8)).Select
                ActiveSheet.Paste
            Sheets("PARAMETRES").Select
                Range(Cells(3, 4), Cells(Periodes + 2, 7)).Copy
                Sheets("PREPA").Select
                Range(Cells(i * Periodes + 1, 2), Cells((i + 1) * Periodes, 5)).Select
                ActiveSheet.Paste
            Sheets("PARAMETRES").Select
                Range(Cells(3, 8), Cells(Periodes + 2, 8)).Copy
                Sheets("PREPA").Select
                Range(Cells(i * Periodes + 1, 7), Cells((i + 1) * Periodes, 7)).Select
                ActiveSheet.Paste
            Sheets("PARAMETRES").Select
                Range(Cells(3, 9), Cells(Periodes + 2, 10)).Copy
                Sheets("PREPA").Select
                Range(Cells(i * Periodes + 1, 9), Cells((i + 1) * Periodes, 10)).Select
                ActiveSheet.Paste
            Next i
        Range(Cells(1, 1), Cells(Prod * Periodes * Over, 1)).Borders.Value = 1
        Range(Cells(1, 20), Cells(Prod * Periodes * Over, 20)).Borders.Value = 1
            Sheets("PREPA").Cells.Cut
                Workbooks.Add
                Cells.Select
                ActiveSheet.Paste
                Sheets("Feuil1").Range("A1").Select
                Sheets("Feuil1").Name = "promo"
            Application.DisplayAlerts = False
            Sheets(Array("Feuil2", "Feuil3")).Delete
            Sheets("promo").Select
    End Sub
     
     
     
    End Sub
    En :

    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
    Sub Macro4()
        Dim Periodes, Over, Prod As Integer
        Periodes = WorksheetFunction.CountA(Sheets("Parametres").Columns("D:D")) - 1
        Over = WorksheetFunction.CountA(Sheets("Parametres").Columns("O:O")) - 2
        Prod = WorksheetFunction.CountA(Sheets("Parametres").Columns("A:A")) - 1
            If Over = 0 Then
                Over = 1
                Else
            End If
            For i = 0 To Prod - 1
            Sheets("PARAMETRES").Cells(i + 3, 1).Copy Destination:=Sheets("PREPA").Range(Cells(i * Periodes + 1, 6), Cells((i + 1) * Periodes, 6))
            Sheets("PARAMETRES").Cells(i + 3, 2).Copy Destination:=Sheets("PREPA").Range(Cells(i * Periodes + 1, 8), Cells((i + 1) * Periodes, 8))
            Sheets("PARAMETRES").Range(Cells(3, 4), Cells(Periodes + 2, 7)).Copy Destination:=Sheets("PREPA").Range(Cells(i * Periodes + 1, 2), Cells((i + 1) * Periodes, 5))
            Sheets("PARAMETRES").Range(Cells(3, 8), Cells(Periodes + 2, 8)).Copy Destination:=Sheets("PREPA").Range(Cells(i * Periodes + 1, 7), Cells((i + 1) * Periodes, 7))
            Sheets("PARAMETRES").Range(Cells(3, 9), Cells(Periodes + 2, 10)).Copy Destination:=Sheets("PREPA").Range(Cells(i * Periodes + 1, 9), Cells((i + 1) * Periodes, 10))
            Next i
        Range(Cells(1, 1), Cells(Prod * Periodes * Over, 1)).Borders.Value = 1
        Range(Cells(1, 20), Cells(Prod * Periodes * Over, 20)).Borders.Value = 1
            Sheets("PREPA").Cells.Cut
                Workbooks.Add
                Cells.Select
                ActiveSheet.Paste
                Sheets("Feuil1").Range("A1").Select
                Sheets("Feuil1").Name = "promo"
            Application.DisplayAlerts = False
            Sheets(Array("Feuil2", "Feuil3")).Delete
            Sheets("promo").Select
    End Sub
    J'ai tout mis au cas où car il y a des variables et des incrémentations mais les changement sn econcernent que les lignes 13 à 35 transformées en lignes 11 à 15.
    Je précise que je suis sur Excel 2003.
    A part ça, le code est optimal non ?


    PS : Je compte changer le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Sheets("PREPA").Cells.Cut
                Workbooks.Add
                Cells.Select
    Une fois que j'aurais compris comment fonctionne le =:destination.

  6. #6
    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 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avant de lire l'ensemble de ton fil, je constate que tu as une procédure subMacro4() imbriquée dans l'autre qui porte le même nom.
    1. On ne peut pas imbriquer des procédures
    2. On peut pas utiliser dans un même projet, des procédures portant le même nom.
    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

  7. #7
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut Code
    Salut,

    Désolé de voir que tu ne tiens pas compte de ce qui est écrit plus haut.
    Encore
    - des "Select"
    - des répétions d'Objet ou de Méthode Parent (With...End With non employée). Cette dernière peut s'employer également pour les fonctions.
    - un manque de structure dans l'écriture (For...Next)

    Quant à la méthode "Copy", voir l'aide en ligne.
    "Destination:=" peut être tacite, mais son écriture facilite la lecture du code.

    Quant à la dernière partie, à partir de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("PREPA").Cells.Cut
    Elle peut être vantageusement remplacée par la création d'un nouveau classeur à partir d'une feuille. Reste pour toi à chercher coment faire. (La méthode tient en une ligne. Je reste volontairement tacite).

    Une fois que tu auras tenu compte de ces simples remarques, reviens si nécessaire.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut
    Merci pour vos réponse, je pense avoir suivie vos conseils cette fois-ci :


    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
    Sub Macro4()
        Dim PARA, QARA As Worksheet
        Set PARA = Worksheets("PARAMETRES")
        Set QARA = Worksheets("PREPA")
        Dim Periodes, Over, Prod As Integer
        QARA.Cells.Delete
        Periodes = WorksheetFunction.CountA(PARA.Columns("D:D")) - 1
        Over = WorksheetFunction.CountA(PARA.Columns("O:O")) - 2
        Prod = WorksheetFunction.CountA(PARA.Columns("A:A")) - 1
            If Over = 0 Then
                Over = 1
                Else
            End If
            For i = 0 To Prod - 1
                With PARA
                    .Cells(i + 3, 1).Copy Destination:=QARA.Range(QARA.Cells(i * Periodes + 1, 6), QARA.Cells((i + 1) * Periodes, 6))
                    .Cells(i + 3, 2).Copy Destination:=QARA.Range(QARA.Cells(i * Periodes + 1, 8), QARA.Cells((i + 1) * Periodes, 8))
                    .Range(Cells(3, 4), PARA.Cells(Periodes + 2, 7)).Copy Destination:=QARA.Range(QARA.Cells(i * Periodes + 1, 2), QARA.Cells((i + 1) * Periodes, 5))
                    .Range(Cells(3, 8), PARA.Cells(Periodes + 2, 8)).Copy Destination:=QARA.Range(QARA.Cells(i * Periodes + 1, 7), QARA.Cells((i + 1) * Periodes, 7))
                    .Range(Cells(3, 9), PARA.Cells(Periodes + 2, 10)).Copy Destination:=QARA.Range(QARA.Cells(i * Periodes + 1, 9), QARA.Cells((i + 1) * Periodes, 10))
                End With
            Next i
        With QARA
            .Range(.Cells(1, 1), .Cells(Prod * Periodes * Over, 1)).Borders.Value = 1
            .Range(.Cells(1, 20), .Cells(Prod * Periodes * Over, 20)).Borders.Value = 1
            .copy
        End With
        ActiveWorkbook.SaveAs ("C:\Documents and Settings\dossier\promo")
    End Sub

    J'ai utilisé with, j'ai utilisé les variables objet, et j'ai trouvé (après environ 10H à m'énerver) la bête erreur qui se trouvait dans mes copier/coller.

    J'ai églament préféré un nettoyage de la feuille PREPA en début de macro plutot que la fonction couper à la fin.

    Ce code est-il optimisé ?

    Moi, j'ai l'impression qu'il va beaucoup plus vite. Mais utiliser le with m'a ajouté deux lignes de code. Est-ce donc l'optimiser ?

  9. #9
    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 773
    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 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Bien que j'ai lu dans que With... End With accélérait les procédures je n'ai pas encore pu le constater mais c'est plus propre comme code et c'est plus simple à maintenir.
    Alors je constate dans ces lignes que le Else ne sert à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Over = 0 Then
                Over = 1
                Else
            End If
    donc sur une ligne c'est plus simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Over = 0 Then Over = 1
    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

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut
    Ok merci pour vos conseils en tout cas mes macros vont beaucoup plus vite et reussissent à traiter beaucoup plus de données ! Dans le doute je continue à mettre le with/end with du coup !

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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