Exécution trés lente d'une macro

kaiser

XLDnaute Occasionnel
Bonjour

Y a quelques semaines de ca, (avec bcp d'aide venant de ce forum) j'ai pu réalisé une macro qui faisait ce que je voulais comme je le voulais.
Seulement, maintenant que je veut la mettre en place pour qu'elle soit utilisée, elle met un temps fou à s'executer! Je n'est pourtant pas modifié grand chose (quelque noms, et numeros de cellules), et avant mes deux semaines de vacances il me semblait qu'elle éarchait normalement.
Je met le code si dessous, dans l'espoir que je vous puissiez reperer une coquille qui la ralentirais (car même sur une feuille vide, son éxécution met 30 à 40sec!)

Code:
Private Sub CommandButton1_Click()

Dim Cell As Range
Dim flag As Boolean
Dim myarray(15) As String

feuille = ActiveSheet.Name
Application.ScreenUpdating = False

For n = 8 To Range("B65536").End(xlUp).Row Step 2
If n = 14 Then n = 15
If n = 23 Then n = 26
If n = 30 Then n = 31
If n = 41 Then n = 42
Workbooks.Open "G:\chemin d'acces\fiche remplacement vierge.xls"
Workbooks("2007team1.xls").Activate
Set plage_date = Range("D" & n & ":AG" & n)

i = 6

   For Each Cell In plage_date
    If Cell.Interior.ColorIndex = 6 Or Cell.Interior.ColorIndex = 38 Then
    Application.ScreenUpdating = True
    Application.Calculation = xlManual
    If Not Cell.Comment Is Nothing Then Cell.Comment.Visible = True
    flag = True
    
        
i = i + 1
    nom = Range("B" & n)
    prenom = Range("B" & n + 1)
    heure = Cell.Value
    jour = Cells(6, Cell.Column)
      
     Application.ScreenUpdating = False
         Select Case feuille
         Case "JAN"
         mois = "Janvier"
         ....
         Case "DEZ"
         mois = "Décembre"
         End Select
         
    Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Range("G3") = mois
    Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Cells(i, 2) = heure
    Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Cells(i, 4) = jour & " " & mois

    remplace = InputBox("Entrez le nom de la personne remplacée le " & jour & " " & mois & " par " & prenom & " " & nom, "Remplacement", lastname, 9960, 330)
    Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Cells(i, 5) = remplace
    lastname = remplace
    If Cell.Interior.ColorIndex = 38 Then
    poste = "Neutra"
    Else
    poste = InputBox("Entrez le poste", "Remplacement", lastposte, 9960, 330)
    lastposte = poste
    End If
    Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Cells(i, 6) = poste
    If Not Cell.Comment Is Nothing Then Cell.Comment.Visible = False
 End If
Next Cell
If flag Then

Workbooks("fiche remplacement vierge.xls").Sheets("sheet1").Range("E4") = prenom & " " & nom
Workbooks("fiche remplacement vierge.xls").Sheets("sheet1").Range("E4").Borders.LineStyle = xLineStyleNone
Workbooks("fiche remplacement vierge.xls").Sheets("sheet1").Range("E30") = "Fait le " & Date
Workbooks("fiche remplacement vierge.xls").Sheets("sheet1").Range("E30").Font.Bold = True
Filename = "remplacement " & mois & " " & nom & ".xls"
Workbooks("fiche remplacement vierge.xls").SaveAs "C:\Documents and Settings\" & Application.UserName & "\My Documents\Remplacement" & Filename
myarray(j) = Filename
j = j + 1
End If
flag = False
Next n
Workbooks("fiche remplacement vierge.xls").Close
Application.EnableEvents = True

reponse = MsgBox("Voulez-vous imprimer les fiches de remplacements?", vbYesNo + vbQuestion, "Impression Fiche de Remplacement")
If reponse = 6 Then
    j = 0
    Do Until myarray(j) = ""
    Workbooks(myarray(j)).PrintOut
    j = j + 1
    Loop
End If

Line1:
Application.Calculation = xlAutomatic
End Sub
 

porcinet82

XLDnaute Barbatruc
Re : Exécution trés lente d'une macro

Salut,

Je viens de jeter un oeil a ton code et quelques truc m'ont paru un peu bizarre, je les aient donc mis en commentaire (conseil : copie colle le code dans vba pour que ce soit plus lisible).
Code:
Private Sub CommandButton1_Click()
Dim Cell As Range
Dim flag As Boolean
Dim myarray(15) As String
feuille = ActiveSheet.Name
Application.ScreenUpdating = False
For n = 8 To Range("B65536").End(xlUp).Row Step 2
    Select Case n
    Case 14, 30, 40
        n = n + 1
    Case 23
        n = n + 3
    End Select
    Workbooks.Open "G:\chemin d'acces\fiche remplacement vierge.xls"
    Workbooks("2007team1.xls").Activate
    Set plage_date = Range("D" & n & ":AG" & n)
    
    i = 6
    
        For Each Cell In plage_date
            If Cell.Interior.ColorIndex = 6 Or Cell.Interior.ColorIndex = 38 Then
                Application.Calculation = xlManual
                If Not Cell.Comment Is Nothing Then Cell.Comment.Visible = True
                flag = True
                
            'pourquoi le i est initialiser a 6 dans la boucle n?
            'cela signifie qu'a chaque tour de n, tu refais la meme
            'chose pour i=6, ce qui n'a, je pense aucun sens
            i = i + 1
                nom = Range("B" & n)
                prenom = Range("B" & n + 1)
                heure = Cell.Value
                jour = Cells(6, Cell.Column)
                  
                 Application.ScreenUpdating = False
                 Select Case feuille
                 Case "JAN"
                 mois = "Janvier"
                 '....
                 Case "DEZ"
                 mois = "Décembre"
                 End Select
                     
                With Workbooks("fiche remplacement vierge.xls")
                    .Worksheets("sheet1").Range("G3") = mois
                    .Worksheets("sheet1").Cells(i, 2) = heure
                    .Worksheets("sheet1").Cells(i, 4) = jour & " " & mois
                End With
            
                remplace = InputBox("Entrez le nom de la personne remplacée le " & jour & " " & mois & " par " & prenom & " " & nom, "Remplacement", lastname, 9960, 330)
                Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Cells(i, 5) = remplace
                lastname = remplace
                If Cell.Interior.ColorIndex = 38 Then
                    poste = "Neutra"
                Else
                    poste = InputBox("Entrez le poste", "Remplacement", lastposte, 9960, 330)
                    lastposte = poste
                End If
                Workbooks("fiche remplacement vierge.xls").Worksheets("sheet1").Cells(i, 6) = poste
                If Not Cell.Comment Is Nothing Then Cell.Comment.Visible = False
             End If
        Next Cell
    If flag Then
        With Workbooks("fiche remplacement vierge.xls").Sheets("sheet1")
            .Range("E4") = prenom & " " & nom
            .Range("E4").Borders.LineStyle = xLineStyleNone
            .Range("E30") = "Fait le " & Date
            .Range("E30").Font.Bold = True
        End With
        Filename = "remplacement " & mois & " " & nom & ".xls"
        Workbooks("fiche remplacement vierge.xls").SaveAs "C:\Documents and Settings\" & Application.UserName & "\My Documents\Remplacement" & Filename
        myarray(j) = Filename
        j = j + 1
    End If
    flag = False
Next n
Workbooks("fiche remplacement vierge.xls").Close
Application.EnableEvents = True
reponse = MsgBox("Voulez-vous imprimer les fiches de remplacements?", vbYesNo + vbQuestion, "Impression Fiche de Remplacement")
If reponse = 6 Then
    j = 0
    Do Until myarray(j) = ""
    Workbooks(myarray(j)).PrintOut
    j = j + 1
    Loop
End If
Application.ScreenUpdating = True
'Il sert a quoi ce Line1: ???
'Line1:
Application.Calculation = xlAutomatic
End Sub

En attendant quelques explications de ta part.

@+
 

kaiser

XLDnaute Occasionnel
Re : Exécution trés lente d'une macro

Salut

Alors le i est initialisé a 6 dans la boucle n car en fait chaque "tour" de n correspond a une personne, et le i correspond a la ligne dans laquelle le programme doit commencer a remplir la feuille vierge (la 6éme en l'occurence) et vu qu' il y a une feuille par personne...

concernant le line 1, a la base c'est un membre du fofo qui me l'avais conseillé (dans un truc genre "if XXX goto Line1") mais vu le nombre de modification subis par le code, il n'a plus d'interet ( cependant je ne pense pas que ce soti ca qui ralentisse tout)
 

kaiser

XLDnaute Occasionnel
Re : Exécution trés lente d'une macro

je pense qu'un bon moyen d'accelerer la macro serait de passer l'ouverture de la feuille vierge avant la boucle "for n", mais si je fais ca, j'ai un "script out of range" au niveau de la partie ci dessous:
Code:
With Workbooks("fiche remplacement vierge.xls")
                    .Worksheets("sheet1").Range("G3") = mois
                    .Worksheets("sheet1").Cells(i, 2) = heure
                    .Worksheets("sheet1").Cells(i, 4) = jour & " " & mois
                End With
 

porcinet82

XLDnaute Barbatruc
Re : Exécution trés lente d'une macro

Salut,

Désolé, mais j'ai beau avoir regardé a nouveau ton code, je ne vois pas trop comment l'optimiser.
Peut etre qu'il faudrait complétement repensé le code selon la structure de ton fichier.

@+
 

kaiser

XLDnaute Occasionnel
Re : Exécution trés lente d'une macro

ok ben tant pis alors...

sont qu'a avoir de vrais pc aussi à la boite...600mhz/64mo ca méne pas bien loin...

ENfin bref, par contre j'ai un autre probléme dus à mon inexpériecne en VBA:
à la fin du programme j'ai "Workbooks("fiche remplacement vierge.xls").Close", seulement suivant commetn est remplis le fichier source, il se peut qu'a la fin il n'y est pas ce fichier d'ouvert (d'ou une erreur de script).
Comment faire pour contourner ce probléme?
 

porcinet82

XLDnaute Barbatruc
Re : Exécution trés lente d'une macro

re,

Tu n'as qu'a mettre un truc de ce genre :
On Error Resume Next
Workbooks("fiche remplacement vierge.xls").Close


Se code permet d'invalider la ligne qui pose problème et passe donc a la suivante.

@+
 

kaiser

XLDnaute Occasionnel
Re : Exécution trés lente d'une macro

re

merci pour ton aide, mais j'ai trouvé une solution qui régle mes deux pb: je deplace l'ouverture de la feuille vierge dans la condition qui chek les couleur au lieu de le laisser dans la boucle.
Comme ca le fichier ne s'ouvre pas pour rien, dc pas de message d'erreur et gain de temps à l'éxécution aussi.

Merci de t'être penché sur mon probléme
 

kaiser

XLDnaute Occasionnel
Re : Exécution trés lente d'une macro

Bonjour le forum

en fait j'ai dis une connerie, mettre l'ouverture dans la condition ca le fais ouvrir a chaque fois que la condition est vrai, et dc ca va pas.

Y a pas un moyen de le faire ouvrir que si la condition est vraie, mais une seule fois dans la boucle? ou alors faut refaire une autre condition?
 

porcinet82

XLDnaute Barbatruc
Re : Exécution trés lente d'une macro

Salut,

Comme je ne saisie pas tres bien dans quelle condition tu as mis l'ouverture de fichier, je ne peux pas t'aider a modifier ton bout de code, meme si je suppose que rajouter une condition serai la solution.

Sinon, tu peux aller voir ici ou la, tu trouveras des bouts de code qui permettent de savoir si ton classeur est deja ouvert, et donc de ne pas l'ouvrir si c'est deja le cas.
A toi d'adapter un peu...

@+
 

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote