De: Laurent Longre Objet: Re: Optimisation du code suivant Date : mercredi 13 septembre 2000 19:49 Salut Glad, Si tu as Excel 2000, je te propose cette autre approche : '======================================================== Private Declare Function setTimer Lib "User32" _ (ByVal hWnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "User32" _ (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long Dim Texte As String Dim nIDEvent As Long Dim CmdB As CommandBarButton Sub Arrêter() KillTimer 0, nIDEvent End Sub Sub Lancer() Texte = "C E C I E S T U N M E S S A G E D E R O U L A N T " _ & Space$(128) set CmdB = Application.CommandBars.FindControl(ID:=186) nIDEvent = setTimer(0, 0, 100, AddressOf Affiche) End Sub Private Sub Affiche() Application.EnableCancelKey = xlDisabled On Error Resume Next If CmdB.Enabled Then Texte = Mid$(Texte, 2) & Left$(Texte, 1) sheets(1).range("A1") = Texte End If End Sub '======================================================== Pour activer le message déroulant (dans la cellule A1 de la première feuille de calcul du classeur actif) => procédure "Lancer". Pour le stopper => procédure "Arrêter". C'est un peu du bricolage. La procédure Affiche se lance tous les 1/10ème de seconde (100 * 1 millième de seconde) de manière asynchrone. Si au moment de son déclenchement Excel était en mode "édition de cellule" (tu es en train de faire une saisie), l'instruction 'sheets(1).range("A1") = Texte' provoquerait un plantage du logiciel. Pour éviter ça, je me sers de la commande de menu Outils -> Macros -> Macro (Id = 186). Si cette commande est inaccessible (Enabled = False), ça veut dire, normalement, qu'Excel est en mode Edition et qu'il ne faut pas exécuter la procédure. J'imagine qu'il y a des moyens plus "propres" de détecter si Excel est en mode Edition, mais je ne les connais pas. Le problème se pose rarement, puisqu'en principe il est impossible de déclencher des procédures de manière totalement asynchrone, sauf à utiliser des fonctions API... Si tu as Excel 97, ce genre de truc est toujours possible à faire, mais un peu plus compliqué. Laurent P.S : tiens, voilà un mouchoir. ;-) glad a écrit : > > snif personne pour m'aider, c'est triste > Gilles > glad a écrit dans le message : > 8pjfvq$etd$1@wanadoo.fr... > > Public Texte As String > > Sub main() > > InitVar > > Princip: > > On Error GoTo ReStart > > While (1) > > t = Timer > > OpenForms = DoEvents > > t2 = Timer > > If (t2 - t) > 0.01 Then > > OpenForms = DoEvents > > test > > OpenForms = DoEvents > > End If > > Wend > > ReStart: > > OpenForms = DoEvents > > Err.Clear > > Resume Next > > End Sub > > Sub test() > > OpenForms = DoEvents > > Texte = Right$(Texte, Len(Texte) - 1) + Left$(Texte, 1) > > OpenForms = DoEvents > > Windows("test.xls").ActiveSheet.Cells(1, 1) = Texte > > OpenForms = DoEvents > > End Sub > > Sub InitVar() > > Texte = "C E C I E S T U N M E S S A G E D E R O U L A N T " + > > String(128, " ") > > End Sub > > > > J'aimerais savoir si quelqu'un pourrait optimiser ce code. Mon but étant > en > > fait d'écrire une procèdure qui ne bloque pas excel et permette de > > travailler relativement > > rapidement, et notament utiliser la souris. > > > > > >