Je vais d'abord essayé de t'expliquer le code que tu ne comprends pas.
1. Supposons qu'en cellule B1, tu veux écrire la somme des cellules A1 à A10, tu peux écrire :
1 2 3
| Range("B1").Formula = "=SUM(A1:A10)"
'---ou---
Cells(1,2).Formula = "=SUM(A1:A10)" |
Comment marche Formula ? Regardons d'abord ce qu'est la propriété Value d'une cellule. Value permet de définir la valeur que tu veux donner à une cellule, donc si tu veux écrire "toto" dans la cellule A1n tu écris ;
Range("A1").Value = "toto"
Soit la syntaxe : cellule.Value = la_valeur.
Avec Formula, c'est un peu la même chose sauf que là tu définis p as la valeur que tu veux écrire dans une cellule, mais la formule que tu veux écrire dans une cellule. Quand tu écris une formule dans une cellule, tu écris du texte, donc entre guillemets en VBA : tu mets entre guillemets exactement ce que tu écririrais en Excel (mais en ANGLAIS). Pour la somme, en français tu écrirais =SOMME(A1:A10) dans la cellule. D'où le code suivant :
Range("B1").Formula = "=SUM(A1:A10)"
2. Maintenant, notre problème, c'est que la plage est variable. Supposons qu'en B1, tu veuilles écrire la somme d'une plage variable : allant de A1 à la cellule en colonne A et en ligne Lig. Il faut qu'on trouve un moyen d'écrire plus ou moins : =SOMME(A1:ALig). Regardons d'abord un exemple d'utilisation de variable:
1 2 3 4
| Dim i As Long
i = 3
MsgBox "La famille Dupond compte " & i & " enfants." 'renvoie : La famille Dupond compte 3 enfants.
MsgBox "La famille Dupond compte i enfants" 'renvoie : La famille Dupond compte i enfants. |
Tu observes que tout ce qui est entre guillemets est considéré comme une chaîne de caractères. Si on veut caler une variable on ferme les guillemets et on concatène la chaine de caractère avec la variable avec le signe &.
Maintenant, on peut faire la même chose avec notre somme :
1 2 3
| Dim Lig As Long
Lig = 10
Range("B1").Formula = "=SUM(A1:A" & Lig & ")" |
On peut aussi le faire avec la première cellule plutôt que la dernière ligne :
1 2 3
| Dim prem As Long
prem = "A2"
Range("B1").Formula = "=SUM(" & prem & ":A10)" |
Tu comprends mieux ?
3. Tu observes bien qu'il faut écrire la formule comme si tu l'écrivais dans Excel. Tu dois donc écrire les addresses des cellules. Ici :
ActiveCell(4, 8) = "=somme(" & ActiveCell.Offset(8,8) &":" & ActiveCell.Offset(8,ActiveCell(1, 2).Value) & ")"
Tu essaies de concaténer l'objet cellule avec une chaîne de caractère, ce n'est pas possible. Tu ne peux que concaténer des valeurs numériques (converties automatiquement en texte) et des chaînes de caractères.
Il faut donner l'adresse des cellules --> on utilise la propriété Address.
ActiveCell(4, 8).Formula = "=SUM(" & ActiveCell.Offset(8,8).Address &":" & ActiveCell.Offset(8, ActiveCell(1, 2).Value).Address & ")"
Là, tu passes par l'écriture d'une formule dans Excel, mais tu peux aussi directement calculer la somme et l'écrire dans la cellule avec Application.Sum. Application.Sum est une fonction dans VBA, donc là tu peux écrire avec des objets. Syntaxe :
x = Application.Sum(Range(plage_a_sommer))
Dans ton cas ce erait donc :
ActiveCell.Offset(4,8).Value = Application.Sum(Range(ActiveCell.Offset(8,8), ActiveCell.Offset(8, ActiveCell.Offset(1, 2).Value))
La syntaxe Range(cellule1, cellule2) indique que tu veux travailler sur la plage cellule1 à cellule2.
C'est une autre possibilité, à toi de voir là où tu te sens le plus à l'aise. Néanmoins sache que la 2ème syntaxe écrit la valeur de la somme dans la cellule. Elle n'écrit pas une formule, donc si tu changes des valeurs dans les plages à sommer, les sommes ne seront pas mises à jour.
Partager