XL 2016 VBA - Comment afficher le prompt d'interruption

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Savez-vous s'il existe une méthode pour afficher ce prompt qu'on obtient par exemple en faisant CTRL + PAUSE sur un MsgBox ?

1708243804520.png
 
Solution
Alors il est vrai que Stop permet le debug (affichage des valeurs de variables) et la continuation de l'exécution avec l'interface du VBE.
Donc on peut avantageusement remplacer le MsgBox par un Stop.
Ça reste une gestion programmée du Control + Pause mais c'est plus léger.

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
perso je pense qu'avant d'essayer de réinventer la roue
il faudrait apprendre a connaitre touts les event userform et leur property
donc cela étant dit je fait ce que je dis
donc on utilisera les event adéquats
avant tout je rappelle pour la Nième fois que le userform est un module classe avant tout et qu'il transporte avec lui le CLISD permettant d'afficher un object de la classe Forms
quel est l'event qui est déclenché quand on ""nothing"" une classe

le but c'est quoi ?
faire un control+pause sur un textBox

ok
donc question
d'après toi @Dudu2
1° quel sont les event déclenchés lorsque l'on ferme un userform ?
2° les quels concerne l'object forms et les quels concerne la classe(nomdel'userform)

essaie donc cela voir un peu

VB:
Public interruption As Boolean

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 3 Then interruption = True: Unload Me
End Sub

Private Sub UserForm_Terminate()
If interruption Then MsgBox "intérrompu"
End Sub

pas besoins de display ou de show perso et tout y couintiti


;)
 

patricktoulon

XLDnaute Barbatruc
ou même encore plus simplement
VB:
Public interruption As Boolean

Public Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 3 Then interruption = True: une_sub
End Sub


Sub une_sub()
    If interruption Then
          x = MsgBox("interruption", vbYesNo)
        If x = vbYes Then Unload Me
    End If
End Sub
 

Dudu2

XLDnaute Barbatruc
Quand tu fais un MsgBox et Control + Pause dessus, tu as le dialogue affiché et le code arrêté sur la 1ère instruction qui suit le MsgBox.
C'est ce que j'essaie de reproduire avec le UserForm.
Faire le l'arrêt dans le code du UserForm n'a pas d'intérêt car on ne sait pas d'où il a été appelé et c'est l'instruction qui suit son appel qui nous intéresse pour le debug.
 

Dudu2

XLDnaute Barbatruc
Alors il est vrai que Stop permet le debug (affichage des valeurs de variables) et la continuation de l'exécution avec l'interface du VBE.
Donc on peut avantageusement remplacer le MsgBox par un Stop.
Ça reste une gestion programmée du Control + Pause mais c'est plus léger.
 

Pièces jointes

  • Modeless.xlsm
    22.2 KB · Affichages: 2
  • Modal.xlsm
    22.6 KB · Affichages: 2

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Dudu2 :), @patricktoulon :) , @dysorthographie :), à tous :),

Ma p'tite version (sans doute une tentative malheureuse) avec un code plus concis.
  • version v1 -> le userform1 reste ouvert quand on exécute l'instruction STOP
  • version v2 -> le userform1 est refermé quand on exécute l'instruction STOP
  • dans les deux versions, c'est la touche ESC qui provoque une fermeture directe du userform1
  • dans les deux versions, c'est la touche "Pause" (avec ou sans Ctrl) qui provoque le "Stop"
 

Pièces jointes

  • dudu2- stop- v1.xlsm
    21.9 KB · Affichages: 3
  • dudu2- stop- v2.xlsm
    22.9 KB · Affichages: 1
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re Bonjour à tous
juste en passant
si la touche ctrl ne doit être utilisée pour autre chose dans le textbox
comme les messages application et vbe sont prioritaires par rapport au msgbox vba
le message d'interruption apparait
VB:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If Shift <> 0 Then Shift = 0: MsgBox KeyCode
End Sub
les touches ctrl+pause font l'effet recherché
demo.gif
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
C'est bien vu mais même avec un If KeyCode = 17 Then MsgBox 1, on reste dans le code UserForm (au niveau du TextBox1_KeyDown()) et pas moyen de renvoyer l'interruption sur l'instruction suivante si l'appel du UserForm est fait par une fonction publique. J'ai essayé des dizaines de trucs et pas moyen.

En fait quand on fait un SendKeys (API keybd_event ou pas) de "^{BREAK}", on ne sait jamais quand ça va arriver au gestionnaire d'interruption. Un boucle de 10.000 DoEvents après se solde par des interruptions à des valeurs plus ou moins grande de l'indice de boucle.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 147
Messages
2 116 770
Membres
112 857
dernier inscrit
sanogo