SUM avec index onglet
Bonjour,
j'ai un soucis avec SUM et les onglets
voilà, j'ajoute régulièrement des onglets à ma feuille, les nouveaux onglets sont automatiquement créé en 3ème position, (dans l'ordre des onglets)
et je voudrais faire un SUM avec la cellule résultat dans le premier onglet et les cellules de données se trouvant sur l'onglet en 3ème position
pour être plus claire, voilà le code de base, la macro est lancée de Feuil1, (le premier onglet)
Range("A2").Select
ActiveCell.FormulaR1C1 = "=SUM('Feuil3'!R[19]C[11]:R[23]C[11])"donc, à la place de ce code ou SUM est aiguillé sur "Feuil3" par son nom, qu'il soit aiguillé par l'index de l'onglet, qui est 3
ça fait plusieurs jours que je cherche sans résultat
si quelqu'un a une idée ça m’enlèverais une sacrée épine du pied
Bonjour,
Teste ceci :
ActiveCell.FormulaR1C1 = "=SUM('" & Worksheets(3).Name & "'!R[19]C[11]:R[23]C[11])"impec, à première vue ça marche nickel
un grand merci à toi
Bonjour,
Si c'est pour faire des exercices de codage...
Sinon je ne répèterai pas ce que je pense de cette façon d'utiliser VBA
Sub jadditionne()
Dim c As Range, fs$
Dim cbis As Range, cter As Range, plage As Range
Dim cquater As Range, ic%, k%, i%, S
Set c = Worksheets(1).Range("A2")
fs = Worksheets(3).Name
c.FormulaR1C1 = "=SUM('" & fs & "'!R[19]C[11]:R[23]C[11])"
'vérification autrement
Set cbis = c.Offset(1)
cbis.Formula = "=SUM('" & fs & "'!L21:L25)"
'vérification résultat
Set cter = cbis.Offset(1)
With Worksheets(3)
Set plage = .Range(.Cells(c.Row + 19, c.Column + 11), .Cells(c.Row + 23, c.Column + 11))
End With
cter = WorksheetFunction.Sum(plage)
'autre façon
Set cquater = cter.Offset(1)
ic = c.Row: k = c.Column + 11
With Worksheets(3)
For i = ic + 19 To ic + 23
S = S + .Cells(i, k)
Next i
End With
cquater = S
End SubPas limitatif !
mouarf ...
on peut dire que tu as le sens du détail
c'est sympa mais en VBA je suis loin d'avoir le niveau requis pour ton code
j'en comprends à peine la moitié
en tout cas je te remercie et je vais décortiquer ton code de manière à en apprendre plus sur VBA
Rebonjour,
Il ne s'agit pas à proprement parler de "sens du détail" (bien que j'en ai un peu...) !
Mais voyons le contexte : je lis une question qui, de mon point de vue, ne présente guère d'intérêt et illustre une façon d'utiliser VBA a-priori plus ou moins mal adaptée, une façon de sous-utiliser VBA donc !
Soit je passe sans répondre, ce que je fais lorsque je n'ai ni le temps ni l'envie..., soit pour une raison quelconque (pas toujours élucidée consciemment... !
Aussi, en farfouillant dans ma réponse, tu peux d'abord voir :
1) Que lorsque tu écris : Range("A2").Select suivi de ActiveCell.Formula... (code enregistré), Range("A2") et ActiveCell étant la même cellule tu peux prendre un raccourci et écrire directement : Range("A2").Formula..., moyennant quoi tu libères VBA d'un boulet qui le freine en lui permettant d'écrire directement la formule sans le forcer préalablement à sélectionner cette dernière, et toi tu écriras une ligne de moins. Chacun s'en porte mieux !
2) Que si l'enregistreur ne qualifie jamais : il écrit Range... en laissant la feuille implicite, soit le soin à VBA de la chercher, ce qui lors de réutilisation du code provoque parfois des surprises... toi tu peux (je dirai volontier tu dois) qualifier ton expression :
Worksheets(1).Range("A2") sera plus précis (et il faudra selon les cas être plus précis, par exemple si l'ordre des feuilles peut être modifié...) et évite à VBA de chercher (et parfois te tromper...)
3) Que si l'enregistreur ne sait pas utiliser de variables, toi tu le peux et par exemple, au lieu de répéter l'expression qualifiée à diverses reprises dans ton code, tu affectes au départ la cellule à une variable, ce qui te permet d'utiliser la variable ensuite en lieu et place. C'est aussi un gain pour VBA qui la mémorise et qui peut y accéder plus rapidement.
Tu as donc 2 exemples de variables dès le départ, variable plage pour la cellule cible et variable String pour recueillir le nom de la feuille source.
A la suite, tu as (enfin
Mais à la suite tu peux encore découvrir :
4) Que si l'enregistreur ne connait que FormulaR1C1, il y a d'autres façons de faire. A moins d'être parmi les très rares utilisateurs d'Excel à utiliser en permanence le style L1C1, je gage que tu écris tes formules habituellement en références style A1.
Pourquoi donc changer d'habitude ? Tu vois que tu peux l'écrire plus facilement et plus vite en Utilisant Formula...
Mais au-delà pourquoi passer un temps conséquent à coder une formule en VBA, alors que cela t'en aurait pris beaucoup moins de la taper dans la cellule. Au résultat tu auras toujours des formules, et ton classeur ne sera pas plus léger. Et ton utilisation de VBA se sera limitée à lui faire faire ce que tu fais manuellement, rien de plus.
Alors qu'il peut être intéressant d'utiliser VBA non pas pour insérer des formules mais pour éviter d'en mettre : on aura les résultats et un classeur allégé du poids des formules.
5) Tu peux voir qu'on peut utiliser VBA pour faire le calcul, calcul également fait avec la fonction SOMME d'Excel, mais utilisée selon syntaxe VBA pour obtenir le résultat. (En prime un autre utilisation de variable pour la plage source...)
6) Mais VBA peut aussi calculer en utilisant ses moyens propres au lieu de ceux d'Excel : par exemple parcourir la plage source au moyen d'une boucle utilisant des index de lignes et colonnes recueillis ou définis dans des variables, pour en additionner les valeurs et restituer le résultat.
(Au cas particulier, cette méthode ne sera sans doute pas plus rapide que la précédente, mais il s'agissait de montrer la diversité de moyens offerts par VBA dès que l'on consent à s'écarter de l'enregistreur).
Là j'ai trouvé que cela suffisait pour le moment !
Cordialement.