Mettre une boucle dans ma macro

Bonjour,

J enregistre une macro à partir d'une feuille excel ayant 1163 lignes.

Dans ma macro j insère des colonnes de calcul et je fais une recopie incrémentée.

Ca me donne ceci :

Range("X2").Select

ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,0,RC[-1]/RC[-18])"

Range("X2").Select

ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,0,RC[-1]/RC6)"

Range("X3").Select

ActiveWindow.SmallScroll ToRight:=4

Range("X2").Select

Selection.NumberFormat = "0.0%"

Selection.AutoFill Destination:=Range("X2:X1163")

Range("X2:X1163").Select

Columns("X:X").Select

Je sais que la méthode n'est pas bonne, raison pour laquelle j ai besoin de mettre une boucle a chaque fois que je fais cette opération car mon tableau a d une fois sur l autre un nombre de lignes variables (pouvant aller au delà des 1163 lignes actuelles)

Pouvez vous m aider ?

Par la même occasion, étant débutant en macros, pouvez vous me conseiller un ouvrage simple mais suffisament complet traitant du sujet ?

Merci d avance.

bonjour à tous,

essaye ceci :

Sub essFormule()
    With Range("x2")
        .Select
        .NumberFormat = "0.0%"
        .Formula = "=IF(w2=0,0,w2/f2)"
        .AutoFill Destination:=Range([x2], [x65536].End(xlUp))
    End With
End Sub

Je n'ai pas compris ta 2 ème formule

Range("X2").Select

ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,0,RC[-1]/RC6)"

amicalement

Claude.

re,

formule incrémentée jusqu'à la fin de la colonne "W"

Sub essFormule2()
Dim Fm As Range
Set Fm = Range([w2], [w65536].End(xlUp))
    With Range("x2")
        .Select
        .NumberFormat = "0.0%"
        .Formula = "=IF(w2=0,0,w2/f2)"
        .AutoFill Destination:=Fm.Offset(0, 1)
    End With
End Sub

Claude.

Je te remercie pour ta réponse mais j ai une remarque :

Dans mon enregistrement, ma formule contient un IF, justement pour tester si il y a quelque chose sur la ligne et si il y a lieu de faire le calcul.

Je pensais justement que la boucle permettait d eviter ça en stoppant le calcul à la dernière ligne quelle qu elle soit sans avoir à lui indiquer la derniere ligne d excel (65536) et éviter également la recopie incrémentée qui n'est pas tres pro...

Je ne sais pas si je me fais bien comprendre

De la même manière quand mon enregistrement met en couleur un colonne comme ceci :

Columns("X:X").Select

With Selection.Interior

.ColorIndex = 35

.Pattern = xlSolid

End With

J aimerai que le remplissage des cellules s arrête à la dernière ligne renseignée et non sur toute la colonne.

Voilà voila

Merci encore de ton aide

Bonjour,

Essaie ceci :

Sub essFormule2()
Dim Fm As Range
Dim lig As Integer
Set Fm = Range("w2", Range("w65536").End(xlUp))
With Range("x2")
    .Select
    .NumberFormat = "0.0%"
    .Formula = "=IF(w2=0,0,w2/f2)"
    .AutoFill Destination:=Fm.Offset(0, 1)
End With
With Fm.Offset(0, 1).Interior
.ColorIndex = 35
.Pattern = xlSolid
End With
End Sub

Amicalement

Dan

Edit : cela suppose que c'est ta colonne W, qui est la référence pour appliquer la formule en X.

Merci de ta nouvelle réponse mais la solution ne passe t elle pas plutot par des commandes comme : Do While ou Do Until ....

J ai lu ça dans un bouquin mais ne maitrisant pas le truc . . .

re,

Pourquoi faire une boucle ou faire compliqué si cela fonctionne...

La boucle ralentit le code. Quand on peut s'en passer c'est mieux.

Ici tu lis toute la plage d'un seul coup. Avec une boucle tu vas répéter des instructions pour chaque cellule.

Dan

Bonjour,

Je suis ok que dans ce cas précis ça fonctionne puisqu'on balaie jusqu a la 65536e ligne et mon IF detecte si il y a lieu de faire le calcul ou non.

Par contre, pour la mise en couleur de la colonne, comment faire pour qu elle s arrete à la dernière ligne renseignée ...? ??? Il faut bien une boucle, non ?

Désolé d insister Nad-Dan mais le scorpion est tenace (LOL)

Et puis même si le calcul fonctionne, avoir la manip pour mettre une boucle pourra toujours me servir à l'avenir et pouvoir aller au delà du simple enregistrement bête et méchant.

Merci de ton aide

Re Bjr,

Je viens de tester une nouvelle version en modifiant 1163 par 65536 et la macro rame énormément pour faire les calculs.

De plus, le fichier de 1.7 Mo et passé à 61 Mo oups ! !

Et si on testait avec une tite bouclette . . . . ? ?

Bonjour à tous,

rere77, Oublie ta macro initiale !

et envoie les dix 1ère lignes de ton fichier. (avec les formules)

Claude.

Bonjour tous,

Rere77, ce que tu n'as pas compris c'est que dans les codes proposés, tu as une plage "intelligente", qui remplace ta condition IF

Range("w2", Range("w65536").End(xlUp)

veut dire de W2 jusqu'à la première cellule remplie, en partant de W65536, vers le haut.

Avec ça, que tu aies 10 lignes remplies ou 500, l'instruction est la même, et pas besoin de boucle.

Ta formule IF semble même inutile, sauf si tu as des blancs dans ta colonne W, entre la première et la dernière ligne utilisée.

Fais des essais tu verras...

Et pense à effacer toute ta colonne X avant de relancer la macro, puisque le code ne la nettoie pas.

Sinon ajoute une ligne

Columns("X:X").ClearContents

Edit : oui bien sûr Dan, la colonne X, chuis bête

re,

Désolé d insister Nad-Dan mais le scorpion est tenace (LOL)

Désolé mais moi aussi...scorpion

ça fonctionne puisqu'on balaie jusqu a la 65536e ligne

Non on ne balaie pas justement. C'est avec la boucle que tu vas balayer. Afin de ne pas répéter ces dires, vois l'explication de Sylvain.

Je viens de tester une nouvelle version en modifiant 1163 par 65536 et la macro rame énormément pour faire les calculs.

Quoi de plus normal puisque tu vas jusque la ligne 65536. De plus si tu as beaucoup de formules de couleur cela ne fait qu'empirer bien sûr.

A te relire

Dan

edit :

Sylvain, à mon avis c'est sur la colonne X qu'il appliquer un "clearcontents".

Rere77, si oui rajoute l'instruction ci-dessous juste après le SET FM....

Fm.Offset(0, 1).ClearContents

A noter que tu peux supprimer la ligne DIM LIG AS INTEGER qui ne sert à rien dans mon code.

Dan

Dan,

D'accord avec toi pour nettoyer la colonne X (et pas la W )

Par contre ton Fm.Offset(0, 1).ClearContents, je suis pas pour...

En effet si des lignes ont été supprimées depuis le dernier lancement de la macro, tu ne nettoiera pas jusqu'au bout.

Donc Rere77 : soit tu nettoies toute la colonne X avec

Columns("X:X").ClearContents

soit tu nettoies la plage utilisée de la colonne X avec

Range("X2", Range("X65536").End(xlUp)).ClearContents

re,

Sylvain, d'accord avec toi si le nombre de données contenus dans la colonne W est plus petit que ceux dans la colonne X.

Cela peut effectivement arriver mais me semble peut probable puisque la colonne X contient une formule.

Toutefois par sécurité, il est peut-être préférable d'adopter ton code.

Pour Rere77, l'inxtruction Range("X2", Range("X65536").End(xlUp)).ClearContents pourrait être placée juste avant l'instruction SET.....

Amicalement

Dan

Je progresse grâce à vous tous ! !

J ai donc rentré le code :

Dim fm As Range

Set fm = Range("w2", Range("w65536").End(xlUp))

With Range("X2")

.Select

.NumberFormat = "0.0%"

.FormulaR1C1 = "=RC[-1]/RC[-18]"

.AutoFill Destination:=fm.Offset(0, 1)

End With

' Columns("X:X").Select === > NE SERT A RIEN ???

With fm.Offset(0, 1).Interior

.ColorIndex = 35

.Pattern = xlSolid

End With

Seul souci à la fin c'est que la mise en couleur ne se met qu a partir de la ligne 2 (forcément la plage fm va de 2 à 65536 si j ai bien compris)

Il faut donc définir une autre plage qui part de la ligne 1 ?? non ??

re,

la plage fm va de 2 à 65536 si j ai bien compris)

La plage ne va pas mais peut aller de 2 à 65536.

Relis les explications dans le post de Sylvain.

Quel est le critère de la mise en couleur dans la colonne X ? la formule en colonne W ou autre chose ?

Sinon mets W1 à la place de W2 pour voir ce que cela provoque...

Dan

Nad-Dan a écrit :

re,

la plage fm va de 2 à 65536 si j ai bien compris)

La plage ne va pas mais peut aller de 2 à 65536.

Relis les explications dans le post de Sylvain.

Désolé pour cet abus de langage d un pauvre profane...

Quand je mets w1 à la place de w2 ça plante sur la ligne Autofill, le calcul ne se fait qu en cellule x2 et s arrete.

Ha j oubliais, je n ai pas de criteres de remplissage de couleur, je remplis de la ligne 1 (ligne d'en tete du tableau) à la dernière renseignée.

re,

rere77,

il est "Top secret" ton fichier ou quoi ?

amicalement

Claude.

re,

Je ne te suis plus dans ton pb.

En W1 tu as quoi ?

que veux tu en X1

Si tu dois avoir une formule en X1, le Range("X2") dans la macro doit être RANGE("X1")

Dan

Rechercher des sujets similaires à "mettre boucle macro"