FormulaArray dans VBA Excel

  • Auteur de la discussion bodherek
  • Date de début

bodherek

Nouveau membre
Je cherche une réponse à un problème Excel 2003

Si j'entre la formule suivante dans une cellule directement dans Excel en mode Array (ctrl+shift+enter), j'aurai le bon résultat.
=SOMME(SI([semaine1.xls]feuilsem!$C$3:$C$9>2;[semaine1.xls]feuilsem!$D$3:$E$9))
=> affichage dans la barre des formules: {=SOMME(SI([semaine1.xls]feuilsem!$C$3:$C$9>2;[semaine1.xls]feuilsem!$D$3:$E$9))}

Parcontre, si je fait mettre la formule suivante dans du code VBA dans une feuille Excel 2003:
Range("K24").FormulaArray = "=SUM(IF([semaine1.xls]feuilsem!$C$3:$C$9>2;[semaine1.xls]feuilsem!$D$3:$E$9))"

J'obtient toujours une erreur 1004: impossible de définir la propriété FormulaArray de la classe Range:

Pourtant, si je l'affecte au paramètre .Value et que j'ajoute un apostrophe (') à la chaine traduite en français (Ajouter comme du texte plutot que comme une ArrayFormula). Je vais ensuite dans la feuille Excel et j'édite la cellule K24, je retire l'apostrophe (') et je fait CTRL+SHIFT+ENTER et la formule fonctionne.

Quelqu'un à une idée pour introduire un SUM(IF( dans du code VBA d'excel 2003?

 

zeb

Modérateur
Tu as lu l'aide de FormulaArray fournie avec Excel ?

FormulaArray, propriété

Cette propriété renvoie ou définit la formule d'une plage, sous forme matricielle. Cette propriété renvoie (ou peut se voir affecter) une seule formule ou un tableau Visual Basic. Si la plage spécifiée ne contient aucune formule sous forme matricielle, cette propriété renvoie la valeur Null. Type de données Variant en lecture-écriture.

Note
Si vous utilisez cette propriété pour entrer une formule sous forme matricielle, vous devez utiliser le style de référence L1C1, et non le style de référence A1 (consultez le second exemple).

Exemples
Cet exemple montre comment saisir le chiffre 3 sous la forme d'une constante matricielle dans les cellules A1 à C5 de la feuille Sheet1.
[fixed]Worksheets("Sheet1").Range("A1:C5").FormulaArray = "=3"[/fixed]
Cet exemple montre comment saisir la formule matricielle =Sum(R1C1:R3C3) (=SOMME(R1C1:R3C3)) dans les cellules E1 à E3 de la feuille Sheet1.
[fixed]Worksheets("Sheet1").Range("E1:E3").FormulaArray = _
"=Sum(R1C1:R3C3)"[/fixed]

J'y vois une note tout à fait intéressante...

Pourquoi utilises-tu FormulaArray ? Formula peut convenr dans ton exemple.
 

bodherek

Nouveau membre
Merci pour l'aide Zeb, mais Oui, j'avais déjà lu l'aide! et non, je ne peux pas utiliser l'argument "Formula" puisque le retour doit être une matrice virtuelle sur le "SI". L'exemple que j'ai mis est un exemple très simplifié comparativement à ce sur quoi je travaille. La question, pour la préciser, est l'intégration du "SI" dans un FormulaArray via VBA. Il semble qu'une erreur survienne. Peut-être est-ce une erreur similaire à celle qui limite à 256 caractères la longueur de la chaine transmise à l'argument "FormulaArray". Cette limitation n'est pas présente dans l'interface Excel (sheet) qui permet 1024 caractères, mais est présente lors de l'utilisation du code VBA pour affecter une valeur à l'argument. Cette limitation est également présente pour l'argument "Formula"!

La logique du "Somme.si" lorsqu'il y a plusieurs critères (ou "somme.si" imbriqué) est d'utiliser la "Somme "sur la multiplication de vecteurs de condition "Si". Exemple, tu compares 3 éléments d'un vecteur à la condition1 et tu crée un vecteur virtuel rempli de 1 ou 0 (vrai/faux). Ce vecteur virtuel est multiplier à un autre vecteur virtuel pour la condition2, multiplier à un autre vecteur virtuel pour la condition3, multiplier à un autre vecteur virtuel pour la condition4. Cette multiplication construit un vecteur virtuel de 1 et 0 (vrai/faux) pour chacune des lignes remplissant les conditions 1, 2, 3 et 4. Ce vecteur virtuel sera alors indicateur des lignes de la matrice sur laquelle il faut faire une somme. Pour simplifier, disons simplement que c'est un calcul de vecteur et matrice selon les principes mathématiques s'appliquant aux vecteurs et matrices.

Quelqu'un à une autre idée?
 

Lithium'

Nouveau membre
Bonjour,

Tu avais déjà trouvé 99% de la réponse ! Il faut simplement utiliser FormulaArray avec les fonctions intégralement libellées en anglais... soit avec une virgule à la place du point-virgule !

:)

Ca donne (pour la clarté, sans la référence au classeur et à la feuille) : Range("K24" ).FormulaArray = "=SUM(IF($C$3:$C$9>2,$D$3:$E$9))" et normalement ça marche...
 
G

Guest

Invité
Oh merci pour cette réponse !!! J'avais exactement le même problème (un ; au lieu d'une ,)... Quel gain de temps ! Encore merci !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 131
Messages
6 717 939
Membres
1 586 382
Dernier membre
alejandrooo
Partager cette page
Haut