Fonction somme en macro excel

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 662 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

Messages postés
5
Date d'inscription
mardi 7 juillet 2009
Statut
Membre
Dernière intervention
15 juin 2011

je n'ai pas de commentaires particuliers à ajouter si ce n'est un grand merci pour tes efforts à partager tes connaissances et découvertes, même si elles ne sont pas complètement satisfaisantes.
Bien amicalement
Messages postés
10
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
12 mai 2006

Merci pour les commentaires, je met la fiche à jour dès que j'ai 2 secondes de dispo.
Juste pour info, le nom aaa n'a pas été choisit au hasard, c'est pour tester l'utilisation du menu d'insertion de fonction sans aller chercher la fonction au fin fond de la liste. Ceci dit, tu as raison, avant de la poser ici j'aurais du lui donner un p'tit nom plus parlant.
Merci encore.
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..
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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.
Afficher les 7 commentaires

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.