Lancer une fonction à intervalle régulier

Résolu
Clem -  
 Clem -
Bonjour,

Suite à une brève discussion avec eric, je poste un nouveau sujet.

J'ai créé une fonction qui compte l'ensemble des cellules dans laquelle est présente un mot, dans une certaine plage définie par la cellule de départ (la fonction teste si la cellule suivante de la plage est vide, si oui elle s'arrete d'elle même). Elle prend donc en entrée un mot (à trouver) et une cellule (ou commencer la recherche). J'ai le code suivant:

Function compteur(name As String, cel)
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.Volatile
b = Left(cel.Address, 2)
c = cel.Row
Do While (b & c <> "")
Range(cel.Address).Select
If Range(b & c).Value = name Then
compteur = compteur + 1
End If
c = c + 1
If Range(b & c).Value = "" Then Exit Function
Loop
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Function


Mon problème est le suivant: j'avais cru comprendre que "Application.Volatile" permettait de recalculer la fonction à chaque changement de cellule, mais quelques fois cette modification n'a pas vraiment lieu... Pire, elle me renvoie une liste de zéros, et je suis obligé de recalculer manuellement une des cellules où j'utilise la fonction pour lancer le calcul dans toutes les autres.

Je me suis documenté sur la méthode Application.Ontime mais j'avoue avoir du mal à l'appliquer sur ma fonction...

Merci du coup de main.

Cordialement

4 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    on time sert à lancer un sub, pas une fonction.

    If Range(b & c).Value = "" Then Exit Function 

    Il faudrait peut-être remettre xlCalculationAutomatic et Application.ScreenUpdating avant de quitter...

    Application.Volatile n'est utile que si tu désires ré-évaluer la fonction alors que ses antécédents n'ont pas changés. Pas sur que ce soit utilise ici.

    eric
    0
  2. Clem
     
    Donc mettre ces deux lignes avant de faire letest de sortie de la fonction?

    Désolé de la lenteur de la réponse
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      oui
      et supprimer le .volatile à mon avis inutile et qui ralentira pour rien.
      eric
      0
    2. Clem
       
      Merci beaucoup pour tes réponses.

      Cordialement
      Clem
      0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour Clem, Eriic,

    Ta fonction me parait bien compliquée et lente avec tous ces select même avec l'écran figé...

    petite question avant de te proposer une bidouille: dans ta plage sous la cellule de départ, il y a t il une ou des cellules vides d'intercalées qui stopperait le comptage?

    je pars danS un 1/4 d'heure mais je pense que notre Eric national voit ce que je veux dire

    attention "name" est un mot réservé vba: risque d'erreur ou d'ambiguiité
    0
  4. Clem
     
    Non en fait j'ai deux tableaux distincts correspondant à deux machines, mais je traites plusieurs usines donc ces deux machines sont dans la meme usine, donc sur la meme feuille.
    Donc une cellule vide marque la séparation entre les deux machines, et donc l'arret voulu du comptage
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Donc, dans le tableau d'une machine et d'une seule, il n'y a pas de trous ?
      0
    2. Clem
       
      Voila. Un trou indique le début du deuxième tableau

      Désolé en me relisant je me suis rendu copte que j'étais flou
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      OK, je propose un truc vite fait
      0
    4. Clem
       
      Je suis tout ouie :)
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      si j'ai pigé ta demande (pas de trous dans les cellules d'une machine) pour 1 machine

      Function compter_nom(nom As String, cellule As Range) As Integer   
      Dim Lig As Integer, Col As Integer, Derlig As Integer   
           Col = cellule.Column   
           Lig = cellule.Row   
           Derlig = Cells(Lig, Col).End(xlDown).Row   
           compter_nom = Application.CountIf(Range(Cells(Lig, Col), Cells(Derlig, Col)), nom)   
      End Function


      tu n'as besoin de screenupdating, ni, à mon avis, de volatile et de calculation manual

      Excuses moi, j'y vas

      edit: faute de frappe j'avais écris Ccol au lieu de Col (parkinson ?) :o)
      0