Ordre Éxécution des macros au clic sur le Bouton

XkevinX

XLDnaute Junior
Bonjour,

J'ai un petit problème avec mon bouton.

Voici son code :

Code:
Private Sub CommandButton1_Click()
Call Moyenne
Call NomFeuille
Call FormuleDistance
Call FormuleVitesse
Call Decalage
Call TempsMoyen
Call TempsArret
Call EcartMoyenM
Call EcartMoyenS
End Sub

Le souci, c'est que les Sub EcartMoyenM et EcartMoyenS font des calculs à partir des autres colonnes.
Ces Sub font les calculs si les cellules sont non-vides.

Or elles se remplissent au clic sur le bouton.

Est-ce qu'au clic, on appelle les sub dans l'ordre; c'est à dire Moyenne - NomFeuille - FormuleDistance - FormuleVitesse etc ... ?

Quand je passe en pas à pas sur mon sub EcartMoyenM, je sors de ma boucle alors que les cellules ne sont pas vides.

Code EcartMoyenM:

Code:
Sub EcartMoyenM()
For m = 4 To Range("D65536").End(xlUp).Row Step 1
 For n = 4 To Range("B65536").End(xlUp).Row Step 1
  For o = 4 To Range("H65536").End(xlUp).Row Step 1
   If Range("B" & n).Value <> 0 And Range("D" & n).Value <> 0 Then
    Range("H" & n).Value = Range("D" & n).Value - Range("B" & n).Value
   End If
  Next o
 Next n
Next m
End Sub

Code qui remplit colonne B :
Code:
Sub Moyenne()

'Effacement des resultats precedents
Range("B3:C65536").ClearContents

'ligne de depart des ecritures
ligne = 3

' tableau repertoriant les colonnes dont on souhaite les moyennes
col = Array("J", "P")

'Pour chaque feuille dans la collection des feuilles
For Each Sh In Sheets

'Si le nom de la feuille est <> de Recap alors
 If Sh.Name <> "Recap" Then

 'pour chaque element de col
  For m = LBound(col) To UBound(col)
  
  'pour n de 1 a derniere cellule remplie de la colonne considerée (col(m))
   For n = 1 To Sh.Range(col(m) & "65536").End(xlUp).Row
   
   'Si le contenu de la cellule ligne=n et colonne concernée est une date  non nulle alors
     If IsDate(Sh.Range(col(m) & n)) And Sh.Range(col(m) & n) <> 0 Then
     
     'tot est augmenté de la valeur de la cellule
       tot = tot + CDate(Sh.Range(col(m) & n))
       
       'nb est incrementé (nb final sera le nombre de cellules totalisées
       nb = nb + 1
     End If
   Next
   
   'Si le total n'est pas nul Ecriture de la moyenne (total divisé par le nombre de cellules)
   If tot <> 0 Then Cells(ligne, 2 + m) = tot / nb
   'remise a o de tot et nb pour calcul suivant
   tot = 0
   nb = 0
   
   'nouvel element de col
  Next m
  
  'ligne=ligne d'ecriture suivante
  ligne = ligne + 1
 End If
Next

'classement en colonneB
Range("B3:B" & Range("B65536").End(xlUp).Row).Sort Key1:=Range("B3"), Order1:=xlAscending, Header:=xlGuess
'classement en colonne C
Range("C3:C" & Range("C65536").End(xlUp).Row).Sort Key1:=Range("C3"), Order1:=xlAscending, Header:=xlGuess
End Sub

La colonne D est remplie manuellement.

Merci de votre aide.
 

Misange

XLDnaute Barbatruc
Re : Ordre Éxécution des macros au clic sur le Bouton

Bonjour

L'intérêt de définir des sous routines n'est réel que si les sous routines sont appelées plusieurs fois.
Ici chaque sub n'est appelée qu'une fois et il est bien plus simple dans ce cas là de les mettre dans une même sub. Cela dit la façon d'écrire que tu as choisie est correcte (mis à part qu'aucune variable n'est déclarée...) et ne devrait certainement pas provoquer une sortie prématurée de la première sub.

Il est plus simple de fournir un classeur exemple pour qu'on puisse tester, notamment voir exactement sur quel type de valeurs ça coince.
Ceci me parait curieux comme écriture
If IsDate(Sh.Range(col(m) & n)) And Sh.Range(col(m) & n) <> 0 Then
 

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz