Fonction somme en macro excel

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 367 fois - Téléchargée 17 fois

Contenu du snippet

J'ai tenté de créer une fonction excel qui fait soit la somme de plages de cellules soit le produit.

Je me suis retrouvé confronté à plus de problèmes qu'attendu et du coup je me dis que ça peut servir à quelqu'un d'autre...

J'ai d'abord eut du mal à intégrer la sélection de plusieurs plages de cellules excel pour le calcul sans en définir un nombre maximal à l'avance.
Mon deuxième problème a été de gérer les plages de cellules à 2 dimensions (plusieurs lignes et plusieurs colonnes dans la même plage)

L'intérêt de la source ne réside évidemment pas dans son utilisation tel quel puisque c'est plus ou moins un clone de la fonction SOMME, mais dans son code même s'il n'y a rien de très particulier au final.

On peut appeler la fonction aaa par le menu excel insertion/fonction
Dans param on peut mettre "s" ou "p" pour calculer une somme ou un produit
Dans plage on peut mettre des coordonnée de cellules ou de plages de cellules.
On obtient une formule du style =aaa("s";A7:B9;C7:C8;A2)

Source / Exemple :


Function aaa(Param As String, ParamArray Plage()) As String
Dim c As Variant
Dim i As Double
Dim j As Double
Dim pl1 As Long
Dim pl2 As Long

'fonction somme
If Param = "s" Then
    aaa = 0
    For Each c In Plage
        If c.Count > 1 Then
            'dimmension des données
            pl1 = UBound(c.Value, 1)
            pl2 = UBound(c.Value, 2)
            For j = 1 To pl2
                For i = 1 To pl1
                    aaa = c(i, j).Value + aaa
                Next
            Next
        Else
            aaa = c.Value + aaa
        End If
    Next
End If
'fonction produit
If Param = "p" Then
    aaa = 1
    For Each c In Plage
        If c.Count > 1 Then
            'dimmension des données
            pl1 = UBound(c.Value, 1)
            pl2 = UBound(c.Value, 2)
            For j = 1 To pl2
                For i = 1 To pl1
                    aaa = c(i, j).Value * aaa
                Next
            Next
        Else
            aaa = c.Value * aaa
        End If
    Next
End If

End Function

A voir également

Ajouter un commentaire

Commentaires

cs_Julien39
Messages postés
6449
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
233 -
Sous excel on a accès aux fonctions d'excel comme SOMME, ton algorithme est donc inutile, de plus, il mettra beaucoup plus de temps à s'exécuter et ne gèrera pas aussi bien les erreurs...
xgluk
Messages postés
10
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
12 mai 2006
-
C'est effectivement ce que je dis dans mon commentaire: la fonction SOMME existe dans excel et en tant que tel, cette source est innutile!
Sauf que par pure curiosité j'ai essayé de reproduire cette fonction et en cherchant comment faire j'ai trouvé des questions similaires aux miennes dans les forums et cela peut servir pour développer d'autres fonctions qui n'existent pas nativement dans excel.
L'intérêt n'est pas ici de pouvoir faire une somme ou un produit mais de voir comment on peut accéder à un ensemble de plages de cellules sélectionnées pour travailler dessus à travers une fonction.
cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
59 -
Oui, voir ces deux fonctions :
WorksheetFunction.Sum
WorksheetFunction.Product

Ces fonctions acceptent des ensembles de plages, même disjointes.
Ce qui permettrait d'utiliser un objet "Plage" de type Range, plutôt que ce tableau de Variant.

Pour ton choix "Param" : astuce.
Puisque tu n'as que deux types possibles, autant imposer le choix plutôt que de laisser le programmeur choisir une chaine (tu te poseras la question plus tard pour savoir si c'est un "p" minuscule ou majuscule qu'il faut envoyer ...)
Dans la partie Déclaration de ta page de code :
Enum enumMesOpérations
[Addition]
[Multiplication]
End Enum
Et dans la déclaration de ta fonction :
Function aaa(Param As enumMesOpérations, ParamArray Plage()) As String

Ta fonction est dimensionnée/renvoie un String, alors que tu calcules quelque chose qui ressemble plutôt à un Double !
Attention à ce genre de conversion implicite.
cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
59 -
PS : Pour le Enum
Bien sûr, il faut aussi modifier le If :
If Param = "s" Then
en
If Param = [Addition] Then

Tu verras que dès que taperas le =, la liste des choix possibles apparaitra sous forme de liste.

D'ailleurs, mieux aurait valu un Select Case que ces deux If à la suite.
cs_fridg
Messages postés
1
Date d'inscription
mercredi 7 octobre 2009
Statut
Membre
Dernière intervention
13 juin 2011
-
Attention egalement au nom de ta fonction xgluk. "aaa" ca ne veut rien dire du tout donc ca ne sert a rien.
Meme pour un petit exercice du genre c'est important de penser a ceux qui voudraient utiliser ton code (c'est bien pour ca que tu l'exposes publiquement, non ?). S'ils ne comprennent pas a peu pres a quoi elle sert rien qu'en voyant son nom, ils ne l'utiliseront pas. Toi meme dans deux ou trois mois quand tu rouvriras ton classeur excel tu te diras "c'est quoi deja ce "aaa"...
Indice pour la nommer : pense a ce qu'elle fait. Elle calcule une somme ou un produit. Inspire toi de la facon dont les developpeurs d'Excel ont nomme leurs fonctions.
Egalement le nom de tes variables devrait etre plus explicite. Qu'est ce qu'il represente ton "c", ton "i", tes "pl" ? Si tu es capable de le dire en tres peu de mots, utilise
les dans ton code ! Pas d'abbreviations paresseuses !
J'attends une mise a jour..

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.