jessiej
Messages postés5Date d'inscriptionvendredi 11 mai 2012StatutMembreDernière intervention11 mai 2012
-
11 mai 2012 à 11:12
jessiej
Messages postés5Date d'inscriptionvendredi 11 mai 2012StatutMembreDernière intervention11 mai 2012
-
11 mai 2012 à 14:28
Bonjour tout le monde ,
Je suis en train de développer un petit logiciel pour mon boulot et je suis face a un sacré problème ( a vrai dire je suis passablement énervée ! )
Voila le topo :
Mon fichier récap devra regrouper un synoptique des bâtiments .
Donc en fonction du nombre d'étage et de logement par palier , il va me copier une plage(correspond à un logement ) plusieurs fois afin d'obtenir le m^me schéma que le batiement d'origine
Cette opération est particulièrement longue ,et je souhaite l'accélérer en utilisant par exemple le screenupdating mais cette fonction se désactive durant le programme et du coup excel tourne pendant plusieurs heures pour réussir a générer ces feuilles .
Voila un exemple de mon code
SI quelqu'un peut me filer un tout petit coup de main ce serait vraiment sympa :
Private Sub CommandButton2_Click()
With Sheets("typologie des bâtiments")
Application.ScreenUpdating = False
i correspond au nom de chaque bâtiment
Dim i As Integer
For i = 9 To 30
Dim snom As String
snom = Sheets("typologie des bâtiments").Cells(i, 1).Value
si le nom , le nombre d'étage et le nombre de logements par palier du bâtiment ne sont pas vide
If Sheets("typologie des bâtiments").Cells(i, 1) <> "" And Sheets("typologie des bâtiments").Cells(i, 3) <> "" And Sheets("typologie des bâtiments").Cells(i, 6) <> "" Then
copier la feuille modèle et la renommer du nom du bâtiemnt
Sheets("modèle").Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = snom
Sheets(snom).Range("AM3").Value = "Bâtiment" & snom
sélectionner la plage correspondant à un logement et la copier
Dim setage As Integer
Dim slog As Integer
setage = Sheets("typologie des bâtiments").Cells(i, 3) + 1
slog = Sheets("typologie des bâtiments").Cells(i, 6)
Dim llign As Integer
Dim kcolo As Integer
Sheets(snom).Range("B8:T16").Copy
For llign = 18 To setage * 10 Step 10
For kcolo = 2 To slog * 22 Step 22
Next kcolo
Next llign
Application.ScreenUpdating = True
End If
Masquer les premieres lignes
Dim jintro As Integer
For j = 8 To 17
Rows(j).Hidden = True
Next j
copier la légende en pied de page
Sheets(snom).Range("C300:T300").Select
Selection.Copy
Dim sl As Integer
For sl = 2 To Sheets("typologie des bâtiments").Cells(i, 6) * 22 Step 22
Sheets(snom).Cells(300, sl + 1).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
ActiveSheet.Paste
Next sl
masquer les lignes vides
Dim z As Integer
For z = (setage * 11) + 1 To 299
Rows(z).Hidden = True
Next z
définir la zone d'impression
ActiveSheet.PageSetup.PrintArea = Range("A1", Cells(300, slog * 23))
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 11 mai 2012 à 11:22
Bonjour,
mais je vois une boucle après que tu as rétabli l'affichage !
For sl = 2 To Sheets("typologie des bâtiments").Cells(i, 6) * 22 Step 22
Et elle "fait du boulot", non ? ===>> modifie les affichages et en plus de manière "hussarde" avec des "select", "copy", "paste"... tout l'arsenal à éviter
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
MarcPL
Messages postés172Date d'inscriptionjeudi 8 décembre 2011StatutMembreDernière intervention21 juillet 20132 11 mai 2012 à 11:38
Bonjour !
Le monsieur veut dire qu'il n'est pas nécessaire de faire un .select pour effectuer un .copy ou un .paste,
par exemple c'est plus rapide de faire directement un range.copy ...
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 11 mai 2012 à 11:38
oui la boucle fait du boulot mais c'est surtout pour la premiere partie du code que j'ai besoin d'un screenupdating ...
et ce "boulot" modifie l'affichage constamment (er ralentis à mort)!
ne remets l'affichage qu'une fois ce boulot terminé !
Par contre , je suis pas hyper calée en VBA et là je comprends pas tes conseils
Comment éviter tout cet arsenal...
On ne sélectionne pas pour ensuite travailler avec une sélection, activer, se positionner, coller, etc ... !
On travaille directementr avec les objets !
Exemple :
1) de code mal super mal écrit et ultra-ralentisseur :
voilà !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Vous n’avez pas trouvé la réponse que vous recherchez ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
jessiej
Messages postés5Date d'inscriptionvendredi 11 mai 2012StatutMembreDernière intervention11 mai 2012 11 mai 2012 à 11:59
Merci ca va déja beaucoup plus vite ...
Mais j'ai trouvé d'ou viens mon problème de application.screenupdating
J'ai créer un Workbook_change et un workbook_calculate afin de colorer certaines cellules ....
Est il possible de désactiver ces evenements jusque la fin de ma macro ????
MarcPL
Messages postés172Date d'inscriptionjeudi 8 décembre 2011StatutMembreDernière intervention21 juillet 20132 11 mai 2012 à 12:07
En début de macro : Application.EnableEvents = False
En fin de macro : Application.EnableEvents = True
Précision : si une erreur survient avant la remise à True, dans le cas où il n'y a pas de gestion d'erreurs,
plus aucun événement ne se déclenchera alors ...
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 11 mai 2012 à 13:49
Bonjour, MarcPL,
Pourquoi dis-tu cela ?
regarde : ===>>
Application.ScreenUpdating = False
On Error Resume Next
toto = 3 / 0 ' on provoque ici une erreur (division par 0)
If Err > 0 Then
MsgBox "erreur"
On Error GoTo 0
End If
Application.ScreenUpdating = True
Application.ScreenUpdating n'inhibe pas Application.DisplayAlerts !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ