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 :

Boucles For Each Next: problème de défilement des feuilles avec lenteur d'exécution [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Boucles For Each Next: problème de défilement des feuilles avec lenteur d'exécution
    Bonjour,
    J'ai une macro avec boucle for each next que je viens de confectionner après beaucoup d'efforts (je suis débutante en VBA) et qui fonctionne bien.
    Le seul problème est le suivant: lorsque j'exécute cette macro, les feuilles commencent à défiler une à une, ralentissant l'exécution des commandes et l'affichage des résultats. Je suis consciente que le code utilisé doit certainement être trop "lourd".
    Le classeur est constitué de plusieurs feuilles, dont une feuille de synthèse "BD". Plusieurs feuilles sont nommées "service*": service administratif, achat, vente,etc. Les données de ces feuilles devaient être regroupées dans la feuille BD sous forme de tableau.
    Ma question est la suivante: j'aimerais beaucoup que vous m'aidiez s'il vous plait à trouver une forme plus légère et plus rapide.
    Je vous remercie d'avance pour votre temps et vos efforts

    Le code est le suivant:
    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
    Sub MacroFINALEssai()
    '
    Dim numLigneVideUn As Integer
    Dim ws As Worksheet
     
        Sheets("BD").Select
        Cells.Select
        Selection.ClearContents
        Range("A1").Select
        ActiveCell.FormulaR1C1 = "Nom Matériel"
        Range("B1").Select
        Sheets("Service Administration").Select
        Range("A600:A612").Select
        Selection.Copy
        Sheets("BD").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        Application.CutCopyMode = False
     
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name Like "Service*" Then
        Sheets(ws.Name).Select
           Range("B1", Range("B1").End(xlToRight)).Select
           Selection.Copy
         Sheets("BD").Activate
        'on trouve la dernière ligne vide de la colonne A et on enregistre le numéro de la ligne dans la variable numLigneVide
        numLigneVide = Range("A65536").End(xlUp).Row + 1
        ActiveSheet.Cells(numLigneVide, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        Application.CutCopyMode = False
        Sheets(ws.Name).Select
           Range("B600:B612", Range("B600:B612").End(xlToRight)).Select
           Selection.Copy
         Sheets("BD").Activate
        'on trouve la dernière ligne vide de la colonne B et on enregistre le numéro de la ligne dans la variable numLigneVide
        numLigneVide = Range("B65536").End(xlUp).Row + 1
        ActiveSheet.Cells(numLigneVide, 2).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        Application.CutCopyMode = False
        Sheets(ws.Name).Select
        Range("B3").Select
     
     
    End If
    Next
    Sheets("Sommaire").Select
    End Sub

  2. #2
    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, déjà commencer par supprimer tous les select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Sheets("BD").Select
        Cells.Select
        Selection.ClearContents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Sheets("BD").Cells.ClearContents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Range("A600:A612").Select
        Selection.Copy
        Sheets("BD").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        Application.CutCopyMode = False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A600:A612").Copy Sheets("BD").Range("A1") ' ????
    etc etc .....

    Sans oublier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Application.ScreenUpdating = False
        ' .....
        Application.ScreenUpdating = True

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Une proposition sur ton code, à adapter éventuellement
    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 MacroFINALEssai()
    Dim Ws As Worksheet
     
    Application.ScreenUpdating = False
    With Worksheets("BD")
        .UsedRange.Clear
        .Range("A1") = "Nom Matériel"
        .Range("B1:B13").Value = Worksheets("Service Administration").Range("A600:A612").Value
     
        For Each Ws In ThisWorkbook.Worksheets
            If Ws.Name Like "Service*" Then
                CopieTransp .Name, 1, Ws.Range("B1", Ws.Range("B1").End(xlToRight))
                CopieTransp .Name, 2, Ws.Range("B600:B612", Ws.Range("B600:B612").End(xlToRight))
            End If
        Next Ws
    End With
    End Sub
     
     
    Private Sub CopieTransp(ByVal FeuilDest As String, ByVal ColDest As Byte, RngSce As Range)
    Dim NewLig As Long
     
    With ThisWorkbook.Worksheets(FeuilDest)
        NewLig = .Cells(.Rows.Count, ColDest).End(xlUp).Row + 1
        RngSce.Copy
        .Cells(NewLig, ColDest).PasteSpecial Paste:=xlValues, Transpose:=True
        Application.CutCopyMode = False
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci les amis pour votre réponse et votre aide précieuse.
    Grâce à vous le problème est résolu!
    Mercatog, merci pour la solution, je n'ai eu pour l'adapter qu'à remplacer:
    - la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B1:B13").Value = Worksheets("Service Administration").Range("A600:A612").Value
    - par la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("B1:N1").Value =Application.Transpose(Worksheets("Service Administration").Range("A600:A612").Value)
    Car il me fallait un collage transposé.
    Je vous souhaite Joyeux Noël et de bonnes fêtes de fin d'année.
    Et encore une fois merci!

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

Discussions similaires

  1. Lenteur d'une boucle For each next
    Par Val2000 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 27/05/2013, 11h41
  2. [XL-2003] boucle For each Next
    Par facteur dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/11/2009, 16h41
  3. boucle for each next : sauter une valeur
    Par scavenger dans le forum VBScript
    Réponses: 1
    Dernier message: 18/02/2009, 10h15
  4. Boucle For Each Next non entrée
    Par Kareg dans le forum VBA Access
    Réponses: 9
    Dernier message: 21/05/2008, 14h35
  5. [VBA-E]PB sur une boucle for each next
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/07/2006, 15h47

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