Langage VBA hors du commun du type IF(R[3]C[-9]:R[7998]C[-9]....

Résolu/Fermé
écureuyl Messages postés 37 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 24 septembre 2016 - 9 oct. 2014 à 15:22
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 9 oct. 2014 à 17:29
Bonjour,

dans mon code VBA, j'ai besoin de copier la formule matricielle suivante dans une case :
=SOMME(SI(AQ5:AQ8000<>"";1/NB.SI(AQ5:AQ8000;AQ5:AQ8000)))

Quand je le demande sous VBA en créant une nouvelle macro, le code qui ressort est le suivant :
Range("AZ2").Select
Selection.FormulaArray = _
"=SUM(IF(R[3]C[-9]:R[7998]C[-9]<>"""",1/COUNTIF(R[3]C[-9]:R[7998]C[-9],R[3]C[-9]:R[7998]C[-9])))"

Malgré le fait que je bidouille sous VBA depuis pas mal de temps, je ne comprends pas le langage qu'il utilise ici, ni comment le comprendre, ni pourquoi il est utilisé...

J'aimerais avoir les traductions des caractères utilisés :
Comme par exemple les formulations du type :
- R[3] (, a quoi correspond le 3 ?)
- C[-9]

Et aussi pourquoi 1/COUNTIF, et pourquoi peut-on l'utiliser alors qu'habituellement pour utiliser une formule comme COUNTIF il faut ajouter Application.WorksheetFunction.CountIf (...)

Merci de votre aide !

A voir également:

2 réponses

Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
9 oct. 2014 à 16:15
Bonjour,

Tu peux utiliser simplement
    Range("AZ2").FormulaArray = "=SUM(IF(AQ5:AQ8000<>"""",1/COUNTIF(AQ5:AQ8000,AQ5:AQ8000)))"


R[3] indique une position relative de ligne par rapport à la cellule qui contient la formule
C[-9] indique une position relative de colonne par rapport à la cellule qui contient la formule
R[3]C[-9] correspond donc à AQ5 puisque décalée de 3 lignes et -9 colonnes par rapport à AZ2.

COUNTIF est simplement la traduction anglaise de la fonction Excel NB.SI alors que Application.WorksheetFunction.CountIf est une méthode VBA qui permet d'effectuer la même opération.
Dans ton cas, il s'agit d'inscrire la formule Excel dans AZ2 avec un code VBA.
Il est donc normal d'utiliser COUNTIF. Tu aurais pu te poser la même question pour les fonctions SUM ou IF.


A+
1
écureuyl Messages postés 37 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 24 septembre 2016 2
9 oct. 2014 à 16:35
Merci Gyrus pour toutes ces explications !!

Pour l'utilisation des fonctions Excel, je me suis fait aussi avoir par la syntaxe utilisée qui est différente de celle mise dans les cellules (, ou lieu des ; , "" ou lieu de " ).

Je me suis bien sûr posé les même questions pour SUM ou IF mais je voulais pas alourdir ma question.

Encore merci !
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
9 oct. 2014 à 17:29
Bonjour,

Pour compléter Gyrus R[3]C[-9] est la notation R1C1 que tu peux activer dans les options excel. Toi tu es habitué à la notation A1.

A noter que pour une formule 'simple' tu as :
.formulaR1C1
.formula

mais aussi :
.formulaR1C1local= "=ta_formule_en_français_références_type_R1C1"
et
.formulaLocal= "=ta_formule_en_français_références_type_A1"
qui te permet de faire un copier-coller de ta feuille dans vbe.

Ca n'existe pas pour FormulaArray.
Mais tu peux inscrire ta formule en français avec .formulaLocal
et la revalider en matriciel avec :
Range("AZ2").FormulaArray = Range("AZ2").Formula

eric

1