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 = True

Bonjour,

essayez de ne pas utiliser les "activate" des feuilles.
Par exemple :

Worksheets("Skid").Activate
colc = Range("G92").Value
coli = Range("G93").Value

pourrait (devrait) être remplacé par :

colc = Worksheets("Skid").Range("G92").Value
coli = Worksheets("Skid").Range("G93").Value

et 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 With

EDIT : 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 ! Mais c'est joli !

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.

Rechercher des sujets similaires à "desactiver rafraichissement ecran"