VBA - Problème avec formule matricielle

Résolu
cavalo -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai un problème avec une formule matricielle, et je ne trouve pas de réponse sur internet malgrès mes recherches :(

Contexte : Je cherche à trouver les termes d'un polynome d'une courbe de tendance, et mettre chacun des termes dans la cellule (excel 2003)

Lorsque je rentre la formule matricielle suivante dans excel en selectionnant une plage de 3 cellules et en validant par ctrl + maj + enter, ça marche :
=INDEX(DROITEREG($D$2:$D$5;$C$2:$C$5^{1.2.3}); 1; {1.2.3})

J'essaie maintenant de rentrer cette formule avec VBA avec des plage de valeurs variable et là problème :
- soit je rentre
poscoeff.FormulaArray = "=INDEX(DROITEREG(xrange,yrange^{1,2,3}), 1, {1,2,3})"
(avec poscoeff, xrange et yrange définis comme des plages de cellules)
et j'obtient la formule écrite dans les cellules, mais sans interpretation des variables xrange et yrange donc le calcul ne marche pas

- soit je rentre
poscoeff.FormulaArray = INDEX(DROITEREG(xrange,yrange^{1,2,3}), 1, {1,2,3})
et j'obtiens l'erreur "caractère incorrect" qui pointe sur le premier "{" de la formule. Impossible de le remplacer, sinon la formule n'est plus une formule matricielle!?

Merci d'avance pour vos réponse, j'ai passé presque toute la journée d'hier sur ce problème, et là j'avoue que je sèche...
Configuration: Windows XP Internet Explorer 6.0

12 réponses

  1. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    Re,
    essaie comme ça, ça fonctionne chez moi...
    .FormulaArray = "=INDEX(LINEST(" & xrange.Address & "," & yrange.Address & "^{1;2;3}),1,{1;2;3})"

    L'astuce ds un cas comme ça, c'est par exemple de taper la formule en A1 avec des plages fixes, fixer les memes plages dans le code et simplement comparer :
    MsgBox "=INDEX(LINEST(" & xrange.Address & "," & yrange.Address & "^{1;2;3}),1,{1;2;3})" & vbCrLf & Range("A1").FormulaArray

    :)
    1
  2. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    essaye formulalocal a la place de formulaarray
    c'est pour utiliser les formules de la feuille de calcul dans du vba
    0
  3. cavalo
     
    J'ai toujours la même erreur : "caractère incorrect"...
    0
  4. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    Bonjour,
    poscoeff.FormulaArray = "=INDEX(DROITEREG( "& xrange & ";" & yrange & "^{1,2,3}); 1; {1,2,3})" 
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cavalo
     
    Ca ne marche toujours pas, j'ai une erreur "incompatibilité de type"...
    0
  7. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    Bonjour,
    Ok, si xrange et yrange sont des objets range alors:
    poscoeff.FormulaArray = "=INDEX(DROITEREG( "& xrange.address & ";" & yrange.address & "^{1,2,3}); 1; {1,2,3})"
    0
  8. cavalo
     
    J'ai une erreur d'execution 424 : objet requis.
    Pour info mes variables sont définies comme suit :
    xrange = Sheets("Traitement des données").Range(Cells((cl - counter - 1), 3), Cells((cl - 1), 3))
    yrange = Sheets("Traitement des données").Range(Cells((cl - counter - 1), 4), Cells((cl - 1), 4))

    J'ai essayé de déclarer mes variables xrange et yrange pour voir si ça venait de là:
    Dim xrange as range
    Dim yrange as range
    Set xrange = Sheets("Traitement des données").Range(Cells((cl - counter - 1), 3), Cells((cl - 1), 3))
    Set yrange = Sheets("Traitement des données").Range(Cells((cl - counter - 1), 4), Cells((cl - 1), 4))
    Mais dans ce cas j'ai une erreur d'execution 1004 : impossible de définir la propriété FormulaArray de la classe Range...
    0
  9. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    j'ai l'impression que ta syntaxe est mauvaise pour Sheets("Traitement des données").Range(Cells((cl - counter - 1), 3), Cells((cl - 1), 3))
    , as tu essayé de voir si ca renvoyai bien la valeur souhaité ?
    0
  10. cavalo
     
    Oui, une vérification avec xrange.Select renvoie bien la bonne plage de valeurs.
    0
  11. cavalo
     
    Merci beaucoup tompols!!

    Ta formule ne marchait pas au début, il faut remplacer {1;2;3} par {1,2,3}, ce que j'ai pu voir grace à ta petite astuce!

    La syntaxe exacte est donc :
    poscoeff.FormulaArray = "=INDEX(LINEST(" & yrange.Address & "," & xrange.Address & "^{1,2,3}),1,{1,2,3})"

    Merci encore
    :)
    0
  12. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    Oki, chez moi ct bien {1;2;3}, surement une histoire de séparateurs, d'où l'utilité de la ptite astuce ;)
    0
  13. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,
    Le pb peut se résoudre par la fonction evaluate mais le calcul se fait sans inscrire la formule dans la cellule

    Par exemple je calcule ci dessous la somme des 3 plus grande valeurs de la plage A1:A36
      xrange = Range("A1:A36").Address
    Range("E2") = Evaluate("SUM(large(" & xrange & ",{1,2,3}))")
    

    si la plage de cellule n'est pas variable on peut écrire (dans mon exemple)
    Range("E3") = [SUM(large(A1:A36,{1,2,3}))]

    --------

    pour droitereg= linest en anglais
    La formule de Tompols pourrait apparemment convenir en remplacant les points-virgules par des virgules ( patois VBA anglais) et en mettant un espace dans le premier "& (---> " espace & )

    Nota: il est rare qu'on y arrive du premier coup (erreur 2015): restez zen et polis... bref! pas comme moi ;-)

    EDIT 15h06: Excusez moi je n'avais pas rafraichi !!!
    0