VBA EXCEL la macro boucle avec des filtres

tbr Messages postés 7 Date d'inscription   Statut Membre -  
tbr Messages postés 7 Date d'inscription   Statut Membre -
Bonjour,
Dans un tableau dont le nombre de lignes est variable je souhaite appliquer une formule à chacune des lignes.
Je ne suis pas un pro des "loop" et des "do while" alors je fais basic et la macro tourne correctement. Le problème c'est lorsque j'applique un filtre EXCEL avant ou après avoir lancé la macro. Elle boucle et il faut que je fasse un click droite souris pour l'arrêter.
Ca fait jours que j'essai des trucs sans succès....... C'est la première fois que je pose une question sur un forum!!!!
Merci pas avance de me faire profiter de vos connaissances.

Application.ScreenUpdating = False

Range("H17").Select
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-6]=R[-1]C[-6],RC[-2]=""OUV"",R[-1]C[-2]=""OUV"",RC[-1]<>""M "",R[-1]C[-1]<>""M ""),TEXT(RC[-7]-R[-1]C[-7],""h:mm:ss.00""),"""")"
'Range("H17").Select
Selection.AutoFill Destination:=Range("H17:H65536"), Type:=xlFillDefault
Configuration: Mac OS X
Safari 523.12.2

8 réponses

  1. amigo
     
    Bonjour,

    Ta formule comporte des erreurs de syntaxe, il y a des imbrications de guillemets ("") qui ne sont pas autorisées, du moins pas sous cette forme. Voila comment il faudrait l'ecrire
    ActiveCell.FormulaR1C1 = _
    "=IF(AND(RC[-6]=R[-1]C[-6],RC[-2]=" & Chr(34) & "OUV" & Chr(34) & _
    ",R[-1]C[-2]=" & Chr(34) & "­OUV" & Chr(34) & ",RC[-1]<>" & Chr(34) & "M " & Chr(34) & _
    ",R[-1]C[-1]<>" & Chr(34) & "M " & Chr(34) & ");TEXT(RC[-7]-R[-1]C[-7]," & Chr(34) & _
    "h:mm:ss.00" & Chr(34) & ");" & Chr(34) & Chr(34) & ";)"

    Dans la version française d' Excel la fonction IF s'ecrit SI et la fonction AND s'ecrit ET
    ActiveCell.FormulaR1C1 = _
    "=SI(ET(RC[-6]=R[-1]C[-6],RC[-2]=" & Chr(34) & "OUV" & Chr(34) & _
    ",R[-1]C[-2]=" & Chr(34) & "­OUV" & Chr(34) & ",RC[-1]<>" & Chr(34) & "M " & Chr(34) & _
    ",R[-1]C[-1]<>" & Chr(34) & "M " & Chr(34) & ");TEXT(RC[-7]-R[-1]C[-7]," & Chr(34) & _
    "h:mm:ss.00" & Chr(34) & ");" & Chr(34) & Chr(34) & ";)"

    Salut.
    0
    1. tbr Messages postés 7 Date d'inscription   Statut Membre
       
      Bonjour,

      que veut dire Chr(34) & ?
      Lorsque je copie ta formule à la place de la mienne ça ne marche pas?
      0
  2. amigo
     
    RE,
    La fonction Chr() prend en argument le code ASCII du caractère et retourne le caractère

    Chr(34) c'est le caractère "

    On ne peut pas imbriquer des guillemets pour définir une chaine qui contient des guillemets, il faut passer par chr(34)
    Je me suis peut etre trompé en écrivant
    essaie ç en anglais ou en français suivant ton système

    ActiveCell.FormulaR1C1 = _
    "=IF(AND(RC[-6]=R[-1]C[-6],RC[-2]=" & Chr(34) & "OUV" & Chr(34) & _
    ",R[-1]C[-2]=" & Chr(34) & "­OUV" & Chr(34) & ",RC[-1]<>" & Chr(34) & "M " & Chr(34) & _
    ",R[-1]C[-1]<>" & Chr(34) & "M " & Chr(34) & ");TEXT(RC[-7]-R[-1]C[-7]," & Chr(34) & _
    "h:mm:ss.00" & Chr(34) & ");" & Chr(34) & Chr(34) & ")"

    ActiveCell.FormulaR1C1 = _
    "=SI(ET(RC[-6]=R[-1]C[-6],RC[-2]=" & Chr(34) & "OUV" & Chr(34) & _
    ",R[-1]C[-2]=" & Chr(34) & "­OUV" & Chr(34) & ",RC[-1]<>" & Chr(34) & "M " & Chr(34) & _
    ",R[-1]C[-1]<>" & Chr(34) & "M " & Chr(34) & ");TEXT(RC[-7]-R[-1]C[-7]," & Chr(34) & _
    "h:mm:ss.00" & Chr(34) & ");" & Chr(34) & Chr(34) & ")"

    Voila ce ça donne:

    =SI(ET(RC[-6]=R[-1]C[-6],RC[-2]="OUV",R[-1]C[-2]="­OUV",RC[-1]<>"M ",R[-1]C[-1]<>"M ");TEXT(RC[-7]-R[-1]C[-7],"h:mm:ss.00");"")

    Dis moi si c'est la bonne formule

    A+
    0
  3. amigo
     
    Je viens de rentrer la formule dans une cellule et Excel me dit qu'il y a une erreur.

    Le plus simple c'est que tu m'ecrive la formule telle qu'elle est ecrite dans une cellule de ton tableau et je te mettrai le code VB qui va bien.

    A+.
    0
    1. tbr Messages postés 7 Date d'inscription   Statut Membre
       
      Amigo,

      Voilà un copier/coller de la formule du tableau

      =SI(ET(B17=B16;F17="OUV";F16="OUV";G17<>"M ";G16<>"M ");TEXTE(A17-A16;"h:mm:ss.00");"")

      Par contre la macro avec cette formule marche. Ca boucle uniquement lorsque j'essai de mettre des filtres après le résultat

      A+

      Ci joint un extrait du tableau sur lequel j'applique le calcul

      A B C D E F G H
      2007-01-01 18:14:11.54 BELLAC NOUIC DISJ OUV
      2007-01-01 18:14:11.83 BELLAC NOUIC DISJ FER
      2007-01-01 18:14:12.66 BELLAC NOUIC DISJ OUV
      2007-01-01 18:14:25.12 BELLAC BLOND DISJ OUV 0:00:13.00
      0
  4. amigo
     
    Bonjour,

    voila comment il faut entrer la formule par le biais de la macro
    ActiveCell.FormulaR1C1 = "=SI(ET(B17=B16;F17=" & Chr(34) & "OUV" & Chr(34) & _
               ";F16=" & Chr(34) & "OUV" & Chr(34) & ";G17<>" & Chr(34) & "M " & _
                Chr(34) & ";G16<>" & Chr(34) & "M " & Chr(34) & ");TEXTE(A17-A16;" & _
                Chr(34) & "h:mm:ss.00" & Chr(34) & ");" & Chr(34) & Chr(34) & ")"
    


    Qu'est ce tu appelles des filtres après le resultat?

    A+.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. amigo
     
    après avoir tâtonné au niveau de la syntaxe, enfin voici quelque chose qui marche

    ActiveCell.Value = "=IF(AND(B17=B16,F17=" & Chr(34) & "OUV" & Chr(34) & _
    ",F16=" & Chr(34) & "OUV" & Chr(34) & ",G17<>" & Chr(34) & "M " & _
    Chr(34) & ",G16<>" & Chr(34) & "M " & Chr(34) & "),TEXT(A17-A16," & _
    Chr(34) & "h:mm:ss.00" & Chr(34) & ")," & Chr(34) & Chr(34) & ")"

    Qu'est ce tu appelles des filtres après le résultat?
    0
    1. tbr Messages postés 7 Date d'inscription   Statut Membre
       
      Nos messages se sont croisés. Ta dernière formule fonctionne. Par contre ca ne solution pas le pb exposé avec les fitres

      A+
      0
  7. tbr Messages postés 7 Date d'inscription   Statut Membre
     
    Si je colle la nouvelle formule j'ai une erreur 1004 "la methode FormulaR1C1 de l'objet range a échoué!

    Par contre je me suis sans doute mal fait comprendre. Il n'y a pas a priori d'erreur sur la syntaxe de la macro car c'est EXCEL qui l'a généré lui même (j' ai fais un copier/coller de ma formule du tableau EXCEL dans VBA). Lorsque je lance la macro elle se déroule sans pb est me donne un résultat de calcul (dans l'exemple ci dessous le résultat est 0:00:13:,0)

    36 2007-01-01 18:14:11.54 BELLAC NOUIC DISJ OUV
    37 2007-01-01 18:14:11.83 BELLAC NOUIC DISJ FER
    53 2007-01-01 18:14:12.66 BELLAC NOUIC DISJ OUV
    54 2007-01-01 18:14:25.12 BELLAC BLOND DISJ OUV 0:00:13.00

    Si maintenant avec la fonction EXCEL (données -filtre automatique) je sélectionne une valeur des colonnes et que je relance la macro c'est là qu'elle se met à "boucler". Je suppose que c'est parce que à ce moment, il y a des lignes masquées par le filtre. Dans mon exemple on passe des n°36 37 à 53 54 alors que la formule fait la soustraction de deux lignes qui se suivent.

    Est ce que c'est compréhensible?

    A+
    Merci
    0
  8. amigo
     
    J'ai reproduit le tableau tel que tu me donné
    J'ai collé la formule en colonne H
    La formule contient une erreur:
    =SI(ET(B17=B16;F17="OUV";F16="OUV";G17<>"M ";G16<>"M ");TEXTE(A17-A16;"h:mm:ss.00");"")

    c'est plutot:
    =SI(ET(A17=A16;F17="OUV";F16="OUV";G17<>"M ";G16<>"M ");TEXTE(B17-B16;"h:mm:ss.00");"")

    Sinon le resultat est toujours 0:00.00.0

    Ceci dit je ne sais pas ce que fait ta macro donc je n'ai pas pu reproduire ton problème

    A+.
    0
    1. tbr Messages postés 7 Date d'inscription   Statut Membre
       
      Tu as raison, j'ai fais une erreur en copiant le tableau. mon vrai tableau est de la forme ci dessous, d'où la formule:
      ActiveCell.FormulaR1C1 = _
      =IF(AND(RC[-6]=R[-1]C[-6],RC[-2]=""OUV"",R[-1]C[-2]=""OUV"",RC[-1]<>""M "",R[-1]C[-1]<>""M ""),TEXT(RC[-7]-R[-1]C[-7],""h:mm:ss.00""),"""")"

      Selection.AutoFill Destination:=Range("H17:H65536"), Type:=xlFillDefault

      J'ai bien utilisé ton code VB pour la formule ,ça gaze nickel, mais si tu fais un tableau de 10000 lignes avec les données ci dessous, que tu fais un filtre sur une colonne pour n'avoir que "Gueret" par exemple, et que tu relance la macro elle se met à tout recalculer et elle boucle.

      2007-01-05 09:19:18.96 COINDRE ST GENES DISJ FER C
      2007-01-05 09:50:03.32 GUERET COUPLAGE DISJ FER
      2007-01-05 09:50:23.80 GUERET ARR 411 DISJ OUV C
      2007-01-05 09:50:35.62 GUERET TR 411 DISJ OUV 0:00:12.00
      2007-01-05 09:50:43.90 GUERET TR 411 DISJ FER
      2007-01-05 09:51:05.18 GUERET ARR 411 DISJ FER C
      2007-01-05 09:52:09.13 GUERET ARR 412 DISJ OUV C
      2007-01-05 09:52:18.67 GUERET TR 412 DISJ OUV 0:00:09.00
      2007-01-05 09:52:29.13 GUERET TR 412 DISJ FER
      2007-01-05 09:52:39.30 GUERET ARR 412 DISJ FER C
      2007-01-05 09:53:36.74 GUERET COUPLAGE DISJ OUV
      2007-01-05 09:59:00.79 ARGENTAT COUP20KV DISJ FER C
      2007-01-05 09:59:14.80 ARGENTAT ARR 412 DISJ OUV C
      2007-01-05 09:59:27.53 ARGENTAT TR 412 DISJ OUV C 0:00:13.00
      2007-01-05 09:59:34.60 ARGENTAT TR 412 DISJ FER C
      2007-01-05 09:59:44.98 ARGENTAT ARR 412 DISJ FER C
      2007-01-05 10:00:06.20 ARGENTAT COUP20KV DISJ OUV C
      2007-01-05 10:03:08.61 LAVAUD COUPLAGE DISJ FER C
      2007-01-05 10:03:14.39 LAVAUD ARRIVEE1 DISJ OUV C
      2007-01-05 10:03:21.65 LAVAUD ARRIVEE1 DISJ FER C
      2007-01-05 10:03:32.27 LAVAUD ARRIVEE2 DISJ OUV C
      2007-01-05 10:03:36.61 LAVAUD ARRIVEE2 DISJ FER C
      2007-01-05 10:03:41.92 LAVAUD COUPLAGE DISJ OUV C
      2007-01-05 10:05:07.19 LAVAUD FRESSANG DISJ OUV C 0:01:26.00
      2007-01-05 10:05:12.45 LAVAUD FRESSANG DISJ FER C
      0
  9. amigo
     
    Re.

    Cette fois je crois ce c'est bon, il suffit d'ajuster la macro à ton tableau pour lui indiquer la première ligne,
    par exemple j'ai mis H2 mais c'est peu etre H16 chez toi voir commentaires

    Voici la macro

    Sub macro1()
    Dim C As String
    Range("H2").Select ' AJUSTER SUIVANT TON TABLEAU PAR EXEMPLE "H16"
    C = ActiveCell.Column
    ActiveCell.Value = "=IF(AND(A" & C & "=A" & C - 1 & _
    ",F" & C & "=" & Chr(34) & "OUV" & Chr(34) & _
    ",F" & C - 1 & "=" & Chr(34) & "OUV" & Chr(34) & ",G" & C & "<>" & _
    Chr(34) & "M " & Chr(34) & ",G" & C - 1 & "<>" & Chr(34) & "M " & _
    Chr(34) & "),TEXT(B" & C & "-B" & C - 1 & "," & Chr(34) & _
    "h:mm:ss.00" & Chr(34) & ")," & Chr(34) & Chr(34) & ")"
    Selection.AutoFill Destination:=Range("H2:H65536"), Type:=xlFillDefault ' AJUSTER
    End Sub

    ça marche meme avec les fitres, attendre juste quelques secondes, l'execution est plus longe avec des filtres, surtout s'il y a 10000 lignes.

    A+.

    A+.
    0
    1. tbr Messages postés 7 Date d'inscription   Statut Membre
       
      Merci pour ton aide, mais c'est exactement le pb que j'ai exposé au départ, même si le code VB je j'ai utilisé n'est pas top, ma macro tourne et met quelques secondes même avec 40000 lignes. Avec les filtres, ca met plusieurs minutes ou ca boucle en permanence et il faut que je fasse click droite de la souris pour sortir de la macro.

      Merci malgré tout du temps passé
      0