Temporisation et "Excel ne répond plus"

Bonjour à tous,

Premier message de ma part.

Je suis débutant.

1 - Y a-t-il une fonction simple qui permette une temporisation en dixièmes, centièmes ou millièmes de secondes ? Pour l'instant j'ai créé une procédure qui incrémente x 105000 fois pour chaque centième de secondes. Ca marche mais je pense que c'est ce qui cause le problème expliqué en 2 !

2 - J'ai un gros problème avec le fait qu'une fois lancé mon programme en VBA sur Excell met Excel en mode "Excel ne répond plus". Il continue à mouliner et à la fin le travail est fait mais l'affichage est gelé or justement je veux absolument voir l'affichage au fur et à mesure ! Comment empêcher Excel de passer en mode "Excel ne répond plus" ?

Un grand merci par avance !

Bonjour Excel et bienvenu, bonjour le forum,

En principe "Excel ne répond plus" (non pas toi, le programme ... Quelle idée aussi de prendre un nom pareil !...), se produit lorsqu'une boucle est sans fin ou avec une erreur dans le code. Une temporisation ne sera pas, à mon sens, la solution.
En revanche, le fichier qui va bien avec le code nous permettra certainement de te proposer une solution. À toi de voir...

J'ai la preuve que c'est la durée qui déclenche le mode "Excel ne répond plus".

Car lorsque je passe de 105000 incrémentations à 105 (soit des temporisations 1000 fois plus courtes) alors cela ne déclenche jamais le mode "Excel ne répond plus" !

Super ! T'es trop fort !...

Je ne vois pas ce qu'il y a de "trop fort" à changer une valeur et à constater les effets que cela a sur le déroulement du programme ?

Re,

Je ne vois pas pourquoi tu t'obstines à ne pas vouloir fournir de quoi t'aider !?...

Bonsoir

Deux choses m'interpellent.... vous dites : "je suis débutant" et d'autre part vous parlez de "105000 incrémentations..." .

Mettez votre macro en ligne que l'on comprenne déjà le code que vous utilisez car si cela concerne une boucle de 1 à 105000, ben faut laisser le temps à excel de faire le boulot.

Cordialement

Bonsoir,

Je n'ai pas accès à l'ordinateur sur lequel il y a la macro mais dès que possible je joins la procédure dont le but est justement de faire perdre du temps à Excel pour avoir le temps de visualiser l'évolution du programme...

Je n'ai pas du être assez clair dans mon premier message donc je reformule :

Mon but est d'avoir une fonction qui me permet de faire patienter Excel pendant une durée donnée. Je comprends que pour vous tous cela paraisse inutile, contreproductif, débille ou je ne sais quoi encore... mais il se trouve que c'est de cela dont j'ai besoin et pas d'autre chose.

J'ai donc réalisé procédure toute simple que je vous rédige en français et qui fonctionne parfaitement :

X est un Long

X vaut 1

Répéter

X vaut X + 1

Jusqu'à ce que X vaille 105000

Y a-t-il une autre façon de faire car la répétition de cette procédure finit par déclencher "Excel ne répond plus" ?

Merci

Bonsoir le fil, bonsoir le forum

Voir peut-être du coté de Application.Wait, méthode mais, je persiste et je signe, sans le fichier (au mieux) ou le code (au pire), impossible de te proposer une solution efficace...

Y a-t-il une autre façon de faire car la répétition de cette procédure finit par déclencher "Excel ne répond plus" ?

Idem Thautheme, pour vous donner une aide il faut un minimum d'info.

Une idée --> découpez par exemple votre procédure en mettant un STOP dans le code toutes les 1000 itérations.

Cela arrêtera votre macro et vous permettra de voir ce qui se passe dans votre fichier. Ensuite F8 sur votre clavier pour continuer la procédure

Bonjour,

je ne parviens pas à reproduire le problème sur base des infos fournies (donc moi aussi je serais curieux de voir ton classeur avec ta macro). mais essaie en mettant une instruction doevents dans ta boucle (et diminue la condition de fin par exemple à 1000, doevents est gourmand).

Bonjour à tous,

Je vous joins ci-après le programme exact que je viens de faire tourner dans Excel.

Je l'ai réalisé de manière minimaliste afin de simplifier au maximum son interprétation.

Il vous suffit de faire un copier-coller puis de la tester pour pouvoir bien comprendre ce dont je parle.

J'espère que comme moi, à partir d'une certaine valeur de X vous constaterez qu'Excel passe en mode"(Ne répond pas)".

Au plaisir de vous lire.

Sub Attente_en_centièmes_de_secondes(Nombre_de_centièmes As Long)

Dim Compteur As Long: Compteur = 0

Nombre_de_centièmes = Nombre_de_centièmes * 105000

Do While Compteur < Nombre_de_centièmes

Compteur = Compteur + 1

Loop

End Sub

Sub Colorier_la_grille()

Dim x As Byte

Dim y As Byte

Range("B2:K11").Interior.Color = RGB(255, 255, 255)

For x = 2 To 11

For y = 2 To 11

Cells(x, y).Interior.Color = RGB(255, 0, 0)

Attente_en_centièmes_de_secondes (5)

Next

Next

End Sub

' Je vous conseille de créer un bouton "Start" sur la feuille Excel pour lancer la macro "Colorier_la_grille"

' Puis faire varier X dans l'instruction "Attente_en_centièmes_de_secondes (X)"

' A titre personnel, sur mon ordinateur portable avec X valant 5, tout ce passe bien.

' Mais avec X valant 50, (Ne répond pas) s'affiche en tête de fenêtre et l'affichage se gèle jusqu'à ce que le processus se termine !

Merci d'utiliser les balises de code lorsque vous postez un code VBA

Avec x=50, Pas trop de souci de mon coté

Et comme proposé par Thautheme, si vous remplacez

Attente_en_centièmes_de_secondes (5)

Par

Application.Wait (Now + TimeValue("0:00:01"))

Peut être y a-t-il un conflit entre la vitesse de calcul d''excel et ce que vous lui demander de faire dans votre macro Attente.

Une fois le code lancé, appuyez sur ESC et le tableau se remplit directement comme si le code n'était plus exécuté.

Re,

Il est vrai qu'au bout d'un moment on ne voit plus l'avancement des cellules colorées et le sablier se met en route. Mais à aucun moment je n'ai eu sur mon PC le message Excel ne répond pas et la macro va bien jusqu'au bout pour afficher d'un coup les dernières cellules en rouge.

Ci-dessous le tableau du temps sur mon PC pour terminer la macro, en changeant la variable des centièmes de seconde :

CentièmesTemps S
507,48
10015,12
20030,15
50074,76

Bonjour

Merci de me confirmer que "au bout d'un moment on ne voit plus l'avancement des cellules colorées .../... et la macro va bien jusqu'au bout pour afficher d'un coup les dernières cellules en rouge."

Et c'est exactement ce phénomène que je cherche à résoudre.

Je vais tester avec Application.Wait...

Je vous tiens au courant.

Bonjour,

J'ai testé le concept "Application.Wait (Now + TimeValue("0:00:01"))" de ThauThème qui fonctionne parfaitement car l'affichage n'est jamais interrompu.

Cependant l'incrément minimal est de 1 seconde. Quel code devrais-je rédiger pour pouvoir gérer les dixièmes de seconde voire idéalement les centièmes ?

Bien à vous

heu oui c'est normal l'updating des cellules est très gourmand de ce fait le repaint au bout d'un moment est interrompu

donc inhibe le calculate ,le enablevent ,etc... tu gagnera un peu

et par la même occasion ajoute un doevents dans ton do/loop

tiens moi je l'aurais ecrit comme ça

Function Waiting_For(Nombre_de_centièmes As Long)
    Dim t, X#
    'centieme de seconde:Nombre_de_centièmes / 10
    'dizieme de seconde:Nombre_de_centièmes / 100
    'millieme de seconde:Nombre_de_centièmes / 1000
    t = timer
    Do While (timer - t) < Nombre_de_centièmes / 10
        DoEvents
    Loop
    Waiting_For = True
End Function

Sub Colorier_la_grille()

    Dim X&, y&
    Range("B2:K11").Interior.Color = RGB(255, 255, 255)

    For X = 2 To 11
        For y = 2 To 11
            If Waiting_For(5) Then Cells(X, y).Interior.Color = RGB(255, 0, 0)
        Next
    Next

End Sub

en transformant la sub d'attente en fonction elle renvoie une réponse et on peut agir

pour les centième inutile de faire calculer le bourrin 1+1+1+1etc.... tu a timer une prise du timer au depart dans T et dans la boucle while timer-t=...

la valeur injecté par 10 pour centieme, par 100 pour dizième,par mille pour millieme

et mon repaint est visible

demo7

Plutot que Application.wait dont je vous parlais avant, essayez comme ceci : (pour 1/2 seconde)

Sub Colorier_la_grille()

Dim x As Byte
Dim y As Byte
Dim T As Single
Range("B2:K11").Interior.Color = RGB(255, 255, 255)

For x = 2 To 50

    For y = 2 To 11
        Cells(x, y).Interior.Color = RGB(255, 0, 0)

        'Attente_en_centièmes_de_secondes (5)

        T = Timer
        Do
            If Timer < T Then Exit Do
        Loop While Timer < T + 0.5
    Next y

Next x

End Sub

Edit : Déso Patricktoulon je n'avais pas rafraichi....

bonsoir dan

c'est la même chose compilé dans la sub

perso je privilégie le recyclage : ma fonction peut être utilisée dans plusieurs sub pour d'autre choses dans/et un autre contexte

il faudra m'expliquer cependant comment timer peut etre < T

T = Timer
        Do
            If Timer < T Then Exit Do
        Loop While Timer < T + 0.5

au minimum il ne peut qu’être identique

l'avantage avec une fonction externe c'est que si la réponse a été renvoyée a la sub la fonction est arrêtée (fini) donc vba est libre de ce thread

tandis que compilé dans la sub le do/loop reste en mémoire tans que pas fini même si le code en est a l’exécution de la coloration de la cellule(x,y)

Rechercher des sujets similaires à "temporisation repond"