OVH Cloud OVH Cloud

formule matricielle dans une macro

2 réponses
Avatar
j-pascal
Bonsoir à tous et à toutes,

Voici une magnifique formule que je dois à *docm* +/- *AV* +/- *Daniel M*
(?) , copyrights obligent ;-) :

{=SI(ET(NB.VIDE(Vals)>0;NB.SI(Vals;0)=0);
PETITE.VALEUR(SI(PRODUITMAT((Vals=TRANSPOSE(Vals))*(LIGNE(Vals)>=TRANSPOSE(LIGNE(Vals)));
LIGNE(Vals)^0)=1;Vals);{2;3;4});PETITE.VALEUR(SI(PRODUITMAT((Vals=TRANSPOSE(Vals))*(LIGNE(Vals)>=TRANSPOSE(LIGNE(Vals)));LIGNE(Vals)^0)=1;Vals);{1;2;3}))}

J'ai naïvement essayé de la saisir en "enregistrement automatique" de macro
pour voir sa traduction en code VBA. La réponse a été "enregistrement
impossible" ; ce n'est pas vraiment une surprise !

Néanmoins, est-il possible, via une macro, d'activer une telle formule une
seule fois, à l'ouverture d'un classeur par exemple ? Si oui, je recopierai
le résultat avec "copie spéciale / valeur" ce qui ne mobilisera pas trop de
ressources et permettra l'exécution plus rapide des mes autres procédures
...

Un grand merci d'avance pour vos lumières éventuelles,

JP

2 réponses

Avatar
docm
Voili.

Range("D1:D3").FormulaArray = _
"=IF(AND(COUNTBLANK(vals)>0,COUNTIF(vals,0)=0),SMALL(IF(MMULT((Vals=TRANSPOS
E(Vals))*(ROW(Vals)>=TRANSPOSE(ROW(Vals))),ROW(Vals)^0)=1,Vals),{2;3;4}),SMA
LL(IF(MMULT((Vals=TRANSPOSE(Vals))*(ROW(Vals)>=TRANSPOSE(ROW(Vals))),ROW(Val
s)^0)=1,Vals),{1;2;3}))"

docm



"j-pascal" wrote in message
news:
Bonsoir à tous et à toutes,

Voici une magnifique formule que je dois à *docm* +/- *AV* +/- *Daniel M*
(?) , copyrights obligent ;-) :

{=SI(ET(NB.VIDE(Vals)>0;NB.SI(Vals;0)=0);

PETITE.VALEUR(SI(PRODUITMAT((Vals=TRANSPOSE(Vals))*(LIGNE(Vals)>=TRANSPOSE(L

IGNE(Vals)));

LIGNE(Vals)^0)=1;Vals);{2;3;4});PETITE.VALEUR(SI(PRODUITMAT((Vals=TRANSPOSE(

Vals))*(LIGNE(Vals)>=TRANSPOSE(LIGNE(Vals)));LIGNE(Vals)^0)=1;Vals);{1;2;3})
)}

J'ai naïvement essayé de la saisir en "enregistrement automatique" de
macro

pour voir sa traduction en code VBA. La réponse a été "enregistrement
impossible" ; ce n'est pas vraiment une surprise !

Néanmoins, est-il possible, via une macro, d'activer une telle formule une
seule fois, à l'ouverture d'un classeur par exemple ? Si oui, je
recopierai

le résultat avec "copie spéciale / valeur" ce qui ne mobilisera pas trop
de

ressources et permettra l'exécution plus rapide des mes autres procédures
...

Un grand merci d'avance pour vos lumières éventuelles,

JP



Avatar
JB
(La formule présentée élimine les vides mais pas n'élimine pas 0)

http://cjoint.com/?gxgg4SQzmM

Cette formule élimine 0 et vides:

=PETITE.VALEUR(SI(NON(ESTNA(EQUIV(vals;vals;0)));SI((EQUIV(vals;vals;0) =LIGNE(INDIRECT("1:"&LIGNES(vals))))*(vals>0);vals));{1;2;3})

Elimine vides seulement:

=PETITE.VALEUR(SI(NON(ESTNA(EQUIV(vals;vals;0)));SI((EQUIV(vals;vals;0) =LIGNE(INDIRECT("1:"&LIGNES(vals))));vals));{1;2;3})

Ecriture par VBA:

Range("J1:J3").FormulaArray =
"=SMALL(IF(NOT(ISNA(MATCH(vals,vals,0))),IF((MATCH(vals,vals,0)=ROW(IND IRECT(""1:""&ROWS(vals))))*(vals>0),vals)),{1;2;3})"
[j1:j3].Value = [j1:j3].Value

JB



Bonsoir à tous et à toutes,

Voici une magnifique formule que je dois à *docm* +/- *AV* +/- *Daniel M*
(?) , copyrights obligent ;-) :

{=SI(ET(NB.VIDE(Vals)>0;NB.SI(Vals;0)=0);
PETITE.VALEUR(SI(PRODUITMAT((Vals=TRANSPOSE(Vals))*(LIGNE(Vals)>=TRAN SPOSE(LIGNE(Vals)));
LIGNE(Vals)^0)=1;Vals);{2;3;4});PETITE.VALEUR(SI(PRODUITMAT((Vals=TRA NSPOSE(Vals))*(LIGNE(Vals)>=TRANSPOSE(LIGNE(Vals)));LIGNE(Vals)^0)=1;Va ls);{1;2;3}))}

J'ai naïvement essayé de la saisir en "enregistrement automatique" de macro
pour voir sa traduction en code VBA. La réponse a été "enregistreme nt
impossible" ; ce n'est pas vraiment une surprise !

Néanmoins, est-il possible, via une macro, d'activer une telle formule une
seule fois, à l'ouverture d'un classeur par exemple ? Si oui, je recopi erai
le résultat avec "copie spéciale / valeur" ce qui ne mobilisera pas t rop de
ressources et permettra l'exécution plus rapide des mes autres procéd ures
...

Un grand merci d'avance pour vos lumières éventuelles,

JP