XL 2019 Gérer la descente d'une cellule colorer selon un timer

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Nicolas JACQUIN

XLDnaute Accro
Supporter XLD
Bonjour à toutes et tous,

Je cherche une façon de faire descendre une cellule ligne par ligne à un rytme différent (style tétris) selon valeur en "A1" (valeur pouvant aller de 1 à 15),
mais je n'arrive pas à gérer la vitesse, actuellement si je mets valeur de 1 à 5, pas de différence et si je mets 6 on vois plus rien.

VB:
Sub DescenteCellule()
    Dim vitesse As Double
    Dim delai As Double
    Dim i As Integer
    Dim couleur As Long

    If IsNumeric(Range("A1").Value) Then
        vitesse = Range("A1").Value
        If vitesse <= 0 Then
            MsgBox "La valeur de A1 doit être supérieure à 0.", vbExclamation
            Exit Sub
        End If
    Else
        MsgBox "Veuillez entrer un nombre valide dans la cellule A1.", vbExclamation
        Exit Sub
    End If

    delai = 1 / (1 + (vitesse - 1) * 0.2)
    couleur = Range("D5").Interior.Color
    Range("D5:D25").Interior.ColorIndex = xlNone

    For i = 5 To 25
        Range("D5:D25").Interior.ColorIndex = xlNone
        Range("D" & i).Interior.Color = couleur
        DoEvents
        Application.Wait Now + TimeSerial(0, 0, delai)
    Next i

    Range("D25").Interior.ColorIndex = xlNone
    Range("D5").Interior.Color = RGB(0, 255, 0) ' Vert
End Sub

Merci à tous.
Nicolas
 

Pièces jointes

Bonjour le fil,
je n'ai pas vu les dernières propositions de @jurassic pork
J'ai essayé d'utiliser le OnTime proposé par @dysorthographie : mais, sauf erreur de ma part, en descendant en dessous de 0.5 secondes, c'est comme si on était à 0, donc pas de OnTime.
Je suis donc revenu sur le Sleep.
En pj une proposition avec
la vitesse pilotée par des constantes
DELAI_INITIAL = 1 'seconde​
FREQUENCE = 10 ' définit le nombre de descentes avec la même vitesse.​
Le délai au démarrage
Delai = DELAI_INITIAL - (Niveau - 1) / 20 ' 1 seconde pour niveau 1 à 0.55 seconde pour niveau 10​
Comme je l'ai indiqué dans un post précédent la vitesse va augmenter (dans le code toutes les FREQUENCE lignes de descentes) avec un incrément (géométrique) en fonction du niveau sélectionné : La vitesse augmente mais de moins en moins rapidement (courbe vitesse/temps en gros logarithmique) .
Delai = Delai * (1 - Niveau / 100) ' en secondes​
Pour lancer le démarrage, j'ai utilisé un nouveau bouton (au-dessus de la grille) où j'intercepte les flèches sur l'événement KeyDown.
Il faut donc être sur ce bouton (ce qui est le cas lors du clic) pendant le déroulement du jeu.
 

Pièces jointes

Hello,
j'ai modifié le classeur de crocrocro du post #46 pour apporter des améliorations.

1 - Il n'y a plus que deux boutons : Nouvelle Partie et Arrêter Partie
2 - Dans le code j'ai mis à plusieurs endroits des Application.ScreenUpdating pour accélérer l'affichage.
3 - au lieu d'un Sleep (panthère) j'ai mis une tempo qui utilise un sleep de 50 ms : comme cela les événements clavier sont pris en compte tous les 50 ms ( donc plus réactif).
4 - A l'arrêt de la partie je remets les scrollbars (que j'ai enlevé pour un effet de scintillement), j'arrête les événements clavier.


TetrisCrocrocroJP.png


Ami calmant, J.P
 

Pièces jointes

Dernière édition:
A noter que dans le classeur de mon message précédent :
1 - Les Application.OnKey ne servent plus à rien (on peut les enlever)
2 - Les événements clavier se font sur le KeyDown du bouton Nouvelle Partie : si le bouton n'a plus le focus, on ne peut plus déplacer les pièces par le clavier.
3 - Si on fait un appui long sur une touche de déplacement (par exemple Flèche Bas) pour accélérer le déplacement (auto répétition) cela peut planter Excel ou bien faire afficher un message Espace Pile Insuffisant : Ne pas faire d'appui long.
 
Bonjour JP,
je suis parti du fichier de Nicolas et n'ai rien supprimé de ce qui était à l'origine.
Même pas le OnTime, Onkey que j'avais remplacé par un Sleep et le KeyDown.
Hello crocrocro,
moi j'ai fait le ménage , mais j'ai oublié d'enlever les Application.OnKey
Et pour le souci de espace pile insuffisant, voici ce que me dit ChatGpt :
Lorsque vous laissez une touche enfoncée, l'événement KeyDown est déclenché en boucle rapide. Si dans cet événement vous exécutez une action lente, récursive ou bloquante, la pile se remplit rapidement, provoquant une erreur de type "pile insuffisante"
 
j'ai bien eu aussi le message Espace Pile Insuffisant.
Hello,
bon j'ai compris pourquoi il y avait des Espace Pile insuffisant. Quand on appuyait sur la touche Flèche vers le bas , on appelait la procédure Descendre, dans celle-ci il y a la temporisation de descente ( 1 seconde au départ). Donc si on envoie une salve de Descendre en restant appuyé sur la touche Flèche vers le bas, avec la temporisation, les événements s'empilent car on est bloqué par la temporisation. Donc j'ai créé une procédure DescendreClavier où il n'y a pas de temporisation.
Pour le focus sur le bouton Nouvelle Partie, quand le bouton perd le focus, un message s'affiche pour savoir si on veut vraiment arrêter la partie.
Si on clique sur OK on arrête la partie, si Annuler on redonne le focus au bouton.
J'ai passé le Sleep (pas celui de Superman) de la temporisation à 25 ms :

Précision typique du Sleep sous Windows :​

  • La résolution du timer système est typiquement de 15,625 ms (1/64 secondes) par défaut.
  • Cela signifie que si vous faites Sleep(1), le délai réel peut être de 1 ms à 15 ms, selon le moment où le système vous réveille.
  • Pour des temps de pause plus longs (ex. Sleep(100)), cette imprécision devient négligeable.
  • Pour des délais courts et précis (ex. <20 ms), Sleep n’est pas fiable.
En pièce jointe la nouvelle version du classeur.
Ami calmant, J.P
 

Pièces jointes

Dernière édition:
Regarder cette version.. le code est basé sur le fichier initial .
J'ai également accelerer la fonction AfficherFileAttente qui contenait des boucles extrêmement lourdes donc je les supprimer .

Bonjour,
C'est bien fluide au niveau de la descente mais arrivé un moment la sélection de celulle suit la forme et tu arrive facilement avec la grille qui remonte au fur et à mesure, et sur l'essai ci dessous la forme c'est carrément arretée au milieu de la grille.
Merci

Capture d’écran 2025-05-23 162422.jpg
 
La seule fonction que j'avais modifiée et qui pourrait interférer avec le fonctionnement interne du jeu c'était la fonction Descendre , c'&tait pour détecter l'arrivée à la fin de la grille pour pouvoir appeler NouvellePiece par la suite dans la boucle du timer.

J'ai mis à jour mon fichier tu peux le retélécharger
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
385
Réponses
3
Affichages
90
Retour