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

programmation de formules par l'intermédiaire de VBA

6 réponses
Avatar
Luc Voeltzel
Bonsoir à tous,

Est-ce que qelqu'un s'y connait en programmation de formules par
l'intermédiaire de VBA, notamment en ce qui concerne la manière d'utiliser
les addresses :

le problème :

la fonction moyenne mobile programmée en VBA comme suit fonctionne très bien
:

plage.Columns(2).Formula = "=AVERAGE(OFFSET(F2,0,0,$K$2,1))"

renvoie dans chaque cellule de la colonne 2
=MOYENNE(DECALER(F2;0;0;$K$2;1))
=MOYENNE(DECALER(F3;0;0;$K$2;1))
=MOYENNE(DECALER(F4;0;0;$K$2;1))
... etc
Tous les calculs de la colonne sont effectués

alors que
la fonction suivante ne fonctionnne pas :
plage.Columns(1).Formula = "=RC[1]-STDEVP(OFFSET(F2,0,0,10,1))"
renvoie dans chaque cellule de la colonne 1
=M2-ECARTYPEP(DECALER('F2';0;0;10;1))
=M2-ECARTYPEP(DECALER('F2';0;0;10;1))
=M2-ECARTYPEP(DECALER('F2';0;0;10;1))
... etc
remarque : M2 car la plage est addressée initialement sur les colonnes 12 à
16
set plage=plage = Worksheets(NFeuill).Range(Cells(1, 12), Cells(N + 2, 16))

bien sûr aucun calcul n'est alors effectué dans la colonne 1 puisque F2 a
été remplacé par 'F2'. Chaque cellule de la colonne 1 renvoie donc #NOM?, et
je ne comprends pas pourquoi VBA effectue ce changement ???...

Il me semble pourtant que le principe de programmation de la première
colonne est le même que celui de la deuxième colonne.
En effet, la colonne 2 calcule une moyenne mobile à partir d'une plage
[OFFSET(F2,0,0,10,1)]. La colonne 1 calcule selon le même principe un
écart-type de cette même plage STDEVP(OFFSET(F2,0,0,10,1)), et enlève cet
écart-type à la moyenne calculée dans la colonne 1.

Merci pour votre aide,

6 réponses

Avatar
Garette
Bonsoir,
Dans la formule "=RC[1]-STDEVP(OFFSET(F2,0,0,10,1))"
On a RC[1] et F2.
J'ai l'impression qu'il y a une évaluation à la volée.
Lors de l'application de la formule, cette dernier s'attend à recevoir des
coordonnées relatives du type RC[1] alors quand elle voit F2 elle ne
comprend plus ... et met 'F2' au lieu de F2.
'F2' n'est pas reconnue comme une référence.

En revanche, les 2 formules suivantes fonctionnent :
plage.Columns(1).Formula = "=RC[1]-STDEVP(OFFSET(RC[1],0,0,10,1))"
ou
plage.Columns(1).Formula = "ò-STDEVP(OFFSET(F2,0,0,10,1))"

F2 et RC[1] etant toutes les 2 des formules relative, il faut juste adapter
un peu ...
Avatar
Luc Voeltzel
Bonsoir Garette,

pardon de poser des questions si bêtes, mais je suis débutant dans
l'utilisation des coordonnées relatives.
Il y a effectivement 'évaluation à la volée', et je crois que vous apportez
la solution à mon problème.

Merci ,

Luc Voeltzel

"Garette" a écrit dans le message de
news:eJG0O$
Bonsoir,
Dans la formule "=RC[1]-STDEVP(OFFSET(F2,0,0,10,1))"
On a RC[1] et F2.
J'ai l'impression qu'il y a une évaluation à la volée.
Lors de l'application de la formule, cette dernier s'attend à recevoir des
coordonnées relatives du type RC[1] alors quand elle voit F2 elle ne
comprend plus ... et met 'F2' au lieu de F2.
'F2' n'est pas reconnue comme une référence.

En revanche, les 2 formules suivantes fonctionnent :
plage.Columns(1).Formula = "=RC[1]-STDEVP(OFFSET(RC[1],0,0,10,1))"
ou
plage.Columns(1).Formula = "ò-STDEVP(OFFSET(F2,0,0,10,1))"

F2 et RC[1] etant toutes les 2 des formules relative, il faut juste
adapter

un peu ...




Avatar
Luc Voeltzel
Les 2 formules suivantes marchent aussi bien l'une que l'autre :

plage.Columns(1).Formula = "=RC[1]-2*STDEVP(OFFSET(RC[-6],0,0,16,1))"
plage.Columns(1).Formula = "=M2-STDEVP(OFFSET(F2,0,0,10,1))"

merci à Garette
:-)


"Garette" a écrit dans le message de
news:eJG0O$
Bonsoir,
Dans la formule "=RC[1]-STDEVP(OFFSET(F2,0,0,10,1))"
On a RC[1] et F2.
J'ai l'impression qu'il y a une évaluation à la volée.
Lors de l'application de la formule, cette dernier s'attend à recevoir des
coordonnées relatives du type RC[1] alors quand elle voit F2 elle ne
comprend plus ... et met 'F2' au lieu de F2.
'F2' n'est pas reconnue comme une référence.

En revanche, les 2 formules suivantes fonctionnent :
plage.Columns(1).Formula = "=RC[1]-STDEVP(OFFSET(RC[1],0,0,10,1))"
ou
plage.Columns(1).Formula = "ò-STDEVP(OFFSET(F2,0,0,10,1))"

F2 et RC[1] etant toutes les 2 des formules relative, il faut juste
adapter

un peu ...




Avatar
Garette
Re,

Il y a 2 façons de referencer une cellule
1a - L3C4 (ou R3C4 en version US et dans les macros) coordonnée absolue
(veut dire Ligne 3 colonne 4. C'est comme une coordonnée GPS :-)
1b - L(1)C(2) (ou R[1]C[2] en version US et dans les macros) coordonnée
relative (veut dire 1 ligne en dessous et 2 colonnes à droite de la cellule
où on se trouve)

2a - $D$3 coordonnée absolue (Avec les $ c'est une coordonnée absolue comme
1a. la colonne D et la ligne 3. Comme à la batille navale)
2b - D3 coordonnée relative (c'est relatif mais c'est moins parlant que 1b.
Il faut savoir où on est)

NB1 - Si on utilise ActiveCell.Formula = "=R[1]C[2]" on fera toujours
reference à la cellule 1 fois en dessous et 2 fois à droite qq soit
l'endroit aù on se trouve.
Si on utilise ActiveCell.Formula = "ã" on fera toujours référence à E3 qq
soit l'endroit aù on se trouve.
Pourtant les 2 formules, in fine, sont des fomules relatives ....
NB2 - Pour info et pour illustrer, l'affichage L1C1 se modifie dans
Outils/Options/General/Style de reference L1C1

En macro, pas de probleme on peu ecrire dans les 2 styles, à l'arrivée la
formule s'adapte.
Mais on ne peut pas mixer ...
R[1]C[2] me semble toutefois plus parlant.
Voir également FormulaR1C1.
Avatar
Modeste
Bonsour® Luc Voeltzel avec ferveur ;o))) vous nous disiez :

Les 2 formules suivantes marchent aussi bien l'une que l'autre :

plage.Columns(1).Formula = "=RC[1]-2*STDEVP(OFFSET(RC[-6],0,0,16,1))"
plage.Columns(1).Formula = "=M2-STDEVP(OFFSET(F2,0,0,10,1))"


Pour plus de rigueur comme l'a évoqué Garette il faudrait même logiquement
ecrire :
plage.Columns(1).FormulaR1C1 = "=RC[1]-2*STDEVP(OFFSET(RC[-6],0,0,16,1))"
ou
plage.Columns(1).Formula = "=M2-STDEVP(OFFSET(F2,0,0,10,1))"

Pour continuer dans ce sens ;o)))
On pourrait aussi écrire en langage local :
(Noter le remplacement des R(ow )en L(igne),des crochets et des virgules)
plage.Columns(1).FormulaR1C1Local
="=LC(1)-2*ECARTYPEP(DECALER(LC(-6);0;0;16;1))"
ou bien encore
plage.Columns(1).FormulaLocal = "=M2-ECARTYPEP(DECALER(F2;0;0;10;1))"




--
--
@+
;o)))

Avatar
Luc Voeltzel
merci pour ces précisions !
(:o)

Luc

"Modeste" a écrit dans le message de
news:
Bonsour® Luc Voeltzel avec ferveur ;o))) vous nous disiez :

Les 2 formules suivantes marchent aussi bien l'une que l'autre :

plage.Columns(1).Formula = "=RC[1]-2*STDEVP(OFFSET(RC[-6],0,0,16,1))"
plage.Columns(1).Formula = "=M2-STDEVP(OFFSET(F2,0,0,10,1))"


Pour plus de rigueur comme l'a évoqué Garette il faudrait même logiquement
ecrire :
plage.Columns(1).FormulaR1C1 = "=RC[1]-2*STDEVP(OFFSET(RC[-6],0,0,16,1))"
ou
plage.Columns(1).Formula = "=M2-STDEVP(OFFSET(F2,0,0,10,1))"

Pour continuer dans ce sens ;o)))
On pourrait aussi écrire en langage local :
(Noter le remplacement des R(ow )en L(igne),des crochets et des virgules)
plage.Columns(1).FormulaR1C1Local
="=LC(1)-2*ECARTYPEP(DECALER(LC(-6);0;0;16;1))"
ou bien encore
plage.Columns(1).FormulaLocal = "=M2-ECARTYPEP(DECALER(F2;0;0;10;1))"




--
--
@+
;o)))