Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VBA] Petit souci de traduction de formule

23 views
Skip to first unread message

ThierryP

unread,
Oct 20, 2021, 9:36:01 AM10/20/21
to
Bonjour le forum,

En colonne E, des références de produits, en colonne G, des prix.

En colonne I, je souhaite avoir le prix total des références qui commencent par "SR", donc j'écris :
=SOMMEPROD((GAUCHE(E2:E1000;2)="SR")*(G2:G1000))
Jusque là, tout va bien, ça fonctionne !

Je souhaite insérer cette formule par VBA en utilisant Range("I1").FormulaR1C1
donc je passe Excel en style de références L1C1 et la formule devient :
=SOMMEPROD((GAUCHE(L(1)C(-4):L(999)C(-4);2)="SR")*(L(1)C(-2):L(999)C(-2)))
Je traduis SOMMEPROD par SUMPRODUCT, GAUCHE par LEFT, je change le ; par une , je double les guillemets et je colle tout ça dans mon VBA :
Range("I1").FormulaR1C1 = "=SUMPRODUCT((LEFT(L(1)C(-4):L(999)C(-4),2)=""SR"")*(L(1)C(-2):L(999)C(-2)))"

.... et là, snif , "Erreur d'exécution"....
Qu'est-ce que j'ai loupé ????

Merci d'avance au généreux contributeur qui m'évitera de m'arracher les cheveux !!!

ThierryP


Michel__D

unread,
Oct 20, 2021, 10:18:50 AM10/20/21
to
Bonjour,
Quand tu veux faire ce genre de chose tu peux utiliser l'enregistreur de macro
et ensuite tu regarde le résultat obtenu cela peut donner des infos.

MichD

unread,
Oct 20, 2021, 11:01:00 AM10/20/21
to
Le 20/10/21 à 09:35, ThierryP a écrit :
Bonjour,

Tu peux utiliser ceci :

Range("A2").FormulaLocal =
"=SOMMEPROD((GAUCHE(E2:E1000;2)=""SR"")*(G2:G1000))"

Je n'ai jamais utilisé le style de références L1C1 et il est trop tard
pour moi pour commencer.

Pourquoi tiens-tu à utiliser cela? Peut-être parce que tu as du temps à
perdre??? ;-))

MichD


MichD

unread,
Oct 20, 2021, 11:03:48 AM10/20/21
to

ou comme ceci :

Range("A3").Formula = "=SUMPRODUCT((left(E2:E1000,2)=""SR"")*(G2:G1000))"

MichD

MichD

unread,
Oct 20, 2021, 12:44:16 PM10/20/21
to
Le 20/10/21 à 11:03, MichD a écrit :
>
>  ou comme ceci :
>
> Range("A3").Formula = "=SUMPRODUCT((left(E2:E1000,2)=""SR"")*(G2:G1000))"
>
> MichD

La chinoiserie que tu veux avoir si la formule doit être inscrite en I2
Range("i2") = _
"=SUMPRODUCT((LEFT(RC[-5]:R[4]C[-3],2)=""SR"")*(RC[-4]:R[4]C[-2]))"


MichD

MichD

unread,
Oct 20, 2021, 12:50:02 PM10/20/21
to

Le 20/10/21 à 12:44, MichD a écrit :
Le "-5" dans cette section de la formule signifie que la colonne est 5
colonnes à gauche de la cellule "i", soit la colonne D.

et dans cette section : (RC[-4]:R[4]C[-2]))"

Le "-4" signifie que la colonne est 4 colonnes à gauche de "i" soit la
colonne F.

Le moins que l'on puisse dire, cette syntaxe n'est pas évidente à lire
et à écrire...L'enregistreur de macro n'a pas le choix de la syntaxe
qu'il peut utiliser, mais les usagers OUI.

MichD

ThierryP

unread,
Oct 21, 2021, 5:00:05 AM10/21/21
to
Bonjour Denis,
Toujours fidèle au poste !!!
Le seul avantage, c'est qu'on peut mettre en variable numérique le numéro de ligne et de colonne, donc plus facile à manipuler si l'on souhaite trouver une cellule en fonction d'un calcul.
Les formules qui renvoient le numéro de colonne en fonction de la lettre sont un peu plus lourdes !
Mais j'avoue que je n'aime pas non plus !!

ThierryP

ThierryP

unread,
Oct 21, 2021, 5:05:03 AM10/21/21
to
C'est nickel, merci Denis !!

MichD

unread,
Oct 21, 2021, 7:29:02 AM10/21/21
to

> Bonjour Denis,
> Toujours fidèle au poste !!!
> Le seul avantage, c'est qu'on peut mettre en variable numérique le numéro de ligne et de colonne, donc plus facile à manipuler si l'on souhaite trouver une cellule en fonction d'un calcul.
> Les formules qui renvoient le numéro de colonne en fonction de la lettre sont un peu plus lourdes !
> Mais j'avoue que je n'aime pas non plus !!

Voici un exemple avec seulement des variables. Rien ne t'empêche
d'utiliser des variables dans une formule plus traditionnelle comme :
"=SUMPRODUCT((left(E2:E1000,2)=""SR"")*(G2:G1000))"

Ce code est beaucoup plus facile à lire et à interpréter. La difficulté
c'est souvent les guillemets...c'est une question de pratique et un peu
d'effort de compréhension!

'------------------------
Sub test()
Dim Rg As String
Dim Rg1 As String
Dim LastRow As Long
Dim T As String
T = "SR"

With Worksheets("Feuil1")
'Trouve la dernière ligne occupée de la colonne E
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row

'Comme ce code est écrit pour être employé dans n'importe
'quel module, j'insère le nom de la feuille devant la
'plage de cellule
Rg = .Name & "!" & .Range("E2:E" & LastRow).Address
Rg1 = .Name & "!" & .Range("F2:F" & LastRow).Address

'Et tu choisis la cellule où tu veux avoir le résultat.
.Range("A1") = "=SUMPRODUCT((left(" & Rg & ",2)=""" & T & """)*(" &
Rg1 & "))"

End With

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

MichD
0 new messages