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

Somme.si en VBA

  • Initiateur de la discussion Initiateur de la discussion komodoe
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

K

komodoe

Guest
Bonjour à tous !

Je voudrais affecter le résultat d'une somme.si à une variable, en calculant ce résultat dans mon code vba... pas clair ?

Je m'explique : j'ai une colonne de n° de comptes, une colonne de montants. Je veux calculer la somme des montants des comptes dont le n° est supérieur à 6000000.

Je pourrais via vba inscrire la formule adéquate dans une cellule, affecter la valeur à une variable puis effacer la cellule mais j'aimerais faire le calcul directement dans le code vba...

Quelque chose dans ce genre :

Résultat = somme.si(Numéro_compte;">6000000";plage_montants)... mais en vba.

Pouvez-vous m'aider ?

Merci !!!
 
Re : Somme.si en VBA

Bonjour,

Là encore l'enregistreur de macros devrait faire des merveilles ... Tu le lances, tu rentre ta formule dans une cellule quelconque, et tu examines le code VBA généré. La réponse y est!
 
Re : Somme.si en VBA

bonjour

Tu peux utiliser les formules Excel en VBA avec Worksheet.function

Fait une recherche, il y a plein d'exemples sur le forum, n'utilisant pas ces fonction, je ne peux te renseigner plus mais la fonction, si je ne dis pas de betises doit etre SUMIF (Tout est en anglais)
 
Re : Somme.si en VBA

Bonjour à tous,
Wilfried🙂

Code:
Sub SommeSi()
[B][COLOR=DarkGreen]'Pour des N° de comptes en A2:A20 et des Montants en B2:B20[/COLOR][/B]
    Range("C1").Value = WorksheetFunction.SumIf(Range("A2:A20"), ">6000", Range("B2:B20"))
End Sub
Où tu peux bien entendu remplacer les range par des plages nommées. Il ne faut pas oublier le WorksheetFunction sinon risque de Bug.

L'utilisation de l'enregistreur de macro est la solution à beaucoup de manipulations simples. A partir de là, il faut tester, manipuler : cela permet d'apprendre le fonctionnement de VBA.

Coirdialement

Edit : La syntaxe complète pour appeler une fonction Excel est : Application.WorksheetFunction.SumIF
Mais celle ci peut être réduite comme indiqué ci dessus et tu peux même aussi, à priori, remplacer WorksheetFunction par Application
 
Dernière édition:
Re : Somme.si en VBA

Bonjour et GRAND MERCI à ceux (et celles ?) qui ont pris le temps de se pencher sur mon problème !

@ Coriolan :

Re:

Allez, je donne la réponse:

resultat=SUMIF(range("Numéro_compte"),">6000000",Range("plage_montants"))

En passant par l'enregistreur de macros, on obtient la traduction "littérale" de la formule à saisir dans une cellule, il me manquait la précision range("Numéro...

Je vais tester !

PS : merci à Spitnolan08 & wilfried_42 !
 
Re : Somme.si en VBA

Bon... je ne comprends pas.

Voici le code testé, selon vos indications (oui, je sais, j'ai un peu dérapé par rapport à ma somme.si initiale) :

RES = WorksheetFunction.SumProduct((Codes_comptes > 600000000) * (Codes_comptes < 800000000), Val_M_N)

Codes_comptes et Val_M_N étant des plages nommées

Résultat : erreur d'exécution 1004 - Impossible de lire la prorpiété SumProdut de la classe WorksheetFunction

Au secours !
 
Re : Somme.si en VBA

Re,

Effectivement tu as quelque peu dévié!

La transcription directe de formules matricielles en VBA ne fonctionne pas. Il faut bâtir un code plus complexe.

Si mon analyse est bonne compte tenu du peu d'informations délivrées.😎

Cordialement
 
Re : Somme.si en VBA

Re,

Effectivement tu as quelque peu dévié!

La transcription directe de formules matricielles en VBA ne fonctionne pas. Il faut bâtir un code plus complexe.

Cordialement

Alternative : somme.si(codes_compte;"6*";Valeurs)+somme.si(codes_comptes;"7*";Valeurs)

Mais je ne sais pas comment insérer les plages nommées dans le code, ni traduire les critères commence par 6, puis commence par 7...
 
Re : Somme.si en VBA

Bonjour à tous

regarde peut être le code ci dessous , si cela peut t aider :

Code:
Dim p1 As Range, p2 As Range
Set p1 = Range("A1:A5")
Set p2 = Range("B1:B5")
x = WorksheetFunction.SumIf(p1, ">6") * WorksheetFunction.SumIf(p2, ">7")

a voir si c'est le résultat attendu...

bon après midi
@+
 
Re : Somme.si en VBA

Re,
Salut Pierrot🙂,

ou peut être, pour répondre exactement à la question de Komodoe, en s'inspirant du code suivant pour des plages nommées s'appelant respectivement N_compte et Montant:
Code:
WorksheetFunction.SumIf(Range(ActiveWorkbook.Names("N_compte")), ">6000", Range(ActiveWorkbook.Names("Montant")))
N'utilisant jamais ou presque les plages nommées manuellement, il existe peut être une possibilité plus simple de les appeler en VBA.

Cordialement
 
Re : Somme.si en VBA

Salut Pierrot

Dans mon cas les 2 conditions s'appliquent à la même zone : additionner des montants pour lesquels les n° de comptes sont compris entre 600000 et 700000...

Exemple :
ColonneA / ColonneB
100000 / 2300
200000 / 100
250000 / 250
610000 / 500
650000 / 100
720000 / -100
760000 / -200

850000 / 9500

Résultat : 500+100-100-200 = 300

Si j'ai bien compris ton code, les 2 conditions ne s'appliquent pas à la même plage.

@Spitnolan08 : Je vais tester de ce pas !
 
Re : Somme.si en VBA

Salut bhbh

J'ai essayé le code suivant :
Dim RES As Variant
RES = [SumProduct(Val_M_N * (Codes_comptes > 600000000)* (Codes_comptes < 800000000))]
MsgBox RES

Cela me renvoie une erreur 13 : Incompatibilité de type... la variable est mal définie ?
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

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