Besoin d'aide d'un expert en optimisation de boucle

pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005 - 25 juil. 2005 à 12:15
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005 - 26 juil. 2005 à 11:37
Bonjour,
Voici une bout de code qu'il faut que j'optimise en terme de rapidité:

en pratique: la variable lgne_max_OHS sera de l'odre de 1500 et lgne_max_Planning de l'odre de 600

Merci de me donner vos avis d'expert afin de m'aider à optimiser (rapidité) au mieux cette boucle...

*********************************Module***************************************
Sub Macro_Compare_Cmdes_OHS_Planning()
' Déclarations des variables locales
Dim lgne_max_Planning As Integer, lgne_max_OHS As Integer
Dim i As Integer, j As Integer, k As Integer
Dim semaphore As Boolean


Application.ScreenUpdating = False
' Recuperation nb de ligne de chaque feuille
Sheets("Planning").Select
lgne_max_Planning = Range("A1").CurrentRegion.Rows.Count
Sheets("Feuil3").Select
Sheets("Feuil3").Name = "OHS"
lgne_max_OHS = Range("A1").CurrentRegion.Rows.Count

' Recopie de la ligne d'en tête
k = 1
Rows(1).Select
Selection.Copy
Sheets("Feuil1").Select
Sheets("Feuil1").Name = "Résultats de comparaison"
Rows(k).Select
ActiveSheet.Paste
k = 2


Sheets("OHS").Select

' Parcours du report provenant de OHS et récupération des commandes
For j = 2 To lgne_max_OHS


If (Worksheets("OHS").Cells(j, 1).Value <> Empty) Then
semaphore = False
'Boucle de rech de comand (indexée par j dans feuille OHS) dans feuille Planning
For i = 1 To lgne_max_Planning

If (Worksheets("Planning").Cells(i, 1).Value <> Empty) Then

If ((Worksheets("Planning").Cells(i, 1).Value <> "LUNDI") And (Worksheets("Planning").Cells(i, 1).Value <> "MARDI") And (Worksheets("Planning").Cells(i, 1).Value <> "MERCREDI") And (Worksheets("Planning").Cells(i, 1).Value <> "JEUDI") And (Worksheets("Planning").Cells(i, 1).Value <> "VENDREDI") And (Worksheets("Planning").Cells(i, 1).Value <> "SAMEDI") And (Worksheets("Planning").Cells(i, 1).Value <> "DIMANCHE")) Then


If Worksheets("Planning").Cells(i, 1).Value = Worksheets("OHS").Cells(j, 1).Value Then
semaphore = True
End If

End If

End If

Next i
If semaphore = True Then


Sheets("OHS").Select
Rows(j).Select
Selection.Copy
Sheets("Résultats de comparaison").Select
Rows(k).Select
ActiveSheet.Paste
k = k + 1 'mise à jour

End If


ElseIf (Worksheets("OHS").Cells(j, 1).Value = Empty) Then
' A La colonne 1 ligne j valeur_cell3 est vide
End If

Next j

Application.ScreenUpdating = True 'Mise à jour de l'affichage
End Sub
********************************************************************************
Merci à toute ames charitables volant à mon secours

10 réponses

cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
25 juil. 2005 à 13:15
Salut,



Je me pause une question sur les Select. Sont-ils vraiment nécessaire? Est-ce que ça fais gagner du temp de ne pas les mettre?

Autrement, la recherche de jour de la semaine valide m'a l'air bien
compliqué. C'est pas possible de filtrer la colonne avant de faire le
traitement.



Autrement, une requête, ou plutôt un script SQL ça donnerais rien?



Chris

N'oubliez pas de cloturer votre post.
0
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005
25 juil. 2005 à 14:44
Salut,

Je me pause une question sur les Select. Sont-ils vraiment nécessaire? Est-ce que ça fais gagner du temp de ne pas les mettre?

Re:qu'est ce que je dois écrire à la place des selesct

C'est pas possible de filtrer la colonne avant de faire le traitement?

Re:comment faire le filtrage?

Autrement, une requête, ou plutôt un script SQL ça donnerais rien? impossible!

Merci
0
cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
25 juil. 2005 à 15:06
Et bien, pour les Select, j'essaierai ça.



Sub Macro_Compare_Cmdes_OHS_Planning()

' Déclarations des variables locales

Dim lgne_max_Planning As Integer, lgne_max_OHS As Integer

Dim i As Integer, j As Integer, k As Integer

Dim semaphore As Boolean





Application.ScreenUpdating =
False

' Recuperation nb de ligne de chaque feuille

' Sheets("Planning").Select

lgne_max_Planning =
Sheets("Planning").Range("A1").CurrentRegion.Rows.Count

' Sheets("Feuil3").Select

Sheets("Feuil3").Name = "OHS"

lgne_max_OHS = Sheets("Feuil3").Range("A1").CurrentRegion.Rows.Count



' Recopie de la ligne d'en tête

k = 1

' Rows(1).Select

' Selection.Copy

Sheets("Feuil3").Rows(1).Copy

' Sheets("Feuil1").Select

Sheets("Feuil1").Name = "Résultats de comparaison"

'LA, JE SAIS PAS SI On PEUT FAIRE UN PASTE SPECIAL

Sheets("Feuil1").Rows(k).Select

Sheets("Feuil1").Paste

k = 2






' Sheets("OHS").Select



' Parcours du report provenant de OHS et récupération des commandes

For j = 2 To lgne_max_OHS





If (Worksheets("OHS").Cells(j, 1).Value Empty) Then

semaphore
=
False


'Boucle de rech de comand (indexée par j dans feuille OHS) dans feuille Planning

For
i = 1 To lgne_max_Planning



If
(Worksheets("Planning").Cells(i, 1).Value Empty) Then




If
((Worksheets("Planning").Cells(i, 1).Value "LUNDI") And
(Worksheets("Planning").Cells(i, 1).Value "MARDI") And
(Worksheets("Planning").Cells(i, 1).Value "MERCREDI") And
(Worksheets("Planning").Cells(i, 1).Value "JEUDI") And
(Worksheets("Planning").Cells(i, 1).Value "VENDREDI") And
(Worksheets("Planning").Cells(i, 1).Value "SAMEDI") And
(Worksheets("Planning").Cells(i, 1).Value "DIMANCHE")) Then





If
Worksheets("Planning").Cells(i, 1).Value = Worksheets("OHS").Cells(j,
1).Value Then

semaphore
= True

End
If



End
If



End
If



Next
i

If
semaphore = True Then





'
Sheets("OHS").Select

'
Rows(j).Select

'
Selection.Copy




Sheets("OHS").Rows(j).Copy

'
Sheets("Résultats de comparaison").Select

'
Rows(k).Select

'MEME REMARQUE QUE PLUS HAUT




Sheets("Résultats de comparaison").Rows(k).Select

ActiveSheet.Paste

k = k +
1 'mise
à jour



End
If





ElseIf (Worksheets("OHS").Cells(j, 1).Value = Empty) Then

'
A La colonne 1 ligne j valeur_cell3 est vide

End If



Next j



Application.ScreenUpdating = True 'Mise à jour de l'affichage

End Sub



Pour le filtrage, dans le menu données, Filtre->Filtre automatique.
Tu fais un essai de filtrage en enregistrant la macro
(Outils->Macro-> Nouvelle Macro). Adapte le code pour faire un
essai.



Pour le script SQL, tu peux utiliser XL comme une source de données
avec un connecteur OLEDB. Je l'ai fais avec un CSV. Mais ensuite, ça
devient hard.



Chris

N'oubliez pas de cloturer votre post.
0
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005
25 juil. 2005 à 16:53
Chris,
Que ve tu dire pas collage special.
D'autre part j'ai essayé avec Sheets("Résultats de comparaison").Rows(k).Select et ca me génère une erreur:
erreur d'execution 1004! la méthode select de la classe range a échoué.
je comprend pas pourkoi?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
25 juil. 2005 à 17:45
A priori, c'est normal, il faut que la feuille soit "active" ou "visible".

J'ai trouvé 2/3 info ici:

http://www.experts-exchange.com/Applications/MS_Office/Excel/Q_21476292.html



Chris

N'oubliez pas de cloturer votre post.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
25 juil. 2005 à 18:43
Salut Pier0
Tu abuses : je t'ai déjà répondu longuement sur le même post ! et tu n'as même pas effectué les modifs

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
(je
0
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005
25 juil. 2005 à 19:31
Salut Jack
Si, bien sur que j'ai effectué les modif mais je cherche encore d'autre truc car mon prog tourne tj trop lentement.
D'autre part, je t'ai posé des nouvelles questions sur le post précédant(si tu pe y jeter un oeil ca serait cool)
a+
Pier0
0
cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
26 juil. 2005 à 08:38
Si il n'y aucune cellule vide, les codes suivants sont identique :

Range("A1").CurrentRegion.Rows.Count

Range("A1").SpecialCells(xlLastCell).Row



Par contre, si une cellule est vide, la seconde ligne donne réellement la dernière ligne qui contient des infos.



Dans la doc de la méthode copy, il y a cet exemple ci:

Worksheets("Sheet1").Range("A1:D4").Copy _
        destination:=Worksheets("Sheet2").Range("E5")



C'est ce que tu fais en plusieurs lignes avec des activation de feuilles. Ca doit &#234;tre un peut plus rapide.



Ton code "
ElseIf (Worksheets("OHS").Cells(j, 1).Value = Empty)
Then" ne fait rein de particulier dans ton exemple. Faut il le garder?
Par contre, c'est claire que ca changera rien (en tout cas pas grand
chose) à tes perfs.




Sinon, tu connais les formules excel? Ce que tu fais existe peut-&#234;tre d&#233;j&#224;. Une fonction du genre "RechercheV".



Chris


N'oubliez pas de cloturer votre post.
0
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005
26 juil. 2005 à 11:24
0
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005
26 juil. 2005 à 11:37
Si il n'y aucune cellule vide, les codes suivants sont identique :
Range("A1").CurrentRegion.Rows.Count
Range("A1").SpecialCells(xlLastCell).Row 'MAIS C - RAPIDE!

Dans la doc de la méthode copy, il y a cet exemple ci:
Worksheets("Sheet1").Range("A1:D4").Copy _ destination:=Worksheets("Sheet2").Range("E5") 'JE VAIS TESTER...

Ton code "ElseIf (Worksheets("OHS").Cells(j, 1).Value = Empty) Then" ne fait rein de particulier dans ton exemple. Faut il le garder? Par contre, c'est claire que ca changera rien (en tout cas pas grand chose) à tes perfs.JE L'AI
VIRé


Sinon, tu connais les formules excel? Ce que tu fais existe peut-être déjà. Une fonction du genre "RechercheV". 'MOI G PAS ESSAYé MAIS g 1 COLLèGUE QUI A ESSAYé ET CA A L'AIR + LENT QUE MON PROG...

MERCI A TOI Chris
pier0
0