Macro - inscrire formule avec un loop

Bonsoir tout le monde

J'ai fait une macro avec un loop pour que tant qu'il y a quelque chose dans la colonne A, alors sur la ligne correspondante la formule F2-G2 s'inscrive dans la colonne H2

Sub boucle()

    Do
    Range("H2").Select
    ActiveCell.FormulaR1C1 = "=RC[-2]-RC[-1]"
    Loop While Range("A2") > 0

End Sub

Ca plante a la dernière ligne, est ce que quelqu'un sais pourquoi ?

merci

Bonsoir,

le problème est que le numéro de ligne n'est pas "variable" !

vous faites le teste sur A2 hors A2 si vide alors vous ne sortirez pas de la boucle car le "2" n'est pas en variable...

Ceci pour tester et expliquer le besoin de mettre en "variable" le numéro des lignes...

Sub boucle()
    Dim Ligne As Long
    Ligne = 2
    Do
    Range("H" & Ligne).Select
    ActiveCell.FormulaR1C1 = "=RC[-2]-RC[-1]"
    Ligne = Ligne + 1
    Loop While Range("A" & Ligne) <>""

End Sub

Bonsoir Christrucci, LouReed, bonsoir le forum,

Code étrange et inutile puisque tu boucles sans faire évoluer la cellule active qui reste toujours H2...

D'après ton énoncé j'aurais plutôt écrit :

Sub boucle()
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A
For I = 2 To DL 'boucle de 1 à DL
    Cells(I, "H").FormulaR1C1 = "=RC[-2]-RC[-1]" 'place la formule dans la colonne H (??? pourquoi H)
Next I 'prochaine ligne de la boucle
End Sub

Merci à vous deux pour vos réponse, la Macro de LooReed fonctionne parfaitement.

J'ai 100 000 lignes dans ma base a traiter et la macro de ThauThème a échoué pour insuffisance de capacité ! J'ai eu le même problème avec une macro qui doit justement faire un loop sur cette même base et virer les lignes inutiles, mais j'y arrive pas encore, je pense revenir plus tard demander un coup de main (à moins que j'adapte la macro de LooReed pour supprimer la ligne)

Merci en tout cas

Bonjour le fil, bonjour le forum,

Modifie le type des variables DL et I :

Dim DL As Long
Dim I as Long

Mais dans ce cas je coderais plutôt comme ça (sans boucle) :

Sub boucle()
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim I As Long 'déclare la variable I (Incrément)

DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A
Range("H2").FormulaR1C1 = "=RC[-2]-RC[-1]" 'place la formule dans la colonne H2
Range("H2").AutoFill Range("H2:H" & DL) 'tire la formule vers le bas jusqu'à la ligne DL
End Sub

Sinon pour supprimer des lignes il faut que ta boucle soit inversée de la dernière à la première avec un Step -1, du style :

Sub SupLign()
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim I As Long 'déclare la variable I (Incrément)

Application.ScreenUpdating = False 'masque les rafraîchissement d'écran
DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A
For I = DL To 2 Step -1 'boucle inversée sur toutes les lignes I de la dernière à la première
    'if (-> ici ta condition <-) then Rows(I).Delete
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissement d'écran
End Sub

Mais avec autant de ligne ça risque de prendre du temps.... Il y a d'autres méthodes plus rapides mais il faudrait que l'on ait un extrait de ton fichier pour voir laquelle serait la mieux adaptée...

Salut ThauThème,

Ta macro sans boucle qui étire la formule jusqu'en bas est superbe ! Ca prend nettement moins de temps (c'est instantané même). Merci beaucoup

J'ai testé la macro pour supprimer les lignes, par contre je n'arrive a rien avec ma condition.

J'ai utilisé cela :

If (Left("A" & DL, 6) < 600000) Then Rows(I).Delete

En fait dans ma colonne A, j'ai une liste de comptes comptables, et je doit dégager les comptes entre le 000 001 et 600 000.

Par la suite je rajouterai une ligne pour supprimer d'autres lignes car j'ai pas besoin non plus des comptes entre 630 000 et 649 999.

Je suppose que mon code pour la condition est faux, est-ce que l'erreur est flagrante ?

PS : J'ai mis la formule GAUCHE car j'ai certains fichiers a retraiter dont les comptes sont sur + de 6 chiffres.

Merci d'avance en tout cas

Bonjour,

un problème de type ?

gauche = alphanumérique et 600000 numérique, en fait j'en sais rien mais j'apprend... pas vite mais j'apprend

@ bientôt

LouReeD

Bonjour le fil, bonjour le forum,

Oui comme le dit LouReed, tu mélanges Numérique et Alphanumérique. Essaie comme ça :

    If CLng(Left("A" & DL, 6)) < 600000 Then Rows(I).Delete
Rechercher des sujets similaires à "macro inscrire formule loop"