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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé
    Inscrit en
    Mai 2009
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 74
    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 confirmé
    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 : 67
    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
    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

  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
    13 173
    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 : 13 173
    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 confirmé
    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
    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
    13 173
    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 : 13 173
    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 confirmé
    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 : 67
    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
    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.

+ 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