Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Fonction VBA de somme qui ne refresh pas

F22Raptor

XLDnaute Impliqué
Hello
Ci-joint, une tentative de codage d'une fonction perso :
J'ai un tableau avec des dates, et des montants pos ou nég pour chaque date.

Je veux une fonction VBA (pas de fonction matricielle, ou d'ajout de colonne dans le tableau) qui me donne pour une année donnée, la somme des montants de cette année.

Ca marche, mais lorsque j'ajoute un montant à la liste, ça ne rafraîchit pas.
Je pourrais ajouter un événement CHANGE à ma feuille qui force un Calculate quand on ajoute une entrée, mais peut-être que c'est juste une erreur dans le code de ma fonction.

Merci pour votre expertise !
 

Pièces jointes

  • fonction_somme.xlsm
    28 KB · Affichages: 26

Dranreb

XLDnaute Barbatruc
Bonjour.
Le fond du problème c'est que Excel ne peut pas deviner que les colonnes A:B sont des antécédents de la formule si elles ne sont pas transmises en paramètre à la fonction. Aussi ne voit-il aucune raison directe de la réévaluer si elles changent.
 
Dernière édition:

Jacky67

XLDnaute Barbatruc

Bonsoir,
Essaye avec l'instruction:
Application.Volatile
en début de fonction

Mais pourquoi ré-inventer la poudre ???
=SOMMEPROD((ANNEE(A2:A500)=E2)*B2:B500)
Le fait nativement
 

Dranreb

XLDnaute Barbatruc
Mais supposons que ça n'a été fait qu’à titre d'exercice.
Je l'écrirais comme ça :
VB:
Option Explicit
Function SommeAnnee(ByVal Annee As Integer, ByVal RngDon As Range) As Currency
   Dim TDon(), L As Long
   TDon = Intersect(RngDon, RngDon.Worksheet.UsedRange).Value
   For L = 2 To UBound(TDon, 1)
      If Year(TDon(L, 1)) = Annee Then SommeAnnee = SommeAnnee + TDon(L, 2)
      Next L
End Function
En F2, à propager sur 4 lignes :
Code:
=SommeAnnee(E2;A:B)
 

Modeste geedee

XLDnaute Barbatruc
sans formule, sans macro
un simple actualiser le TCD
 

F22Raptor

XLDnaute Impliqué
@Dran : je bosse sur ta fonction
Tu n'as pas défini le type de ta variable tableau TDon()
Instinctivement, je l'ai mise en Range, mais ça ne marche pas !
Quel serait son type (autre que Variant, bien sûr !) ? Pour moi c'est une zone, au même titre que RngDon


@jacky : j'ai testé Volatile. Ca fonctionne, mais ça fait horriblement ramer la saisie !
 

Dranreb

XLDnaute Barbatruc
Non, ce n'est pas la même chose: RngDon est un objet Range. Et la propriété Value d'un objet Range représentant une plage de cellules est un Variant contenant un tableau VBA basé 1 d'éléments de type Variant. Il n'y a pas à en sortir, c'est comme ça. Si vous tenez à typer TDon ça doit forcément être TDon() As Variant.
 
Dernière édition:

F22Raptor

XLDnaute Impliqué
Question complémentaire : d'un point de vue des perfos (imaginons sur un très grand tableau), qu'est ce qui sera le plus efficace ?
Une formule matricielle comme le SommeProd proposé plus haut (qui marche très bien ! ), ou une fonction perso de ce type ?
 

Discussions similaires

Réponses
20
Affichages
657
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…