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

Résolu
-  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Membre Dernière intervention   526
 
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
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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