programmation de formules par l'intermédiaire de VBA
6 réponses
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
:
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ...
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 ...
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 ...
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 ...
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" <nospam.Garette@hotmail.com> a écrit dans le message de
news:eJG0O$KRHHA.4000@TK2MSFTNGP04.phx.gbl...
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
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 ...
Luc Voeltzel
Les 2 formules suivantes marchent aussi bien l'une que l'autre :
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 ...
Les 2 formules suivantes marchent aussi bien l'une que l'autre :
"Garette" <nospam.Garette@hotmail.com> a écrit dans le message de
news:eJG0O$KRHHA.4000@TK2MSFTNGP04.phx.gbl...
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
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 ...
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.
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.
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.
Modeste
Bonsour® Luc Voeltzel avec ferveur ;o))) vous nous disiez :
Les 2 formules suivantes marchent aussi bien l'une que l'autre :
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)))
Bonsour® Luc Voeltzel avec ferveur ;o))) vous nous disiez :
Les 2 formules suivantes marchent aussi bien l'une que l'autre :
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))"
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)))
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 :
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)))
merci pour ces précisions !
(:o)
Luc
"Modeste" <nomail@nomail.net> a écrit dans le message de
news:O8ppHkLRHHA.464@TK2MSFTNGP02.phx.gbl...
Bonsour® Luc Voeltzel avec ferveur ;o))) vous nous disiez :
Les 2 formules suivantes marchent aussi bien l'une que l'autre :
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))"
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))"