Désactiver le rafraichissement d'un ecran
Bonjour à tous, j'ai une macro qui récupère différents éléments sur une série de plusieurs onglets et qui va ensuite remplir un autre fichier excell
le tout sur une boucle d'itérations qui peut parfois représenter entre 20 et 50 boucles ce qui provoque de nombreux basculement de l'écran d'un fichier à l'autre
J'ai essayé d'utiliser la fonction Application.ScreenUpdating = Fase pendant cette phase mais sans succès je ne parviens pas à "figer l'écran"
Ci dessous l'extrait de la partie concernée de mon code si quelqun à une idée de ce que j'ai loupé
Merci d'avance pour toute aide et bonne journée à tous
'Récupération des nom valideur et responsable d'action
UsrValideurResponsable.Show
Do While UsrValideurResponsable.Visible = True
DoEvents
Loop
'désactivation de l'écran
Application.ScreenUpdating = False
'puis récupération sur les case de skid
Worksheets("Skid").Activate
colc = Range("G92").Value
coli = Range("G93").Value
Worksheets("En_cours").Activate
colf = Range("A1").Value
For j = 13 To i
'test si ligne d'entete
If Range("B" & j).Value = "Problème décelé" Then
'entete, je saute 2 lignes"
j = j + 2
Else
'je teste si c'est une action soldée
If Range("J" & j).Value = "X" Or Range("J" & j).Value = "x" Then test = True
If test = False Then
'Balayage de chaque ligne et récupération de la valeur
cellule = "B" + Right(Str(j), 2)
cellule1 = "C" + Right(Str(j), 2)
action = Range(cellule).Value
'copie dans le plan d'action
'en premier je test si la case action est pleine ou non
If action <> "" Then
'la cellule n'est pas vide je copie
'Ecriture du N° de point jaune
Worksheets("Skid").Activate
Range("G97").Value = jaune
Worksheets("En_cours").Activate
'activation du fichier validation
Workbooks("validations.xlsx").Activate
'ecriture des lignes fixes
Range("A" & lig).Value = cola
Range("B" & lig).Value = colb
Range("C" & lig).Value = colc
Range("F" & lig).Value = colf
Range("I" & lig).Value = coli
'activation du fichier actuel
ThisWorkbook.Activate
'récupération des lignes changeantes
colg = Range("A" & j).Value + " : " + Range("B" & j).Value
'recupération de la couleur de texte
couleur = Range("B" & j).Font.ColorIndex
colh = Range("E" & j).Value
'réactivation du fichier de plan d'action
Workbooks("validations.xlsx").Activate
'écritures des colonnes changeantes
Range("H" & lig).Value = colh
Range("G" & lig).Value = colg
'report de la couleur de texte
Range("G" & lig).Font.ColorIndex = couleur
'activation du fichier actuel
ThisWorkbook.Activate
'Ajout d'un point jaune si nécessaire
If Range("H" & j).Value = "J" Or Range("H" & j).Value = "j" Then
'activation du fichier de validation
Workbooks("validations.xlsx").Activate
'critures des cases spécifiques au points jaunes
Range("D" & lig).Value = "Point jaune"
Range("D" & lig).Interior.ColorIndex = 6
'activation du fichier actuel
ThisWorkbook.Activate
DateValiditePointJaune.Show
Do While DateValiditePointJaune.Visible = True
DoEvents
Loop
'récupération de la date limite du point jaune
Worksheets("Skid").Activate
datelimite = Range("G98").Value
'activation du fichier de validation
Workbooks("validations.xlsx").Activate
Range("E" & lig).Value = datelimite
jaune = jaune + 1
End If
'Ajout d'un point rouge si nécessaire
If Range("H" & j).Value = "R" Or Range("H" & j).Value = "r" Then
'activation du fichier de validation
Workbooks("validations.xlsx").Activate
'ecritures des cases spécifiques au points jaunes
Range("D" & lig).Value = "Point rouge"
Range("D" & lig).Interior.ColorIndex = 3
'activation du fichier actuel
ThisWorkbook.Activate
End If
'passage à la ligne suivante
lig = lig + 1
'réactivation du fichier actuel
ThisWorkbook.Activate
Worksheets("En_cours").Activate
End If
End If
'réinitialisation du test
test = False
End If
Next j
'fermeture du plan d'action
Workbooks("validations.xlsx").Close SaveChanges:=True
'réactivation de l'écran
Application.ScreenUpdating = TrueBonjour,
essayez de ne pas utiliser les "activate" des feuilles.
Par exemple :
Worksheets("Skid").Activate
colc = Range("G92").Value
coli = Range("G93").Valuepourrait (devrait) être remplacé par :
colc = Worksheets("Skid").Range("G92").Value
coli = Worksheets("Skid").Range("G93").Valueet si vous faites ceci pour tout en spécifiant le classeur et la feuille que ce soit pour la copie ou l'écriture, alors peut-être qu'il n'y aura plus de scintillement...
Et vous gagnerez en rapidité.
Après pour une facilité de lecture et raccourcir les lignes de code, vous pouvez aussi attribuer à des variables les différents classeurs et feuilles de travail :
Set WsS = Worksheets("Skid") ' feuille Source
Set WsD = Worksheets("En_Cours") ' feuille Destination@ bientôt
LouReeD
Bonjour LouReeD et merci de la réponse rapide, je vais essayer cette option
J'avais également pensé à afficher une fenêtre avec barre de progression mais je ne parviens pas à faire continuer le code en parallèle cela dépasse probablement mes compétences
Bonjour,
Vous ne pouvez pas utiliser .Activate si vous voulez travailler sans changement de fenêtre. Ecrire "workbook.activate" veut essentiellement dire "mettre cette fenêtre au premier plan".
C'est une mauvaise habitude qui ralentit en effet votre code. Elle force le changement de fenêtre même si vous désactivez les animations.
Au lieu de cela, utilisez l'instruction With et référez aux Ranges avec un "." pour désigner leurs classeurs parents, au lieu d'utiliser la feuille/classeur actif. Un bon code VBA n'a pas besoin de .Activate pour faire ce que vous voulez.
Un petit exemple :
' --------- INITIAL
Workbooks("validations.xlsx").Activate
'ecriture des lignes fixes
Range("A" & lig).Value = cola
Range("B" & lig).Value = colb
Range("C" & lig).Value = colc
Range("F" & lig).Value = colf
Range("I" & lig).Value = coli
' --------- CORRECTION
With Workbooks("validations.xlsx").Worksheets("nom de la feuille ici")
'ecriture des lignes fixes
.Range("A" & lig).Value = cola
.Range("B" & lig).Value = colb
.Range("C" & lig).Value = colc
.Range("F" & lig).Value = colf
.Range("I" & lig).Value = coli
End WithEDIT : salut @LooReeD, même avis/commentaire.
Les barres de progression (comme celle que je propose sur ma page de téléchargement), ne sont que "de la cosmétique" afin de faire patienter l'utilisateur si le code ne va pas assez vite, mais comme il faut gérer la barre, cela "ralenti" le code !
Si je comprend bien le code, vous travaillez sur un seul classeur mais plusieurs feuilles, donc oui le ciblage des données par leur "adresse" sans sélectionner les feuilles et/ou les cellules cela permet de gagner du temps.
Lorsque l'on enregistre des macros par l'enregistreur, ce dernier enregistre les activations/sélections car en effet c'est ce que l'on fait avec la souris, mais par du code VBA ces actions sont dans la majorité des cas inutile et chronophage. A savoir que VBA qui accède à la feuille Excel demande un temps d'action, donc si en plus d'accéder à une donnée on demande d'activer/sélectionner le classeur/la feuille/la cellule alors on augmente le temps d'exécution du code.
@ bientôt
LouReeD
Super, merci à tous avec vos aides combinées, code optimisé et aspect visuel parfait sans barre de progression
Bonne journée à tous
Merci pour ce retour rapide et pour vos remerciements !
de votre côté également vous avez du supprimer les "Activate" !
@ bientôt
LouReeD
En effet suppression de tous les Activates, code plus rapide et visuel bien meilleur
merci encore
Merci pour votre retour, et félicitations pour votre travail d'optimisation. Content d'avoir pu aider.
Bonne journée.