Une question très fréquente que se posent les utilisateurs de VBA est "quel est l'équivalent de la fonction Excel SOMME en VBA?". La réponse est qu'il n'y a pas de fonction native en VBA qui ferait la même chose que la fonction SOMME dans Excel. Mais comme VBA est un langage très flexible, il n'est pas bien compliqué d'obtenir le résultat souhaité grâce aux quelques lignes de code…
En gros, vous avez plusieurs possibilités. J'en ai choisi deux que je vais vous décrire dans ce tutoriel. Elles ont chacune ses avantages et ses inconvénients. À vous de choisir celle qui convient le mieux à votre situation.
Méthode 1: SOMME en VBA avec des boucles (loop)
La première méthode utilise les boucles, une fonctionnalité des plus classiques en VBA. Vous définissez les cellules que vous voulez inclure dans votre calcul de somme et ensuite vous parcourez toutes ces cellules en additionnant leur valeurs.
Deux avantages principaux: 1) une grande flexibilité concernant les plages et 2) la possibilité de faire une autre opération en même temps: par exemple utiliser des conditions (If...Then...Else End If
) pour choisir si la cellule doit être incluse dans la somme.
Le principe de la somme consiste à déterminer une variable qui va contenir les sommes intermédiaires. Dans le code ci-dessous, on l'appelle MaSomme
. Au départ, on lui assigne la valeur 0 (MaSomme = 0
) et ensuite, à chaque cellule parcourue dans la boucle, on ajoute la nouvelle valeur à la somme existante (ici: MaSomme = MaSomme + UneCellule.Valeur
)
Les procédures qui suivent sont des exemples de "comment cela fonctionne". Vous pouvez évidemment les transformer en fonctions et les utiliser comme fonctions pour directement obtenir les résultats.
Voici deux exemples du code de SOMME en VBA avec des boucles…
Tout d'abord le code qui additionne les valeurs des cellules sélectionnées:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub SommeEnVBA_1a() 'par Excel-Malin.com (https://excel-malin.com) 'calcul de somme en VBA: utilisation de boucles '>> la somme des cellules sélectionnées '--------------------------------------------------------------------- Dim MaSomme As Single Dim UneCellule As Range MaSomme = 0 For Each UneCellule In Selection.Cells If IsNumeric(UneCellule.Value) = True Then MaSomme = MaSomme + UneCellule.Value Next UneCellule MsgBox MaSomme End Sub |
Attention: Notez la condition If IsNumeric(UneCellule.Value) = True Then
utilisée dans le code. Elle sert à prévenir que le code crashe au cas où une ou plusieurs des cellules dans la sélection contient une valeur non numérique.
Le code suivant additionne les cellules au choix dans une colonne déterminée:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub SommeEnVBA_1b() 'par Excel-Malin.com (https://excel-malin.com) 'calcul de somme en VBA: utilisation de boucles '>> la somme de x cellules d'une colonne donnée '--------------------------------------------------------------------- Dim MaColonne As Single Dim MaPremiereLigne As Single Dim MaDerniereLigne As Single Dim UneLigne As Single Dim MaSomme As Single MaColonne = 3 '(= colonne "C") MaPremiereLigne = 2 MaDerniereLigne = 1000 MaSomme = 0 For UneLigne = MaPremiereLigne To MaDerniereLigne If IsNumeric(Cells(UneLigne, MaColonne).Value) = True Then MaSomme = MaSomme + Cells(UneLigne, MaColonne).Value Next UneLigne MsgBox MaSomme End Sub |
Cette méthode vous permet de changer dynamiquement les plages à additionner: vous pouvez faire une boucle sur les lignes (comme dans l'exemple plus haut) que vous imbriquez dans une boucle sur les colonnes. Vous pourrez donc faire la somme, par exemple, de la 5ème à la 25ème ligne dans la 3ème à 15ème colonne… Et voici le code VBA pour illustrer cette solution.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub SommeEnVBA_1c() 'par Excel-Malin.com (https://excel-malin.com) 'calcul de somme en VBA: utilisation de boucles '>> la somme d'une plage dynamique '--------------------------------------------------------------------- Dim MaPremiereColonne, MaDerniereColonne, UneColonne As Single Dim MaPremiereLigne, MaDerniereLigne, UneLigne As Single Dim MaSomme As Single MaPremiereColonne = 3 MaDerniereColonne = 15 MaPremiereLigne = 5 MaDerniereLigne = 25 MaSomme = 0 For UneColonne = MaPremiereColonne To MaDerniereColonne For UneLigne = MaPremiereLigne To MaDerniereLigne If IsNumeric(Cells(UneLigne, UneColonne).Value) = True Then MaSomme = MaSomme + Cells(UneLigne, UneColonne).Value Next UneLigne Next UneColonne MsgBox MaSomme End Sub |
Méthode 2: SOMME en VBA avec WorksheetFunction
La deuxième méthode pour faire la SOMME en VBA que je vous propose repose sur la fonction SOMME d'Excel que VBA "emprunte" grâce à la méthode WorksheetFunction
. (Tout sur les WorksheetFunction en général dans ce tutoriel…)
Ici, comme on utilise la fonction empruntée d'Excel, elle se comporte exactement de la même manière. Les avantages: la vitesse, la facilité (1 ou 2 lignes de code) et la possibilité de combiner différentes plages sur la même Feuille ou même sur les Feuilles différentes en un seul calcul.
Tout ce que vous avez à faire c'est définir la plage à additionner (par ex.: Set MaPlage = Range("A1:A5")
) et ensuite introduire cette plage dans la fonction SOMME d'Excel (MaSomme = Application.WorksheetFunction.Sum(MaPlage)
).
Attention, VBA est exclusivement anglophone donc vous n'utilisez pas "somme" mais bien "sum"! Le code MaSomme = Application.WorksheetFunction.Somme(MaPlage)
ne fonctionnera donc pas! (Astuce: les équivalents anglais de toutes les fonctions Excel sont disponibles dans la Liste de toutes les fonctions Excel).
Et voici 3 exemples de la SOMME en VBA avec l'utilisation de WorksheetFunction…
Pour commencer, la plus simple: somme des cellules A2:A600 :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub SommeEnVBA_2a() 'par Excel-Malin.com (https://excel-malin.com) 'calcul de somme en VBA: utilisation de WorksheetFunction '--------------------------------------------------------------------- Dim MaPlage As Range Dim MaSomme As Single Set MaPlage = Range("A2:A600") MaSomme = Application.WorksheetFunction.Sum(MaPlage) MsgBox MaSomme End Sub |
L'exemple suivant montre qu'il est possible de faire la somme des plages non contiguës se trouvant sur la même Feuille. Tout dépend de la définition de la plage à additionner (ici Range("A2:A600, B6:B7")
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub SommeEnVBA_2b() 'par Excel-Malin.com (https://excel-malin.com) 'calcul de somme en VBA: utilisation de WorksheetFunction '>> pour une plage non contiguë '--------------------------------------------------------------------- Dim MaPlage As Range Dim MaSomme As Single Set MaPlage = Range("A2:A600, B6:B7") MaSomme = Application.WorksheetFunction.Sum(MaPlage) MsgBox MaSomme End Sub |
Et voici le 3ème exemple qui montre que l'on peut additionner même les plages se trouvant sur des Feuilles différentes. Vous devez ajouter le nom de la Feuille à la définition de la plage (ex.: Set Plage_3 = Sheets("Feuil2").Range("F2:F600")
).
Attention, si vous ne définissez pas la Feuille explicitement, ce sont les plages de la feuille ACTIVE qui seront additionnées.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub SommeEnVBA_2c() 'par Excel-Malin.com (https://excel-malin.com) 'calcul de somme en VBA: utilisation de WorksheetFunction '>> pour plusieurs plages (se situant sur les Feuilles différentes) '--------------------------------------------------------------------- Dim Plage_1, Plage_2, Plage_3, Plage_4 As Range Dim MaSomme As Single Set Plage_1 = Range("A2:A600") Set Plage_2 = Range("D2:D600") Set Plage_3 = Sheets("Feuil2").Range("F2:F600") Set Plage_4 = Range("H2:H5") MaSomme = Application.WorksheetFunction.Sum(Plage_1, Plage_2, Plage_3, Plage_4) MsgBox MaSomme End Sub |
Conclusion de ce tutoriel
Voici donc une (ou plutôt des) manière(s) simple(s) pour calculer une somme en VBA. Ceci est un bon exemple de la flexibilité de VBA où, contrairement à d'autres langages (comme Python), vous pouvez obtenir le même résultat de différentes manières. Cela vous donne la possibilité d'utiliser la manière qui convient le mieux à votre style mais également qui convient le mieux au cas précis sur lequel vous travaillez…
Vous pouvez donc être assez créatifs en VBA – et je vous assure, avec le temps et l'expérience, la créativité vient toute seule!
Pour aller plus loin en VBA
Et pour finir, voici quelques autres tutoriels et articles qui pourraient vous être utiles pour vos macros en VBA…
- Comment utiliser la fonction Excel RECHERCHEV en VBA
- Toutes les fonctions disponibles en VBA
- et aussi Toutes les fonctions Excel (dont la plupart est disponible à VBA via
WorksheetFunction
tout comme la SOMME de ce tutoriel) - Comment manipuler des fichiers en VBA
- Envoyer un email avec VBA
- Comment débloquer les macros dans les fichiers provenant d'internet
9 commentaires sur “Calculer la SOMME en VBA: différentes méthodes”
Bonjour Monsieur et merci pour cet excellent tutoriel.
Toutefois j'ai une remarque, dans Le code qui additionne les cellules au choix dans une colonne déterminée (le deuxième code du tutoriel), pourriez-vous regarder la boucle et me dire s'il ne faut plutôt pas mettre Next UneLigne au lieu de Next UneCellule?
Merci bien.
Bonjour Freddy,
merci pour cette remarque. Vous avez raison, cela doit être "Next UneLigne".
Je viens de le corriger dans le tutoriel. Merci!
Cordialement, Martin
Merci a vous les gars
Bonjour, j'ai une question
d'abord voici c'est la méthode qui me convient le plus
Dim MaPlage As Range
Dim MaSomme As Single
Set MaPlage = Range("A2:A600")
MaSomme = Application.WorksheetFunction.Sum(MaPlage)
MsgBox MaSomme
End Sub
mais on peut pas remplacer le "A600" par un truc du type
x=range("a3").end(xldown).row
en gros ce que je veux dire si on connait pas le nombre de ligne dans une feuille f=donée, on peut pas remplacer le A600 par une variable ?
Merci beaucoup
Bonjour Momo,
vous pouvez utiliser ce code:
Cordialement, Martin
Bonjour
Toutes vos lignes de code fonctionnent à merveille
Bravo!
Cependant je voudrais que le résultat s'affiche dans une cellule et non dans une box.
Que dois-je remplacer?
Merci
Bonjour Michel,
pour cela, il faut remplacer la ligne:
MsgBox MaSomme
par
Range("B10").Value = MaSomme
(ici c'est pour la cellule B10, donc mettez celle dont vous avez besoin à la place)Voilà…
Bonjour,
Votre formule fonctionne bien avec Masomme=application.worksheetfunction.sum(plage), cependant peut-on la multiplier en plusieurs fois pour réaliser plusieurs sommes? (somme de A1+A2=… et B1+B2=….)
Merci pour votre retour.
Cdt. Julien
Je suis débutant. Merci pour ce Tuto et pour tout ce que vous faites pour aider les gens. Encore MERCI.