Application.screenupdating se désactive

jessiej Messages postés 5 Date d'inscription vendredi 11 mai 2012 Statut Membre Dernière intervention 11 mai 2012 - 11 mai 2012 à 11:12
jessiej Messages postés 5 Date d'inscription vendredi 11 mai 2012 Statut Membre Dernière intervention 11 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

Sheets(snom).Cells(llign, kcolo).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
ActiveSheet.Paste


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))

Next i

End With
End Sub

Merci d'avance

10 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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
0
jessiej Messages postés 5 Date d'inscription vendredi 11 mai 2012 Statut Membre Dernière intervention 11 mai 2012
11 mai 2012 à 11:27
oui la boucle fait du boulot mais c'est surtout pour la premiere partie du code que j'ai besoin d'un screenupdating ...

Par contre , je suis pas hyper calée en VBA et là je comprends pas tes conseils

Comment éviter tout cet arsenal justement et pourquoi modifier les affichages ?

Merci !
0
MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
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 !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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 :
sheets("toto").activate
range("A1:B3").select
selection.copy
sheets("titi").activate
range("B2").select
selection.paste

etc ...
2) et le même, en propre et cent fois plus rapide ! :
sheets(toto").range("A1:B3").copy destination:= sheets(titi).range("B2)

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
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 mai 2012 à 11:41
Je m'énerve et oublie du coup des " avec mes gros doigts ===>>
sheets("toto").range("A1:B3").copy destination:= sheets("titi").range("B2")


________________________
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
0
jessiej Messages postés 5 Date d'inscription vendredi 11 mai 2012 Statut Membre Dernière intervention 11 mai 2012
11 mai 2012 à 11:44
Ok merci je tente ca tout de suite
0
jessiej Messages postés 5 Date d'inscription vendredi 11 mai 2012 Statut Membre Dernière intervention 11 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 ????
0
MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
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 !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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
0
jessiej Messages postés 5 Date d'inscription vendredi 11 mai 2012 Statut Membre Dernière intervention 11 mai 2012
11 mai 2012 à 14:28
et voila un programme qui tourne

MErci beaucoup à vous
0
Rejoignez-nous