Les boucles avec VBA

Ci dessous on trouve un bout de code qu’on peut trouver sur internet. Il ne correspond pas exactement à notre besoin mais certains éléments sont présents. On va donc tenter de faire du bon piratage, c’est à dire récupérer une recette proche de celle qu’on voudrait réaliser et l’adapter à notre besoin. Nous on souhaite réaliser une boucle qui permette de calculer des taux de rendements. Une division sur des cellules décalées dans le temps.

Sub test_division()
'Déclaration ====================
Dim x As Long 'Peut aller jusqu'à la dernière ligne 65536
For x = 2 To [C65536].End(xlUp).Row - 1
'Pour X = 3 jusqu'à (première cellule non-vide de C en partant du bas
'(ligne 65536) et en remontant)=dernière cellule non-vide en C
Range("D" & x + 1) = Range("B" & x) / Range("B" & x).Offset(1, 0)
'Cellule Dx = Bx × (Bx, décalée de 0 ligne 1 colonne = Cx)
Next x
'x suivant
End Sub

On retient des lignes précédentes la manière de déclarer un sous programme ou une macrocommande dans VBA. On retrouve la logique d’un langage balisé avec au départ Sub le nom() et End Sub pour cloturer le programme.

Ensuite pour réaliser une boucle on aura besoin d’une variable. Un objet qui va se transformer durant l’exécution des commandes. Ici on la nomme x. On l’a déclare avec le fonction Dim avec la fonction As qui vient la compléter on indique la nature de la variable ici un chiffre qui aura une large plage de valeur possible en raison de la taille de la mémoire allouée. La caractéristique Long  indique un chiffre pouvant prendre de nombreuses valeurs. On lui préférera Integer pour une variable dont on sait qu’elle prendre des valeurs faibles et entières ce qui permet d’économiser de la mémoire.

Sub rendements()
Worksheets(« data »).Activate
Dim x As Long

For x = 3 To [B1500].End(xlUp).Row
Range(« h » & x) = Log(Range(« B » & x) / Range(« B » & x – 1)) * 100

Next x
End Sub

Avec Worksheets(« data »).Activate on indique dans quelle feuille on doit appliquer la macro. On aurait pu piloter une macro depuis un autre fichier pour un fichier qui n’aurait pas été ouvert avant.

Sub rendements2()
Worksheets("data").Activate
Range("F2").Select
ActiveCell.FormulaR1C1 = "r_nas_auto"
Range("G2").Select
ActiveCell.FormulaR1C1 = "r_esxb_auto"
Dim x As Integer
For x = 3 To [B1500].End(xlUp).Row
Range("f" & x) = Log(Range("B" & x) / Range("B" & x - 1)) * 100
Range("g" & x) = Log(Range("C" & x) / Range("C" & x - 1)) * 100
' Range("j" & x) = Log(Range("D" & x) / Range("D" & x - 1)) * 100

Next x
MsgBox x
End Sub

Dans cette macro on réalise 3 opération en 1. On calcule le rendement sur 3 titres simultanément.