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 Sub

Pas limitatif ! Il y a une quasi infinité de façons de faire !

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... ! ) je décide de faire une réponse... alors, pour essayer au mieux que ma réponse puisse servir à quelque chose (soit aider ou inciter le demandeur à penser ses questions autrement de façon à obtenir des réponses plus optimales ou qui le fasse progresser) elle va être conçue dans le sens "ce que vous auriez voulu savoir, si vous aviez pu imaginer pouvoir le demander, sans avoir à le demander" [pas "tout" parce que j'en finirais jamais ! ]

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 ) la réponse immédiate à la question : comment écrire la formule dans le code ! Une formule est une donnée String donc une chaîne que tu places entre guillemets, et pour y incorporer un élément recueilli au moyen d'un variable (ou calculé directement par une expression) tu fais tout simplement une concaténation de morceaux de chaînes pour aboutir à la chaîne finale.

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.

Rechercher des sujets similaires à "sum index onglet"