Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[vba] SumProduct sur des plages variables

16 réponses
Avatar
Apprenti.xls
Bonjour à tous !

Quelle richesse ce forum ... J'apprend, j'apprends ...
Je me permets de poser une nouvelle fois un problème qui me soucie en ce
moment en espérant que l'un ou l'une d'entre vous pourra me donner un coup
de main. Là, je sèche ...
Je vais tâcher d'être le plus explicite possible.

Je souhaiterais faire apparaître un solde budgétaire dans un msgbox.
Ce solde budgétaire représente la différence entre un budget et la somme des
engagements.
Une feuille appelée "BDD" recense toutes les lignes de ces engagements et
ces budgets par compte.
Pour parvenir à mes fins, j'ai donc utilisé la fonction sommeprod, qui
fonctionne parfaitement dans une colonne d'Excel, cependant en passant par
le vba, comme je débute, le résultat m'affiche 0 à chaque fois ... il doit y
avoir, comme qui dirait, un problème.

Voici le code que j'ai conçu :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget * (Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"

MsgBox résultat
End Sub

Merci d'avance à ceux qui prendront le temps de lire mon message et y
apporteront quelques pistes de réflexion.
À bientôt !

10 réponses

1 2
Avatar
isabelle
bonjour Apprenti,

je l'ai mis en deux commandes pour que ce soit plus lisible.

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y
MsgBox résultat

isabelle


Bonjour à tous !

Quelle richesse ce forum ... J'apprend, j'apprends ...
Je me permets de poser une nouvelle fois un problème qui me soucie en ce
moment en espérant que l'un ou l'une d'entre vous pourra me donner un coup
de main. Là, je sèche ...
Je vais tâcher d'être le plus explicite possible.

Je souhaiterais faire apparaître un solde budgétaire dans un msgbox.
Ce solde budgétaire représente la différence entre un budget et la somme des
engagements.
Une feuille appelée "BDD" recense toutes les lignes de ces engagements et
ces budgets par compte.
Pour parvenir à mes fins, j'ai donc utilisé la fonction sommeprod, qui
fonctionne parfaitement dans une colonne d'Excel, cependant en passant par
le vba, comme je débute, le résultat m'affiche 0 à chaque fois ... il doit y
avoir, comme qui dirait, un problème.

Voici le code que j'ai conçu :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget * (Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"

MsgBox résultat
End Sub

Merci d'avance à ceux qui prendront le temps de lire mon message et y
apporteront quelques pistes de réflexion.
À bientôt !




Avatar
Apprenti.xls
Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget * (Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...
Avatar
michdenis
Bonjour ,

essaie ça :

'--------------------------------
Sub Solde_budgétaire()

Dim A As String, B As String, C As String

Dim Résultat As Variant
Dim Compte As String

A = "BDD!" & Range("Base_Budget").Address
B = "BDD!" & Range("Base_Comptes").Address
C = "BDD!" & Range("Base_Engagements").Address

Compte = "10a" ' à déterminer selon ton application

Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte & """)))")


Résultat = Evaluate("=sumproduct((" & A & "=""" & Crit & _
""")*(" & B & "=""" & Crit1 & """)*(" & C & "))")

End Sub
'--------------------------------


Salutations!




"Apprenti.xls" a écrit dans le message de news:

Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget * (Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...
Avatar
michdenis
Évidemment, seule la " première formule " de Résultat représente ce que tu désires !

Attention, si des lignes sont coupées par le service de messagerie !

Bonjour ,

essaie ça :

'--------------------------------
Sub Solde_budgétaire()

Dim A As String, B As String, C As String

Dim Résultat As Variant
Dim Compte As String

A = "BDD!" & Range("Base_Budget").Address
B = "BDD!" & Range("Base_Comptes").Address
C = "BDD!" & Range("Base_Engagements").Address

Compte = "10a" ' à déterminer selon ton application

Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte & """)))")

End Sub
'--------------------------------


Salutations!




"Apprenti.xls" a écrit dans le message de news:

Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget * (Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...
Avatar
isabelle
bonjour Apprenti,

J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?


non ce n'est pas nécessaire,
est que la solution donnée par Denis fonctionne bien ?

isabelle

Avatar
Apprenti.xls
Une nouvelle fois, merci d'avance Denis !
Je ne suis pas en mesure de tester pour le moment, je le ferai demain matin
(France).
Merci Isabelle pour les précisions sur les plages nommées.
À demain !

"Apprenti.xls" a écrit dans le
message de news:
Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget *
(Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur
mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...


Avatar
Apprenti.xls
Bonsoir (France) à tous !

À partir de combien de messages, utilise-t-on les superlatifs ?
Tout simplement, merci, Denis ! Ça marche très bien. Finalement, grâce à
Isabelle et à ton code, je crois deviner qu'il faut couper en plusieurs
morceaux toute la programmation pour que cela fonctionne mieux. J'ai essayé
d'alourdir encore un peu plus le code en ajoutant un arrondi, et ça marche !

round( Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))"),2)

Pendant que j'y étais, j'ai tenté de mettre en forme le résultat au format
?, mais cela ne passe pas.
Erreur de syntaxe encore une fois ?
Résultat.NumberFormat = "#,##0.00 [$?-1]_ ;-#,##0.00 [$?-1] "

Si quelqu'un a la gentillesse de s'intéresser encore à mon problème ...
J'apprends, j'apprends ...

"michdenis" a écrit dans le message de news:

Évidemment, seule la " première formule " de Résultat représente ce que tu
désires !

Attention, si des lignes sont coupées par le service de messagerie !

Bonjour ,

essaie ça :

'--------------------------------
Sub Solde_budgétaire()

Dim A As String, B As String, C As String

Dim Résultat As Variant
Dim Compte As String

A = "BDD!" & Range("Base_Budget").Address
B = "BDD!" & Range("Base_Comptes").Address
C = "BDD!" & Range("Base_Engagements").Address

Compte = "10a" ' à déterminer selon ton application

Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))")

End Sub
'--------------------------------


Salutations!




"Apprenti.xls" a écrit dans le
message de news:

Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget *
(Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur
mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...




Avatar
michdenis
Bonjour Apprenti,

Qu'est-ce que ceci : [$?-1]_ dans ton format... qu'est-ce qui doit s'afficher dans ta cellule... donne nous un exemple !


P.S. pour ce qui est de l'arrondi ... pourquoi n'avoir pas arrondi que la section Round(Evaluate( ....),2)
En passant, tu devrait utiliser la fonction "Arrondi de la feuille de calcul et non celle de VBA, elle a un petit bug bien connu, tu
obtiendrais
Résultat = WorksheetFunction.Round(Evaluate(....),2)


Salutations!


"Apprenti.xls" <apprenti.xls(a supprimer)@voila.fr> a écrit dans le message de news:
Bonsoir (France) à tous !

À partir de combien de messages, utilise-t-on les superlatifs ?
Tout simplement, merci, Denis ! Ça marche très bien. Finalement, grâce à
Isabelle et à ton code, je crois deviner qu'il faut couper en plusieurs
morceaux toute la programmation pour que cela fonctionne mieux. J'ai essayé
d'alourdir encore un peu plus le code en ajoutant un arrondi, et ça marche !

round( Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))"),2)

Pendant que j'y étais, j'ai tenté de mettre en forme le résultat au format
?, mais cela ne passe pas.
Erreur de syntaxe encore une fois ?
Résultat.NumberFormat = "#,##0.00 [$?-1]_ ;-#,##0.00 [$?-1] "

Si quelqu'un a la gentillesse de s'intéresser encore à mon problème ...
J'apprends, j'apprends ...

"michdenis" a écrit dans le message de news:

Évidemment, seule la " première formule " de Résultat représente ce que tu
désires !

Attention, si des lignes sont coupées par le service de messagerie !

Bonjour ,

essaie ça :

'--------------------------------
Sub Solde_budgétaire()

Dim A As String, B As String, C As String

Dim Résultat As Variant
Dim Compte As String

A = "BDD!" & Range("Base_Budget").Address
B = "BDD!" & Range("Base_Comptes").Address
C = "BDD!" & Range("Base_Engagements").Address

Compte = "10a" ' à déterminer selon ton application

Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))")

End Sub
'--------------------------------


Salutations!




"Apprenti.xls" a écrit dans le
message de news:

Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget *
(Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur
mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...




Avatar
Apprenti.xls
Et encore, et encore l'apprentissage ...
Merci Denis pour la fonction WorksheetFunction.Round()
Pour ce qui concerne l'affichage, c'est un oubli de ma part ... je
souhaiterais afficher en ? et en rouge si le résultat est négatif.
@+

"michdenis" a écrit dans le message de news:
%
Bonjour Apprenti,

Qu'est-ce que ceci : [$?-1]_ dans ton format... qu'est-ce qui doit
s'afficher dans ta cellule... donne nous un exemple !


P.S. pour ce qui est de l'arrondi ... pourquoi n'avoir pas arrondi que la
section Round(Evaluate( ....),2)
En passant, tu devrait utiliser la fonction "Arrondi de la feuille de
calcul et non celle de VBA, elle a un petit bug bien connu, tu
obtiendrais
Résultat = WorksheetFunction.Round(Evaluate(....),2)


Salutations!


"Apprenti.xls" <apprenti.xls(a supprimer)@voila.fr> a écrit dans le
message de news:
Bonsoir (France) à tous !

À partir de combien de messages, utilise-t-on les superlatifs ?
Tout simplement, merci, Denis ! Ça marche très bien. Finalement, grâce à
Isabelle et à ton code, je crois deviner qu'il faut couper en plusieurs
morceaux toute la programmation pour que cela fonctionne mieux. J'ai
essayé
d'alourdir encore un peu plus le code en ajoutant un arrondi, et ça marche
!

round( Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))"),2)

Pendant que j'y étais, j'ai tenté de mettre en forme le résultat au format
?, mais cela ne passe pas.
Erreur de syntaxe encore une fois ?
Résultat.NumberFormat = "#,##0.00 [$?-1]_ ;-#,##0.00 [$?-1] "

Si quelqu'un a la gentillesse de s'intéresser encore à mon problème ...
J'apprends, j'apprends ...

"michdenis" a écrit dans le message de news:

Évidemment, seule la " première formule " de Résultat représente ce que
tu
désires !

Attention, si des lignes sont coupées par le service de messagerie !

Bonjour ,

essaie ça :

'--------------------------------
Sub Solde_budgétaire()

Dim A As String, B As String, C As String

Dim Résultat As Variant
Dim Compte As String

A = "BDD!" & Range("Base_Budget").Address
B = "BDD!" & Range("Base_Comptes").Address
C = "BDD!" & Range("Base_Engagements").Address

Compte = "10a" ' à déterminer selon ton application

Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))")

End Sub
'--------------------------------


Salutations!




"Apprenti.xls" a écrit dans le
message de news:

Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de
type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget *
(Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur
mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...









Avatar
michdenis
Tu peux utiliser ceci comme format personnalisé
Evidemment, tu peux l'adapter selon tes exigences.

_# ##0,00" ?";[Rouge]_# ##0,00" ?"


Salutations!


"Apprenti.xls" <apprenti.xls(a supprimer)@voila.fr> a écrit dans le message de news: %
Et encore, et encore l'apprentissage ...
Merci Denis pour la fonction WorksheetFunction.Round()
Pour ce qui concerne l'affichage, c'est un oubli de ma part ... je
souhaiterais afficher en ? et en rouge si le résultat est négatif.
@+

"michdenis" a écrit dans le message de news:
%
Bonjour Apprenti,

Qu'est-ce que ceci : [$?-1]_ dans ton format... qu'est-ce qui doit
s'afficher dans ta cellule... donne nous un exemple !


P.S. pour ce qui est de l'arrondi ... pourquoi n'avoir pas arrondi que la
section Round(Evaluate( ....),2)
En passant, tu devrait utiliser la fonction "Arrondi de la feuille de
calcul et non celle de VBA, elle a un petit bug bien connu, tu
obtiendrais
Résultat = WorksheetFunction.Round(Evaluate(....),2)


Salutations!


"Apprenti.xls" <apprenti.xls(a supprimer)@voila.fr> a écrit dans le
message de news:
Bonsoir (France) à tous !

À partir de combien de messages, utilise-t-on les superlatifs ?
Tout simplement, merci, Denis ! Ça marche très bien. Finalement, grâce à
Isabelle et à ton code, je crois deviner qu'il faut couper en plusieurs
morceaux toute la programmation pour que cela fonctionne mieux. J'ai
essayé
d'alourdir encore un peu plus le code en ajoutant un arrondi, et ça marche
!

round( Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))"),2)

Pendant que j'y étais, j'ai tenté de mettre en forme le résultat au format
?, mais cela ne passe pas.
Erreur de syntaxe encore une fois ?
Résultat.NumberFormat = "#,##0.00 [$?-1]_ ;-#,##0.00 [$?-1] "

Si quelqu'un a la gentillesse de s'intéresser encore à mon problème ...
J'apprends, j'apprends ...

"michdenis" a écrit dans le message de news:

Évidemment, seule la " première formule " de Résultat représente ce que
tu
désires !

Attention, si des lignes sont coupées par le service de messagerie !

Bonjour ,

essaie ça :

'--------------------------------
Sub Solde_budgétaire()

Dim A As String, B As String, C As String

Dim Résultat As Variant
Dim Compte As String

A = "BDD!" & Range("Base_Budget").Address
B = "BDD!" & Range("Base_Comptes").Address
C = "BDD!" & Range("Base_Engagements").Address

Compte = "10a" ' à déterminer selon ton application

Résultat = Evaluate("(SumProduct((" & A & ") * (" & B & " = """ & _
Compte & """))) - (SumProduct((" & C & ") * (" & B & " = """ & Compte &
""")))")

End Sub
'--------------------------------


Salutations!




"Apprenti.xls" a écrit dans le
message de news:

Bonjour Isabelle et bonjour à tous,

Je te remercie une nouvelle fois de t'intéresser à mon problème.
J'ai encore quelques difficultés, cependant ...

Voici ce que j'ai fait :
- Remplacement de ma ligne sumproduct par ton code (plus facile à lire
effectivement avec les 3 formules)
- Déclaration des variables x et y as long
- J'obtiens le message d'erreur d'exécution '13' "Incompatibilité de
type"

Le code complet :

Sub Solde_budgétaire()

Dim résultat As Long
Dim ligne As Long
Dim compte As String
Dim x As Long
Dim y As Long

ActiveWorkbook.Names.Add Name:="Base_Budget", RefersToR1C1:= _
"=INDIRECT(""BDD!$m$2:$m$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Comptes", RefersToR1C1:= _
"=INDIRECT(""BDD!$C$2:$C$""&COUNTA(BDD!C3))"
ActiveWorkbook.Names.Add Name:="Base_Engagements", RefersToR1C1:= _
"=INDIRECT(""BDD!$AY$2:$AY$""&COUNTA(BDD!C3))"

ligne = ActiveCell.Row
compte = Range("C" & ligne)

'Ancienne formule
'résultat = ActiveCell.FormulaR1C1 = "SumProduct(Base_Budget *
(Base_Comptes
= compte)) - SumProduct(Base_Engagements * (Base_Comptes = compte))"
'

x = Evaluate("SumProduct(" & Range("Base_Budget").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

y = Evaluate("SumProduct(" & Range("Base_Engagements").Address & _
" * (" & Range("Base_Comptes").Address & " = " & compte & "))")

résultat = x - y

MsgBox résultat
End Sub

Qu'ai-je oublié ? Qu'est-ce qui peut bien clocher ?
J'ai par ailleurs une question : faut-il impérativement que je nomme les
plages dans mon code vba, si elles sont déjà nommées dans la feuille ?

Je te remercie par avance Isabelle si tu veux bien encore te pencher sur
mes
questions.
Toute autre aide est bien entendue la bienvenue.
J'apprends, j'apprends ...









1 2