VBA EXCEL la macro boucle avec des filtres

Fermé
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008 - 15 mars 2008 à 16:54
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008 - 16 mars 2008 à 19:26
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
A voir également:

8 réponses

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
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008
15 mars 2008 à 20:49
Bonjour,

que veut dire Chr(34) & ?
Lorsque je copie ta formule à la place de la mienne ça ne marche pas?
0
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
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
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 10:39
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 14:17
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
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 14:08
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
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
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 15:58
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
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
tbr Messages postés 7 Date d'inscription samedi 15 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 19:26
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