Coder une fonction matricielle

Bonjour,

J'ai écrit une fonction que je souhaite utiliser dans plusieurs fichiers xls mais elle ne fonctionne pas. Je l'ai simplifiée pour la présenter ici car le problème ne vient pas du calcul mais certainement de la syntaxe:

Function Rstat(x As Variant) As Variant

Rstat = (x - WorksheetFunction.Average(x)) ^ 2 / WorksheetFunction.DevSq(x)

End Function

où x est un tableau d'1 colonne. J'ai aussi essayé en remplissant la matrice mais ça ne marche pas:

Function Rstat(x As Variant) As Variant

NbPt = WorksheetFunction.Count(x)

For i = 1 To NbPt

Rstat(i) = (x(i) - WorksheetFunction.Average(x)) ^ 2 / WorksheetFunction.DevSq(x)

Next

End Function

Quelqu'un aurait une idée?

Merci pour votre aide.

Bonjour,

x - WorksheetFunction.Average(x) ne peut pas passer, x est un Range, WorksheetFunction.Average(x) est un Double

Que cherches tu as calculer mathématiquement ?

eric

Par exemple, soit x le range (A1:A8). Je veux en chaque ligne k du range (C1:C8) les solutions de Rk= (xk-X)^2/(∑(xi-X)^2 )

où X est la moyenne des valeurs du range x.

Je ne sais pas si c'est clair...

Merci.

Pas bien compris ta formule.

C'est quoi X ?

Pas grave, je te fais une fonction bidon, tu auras le principe, il faudra juste mettre les bons calculs.

Donc : =n/somme des carrés

On fait une 1ère boucle pour calculer la somme des carrés, suivie d'une autre pour calculer tous les éléments :

 Function Rstat(x As Variant) As Variant
    Dim datas, lig As Long, result
    Dim s As Double
    datas = x.Value
    ReDim result(1 To UBound(datas))
    'somme des carrés
    For lig = 1 To UBound(datas)
        s = s + datas(lig, 1) ^ 2
    Next lig
    'calcul des éléments de la matrice résultat
    For lig = 1 To UBound(datas)
        ' =n/somme des carrés
        result(lig) = datas(lig, 1) / s
    Next lig
    Rstat = Application.Transpose(result)
End Function

C'est une fonction matricielle un peu particulière.

Pour la saisir avec des données en A2:A6 sélectionner la plage de réponse, soit B2:B6, saisir la formule =Rstat($A$2:$A$6)

Puis valider en matriciel : shift+Ctrl+Entrée

eric

edit: je viens seulement de voir la définition de X. Mais je pense que tu as les éléments qui te manquaient.

8classeur2.zip (7.07 Ko)

Excellent !

Merci Eriiic. Ca me permet en plus de découvrir les fonction Lbound et Ubound.

Mais je ne comprends pas un truc: étant donné que x n'a qu'une dimension, que signifie le ",1" dans "datas(Lig, 1)?

Bonjour,

datas a été initialisé avec un range. Pour excel une cellule a obligatoirement une ligne et une colonne donc il prépare un tableau a 2 dimensions.

eric

OK, c'est clair.

Et encore une question s'il te plait: pourquoi datas et lig doivent être déclarés en Long? J'ai essayé de les passer respectivement en double et integer mais ça ne fonctionne plus.

Le fait de déclarer datas en Long alors que le contenu de x est constitué de décimaux ne va pas poser de problèmes?

Non, seul lig est long, datas et et result sont Variant car non typés.

En vba il faut typer chaque variable sur la ligne.

datas doit être variant, result pourrait être déclaré en tableau : result() As Double

Et j'ai laissé x as variant, il devrait être as range.

Autre chose.

J'ai fait la fonction ainsi car tu avais dit remplir C2:C8. Mais on peut l'écrire différemment de façon à pouvoir écrire la fonction dans une seule cellule et la tirer vers le bas.

Un poil plus lent mais peut être plus pratique :

Function Rstat2(x As Variant, n As Double) As Double
    Dim datas, lig As Long, result
    Dim s As Double
    datas = x.Value
    ReDim result(1 To UBound(datas))
    'somme des carrés
   For lig = 1 To UBound(datas)
        s = s + datas(lig, 1) ^ 2
    Next lig
    Rstat2 = n / s
End Function

Fonction non matricielle.

eric

Trop fort !

Merci encore Eric.

Rechercher des sujets similaires à "coder fonction matricielle"