Bonjour,
CORDIA5, remplaces ton code par celui-ci-dessous et dis moi si ton animation continue durant le déroulement de la macro appelée ?
Comme tu peux le constater, tes figures restent figées pour la simple et bonne raison que ce n'est pas possible que deux macros se déroulent en parallèle. Le DoEvents ne fait que laisser la main à l'application Excel car ça demande au compilateur de faire une micro pause dans le déroulement du code afin de permettre à Excel de poursuivre sont activité.
Les procédures et fonctions VBA se déroulent dans un seul et même thread (le même processus) et pour pouvoir faire tourner plusieurs macros indépendamment les unes des autres, il faut du multi threads et dans ce cas, il faut développer sous VB.Net :
Dim Arret As Boolean
Dim NombreFois As Integer
Sub Worksheet_Activate()
'Déclaration variable DEGREE_ROTATION comme valeur double.
Dim DEGREE_ROTATION As Double
'Définition du degré de rotation de départ du smiley dans la boite à 0 degrés
DEGREE_ROTATION = 0
On Error Resume Next 'Gestion des erreur par si erreur passer et continuer
Do While IsEmpty(ThisWorkbook.Worksheets(1).Range("x1"))
If Arret = True Then Exit Sub
DoEvents 'Raffraichir l'application pour y garder la main
'###########################################################################################
MacroAppelee '<--- la macro est appelée ici et on voit bien que la boucle ne continue pas !
'###########################################################################################
If DEGREE_ROTATION >= 350 Then
DEGREE_ROTATION = 0
End If
'_____________________________________________________________________________
'Rotation du smiley à la valeur DEGREE_ROTATION
ThisWorkbook.Worksheets(1).Shapes.Range(Array("Émoticône 2")).ThreeD.RotationX = DEGREE_ROTATION
ThisWorkbook.Worksheets(1).Shapes.Range(Array("Émoticône 1")).ThreeD.RotationX = DEGREE_ROTATION
ThisWorkbook.Worksheets(1).Shapes.Range(Array("Émoticône 3")).ThreeD.RotationX = DEGREE_ROTATION
ThisWorkbook.Worksheets(1).Shapes.Range(Array("Émoticône 4")).ThreeD.RotationX = DEGREE_ROTATION
'Ajout +2.5 degrés à DEGREE_ROTATION pour la prochaine rotation
DEGREE_ROTATION = DEGREE_ROTATION + 2.5
Loop
'---------------------------------------------------------------------------------------------------------
End Sub
Sub MacroAppelee()
Dim I As Long
Dim J As Integer
For I = 1 To 1000
Range("C10").Value = "Traitement en cours position " & I & ", lza main n'est pas rendue à la macro appelante !"
For J = 1 To 100
DoEvents '<--- ici aussi on laisse la main mais ce n'est pas pour ça que l'animation continue !
Next J 'la main est seulement laissée à l'application Excel et non au déroulement d'un autre code
Next I
NombreFois = NombreFois + 1
If NombreFois > 5 Then Arret = True
End Sub