OVH Cloud OVH Cloud

boucles sur matrice

2 réponses
Avatar
Jiéme
bonjour a tous,

je dois faire une grosse erreur mais je ne la vois pas...
coeff est une matrice et je voudrais recuperer sa dimension max
pour la mettre en limite sup dans l'incrementation d'une boucle mais ubound
renvoie le message "#valeur!"... pourquoi?

Function limite(coeff)
limite = UBound(coeff)
End Function

une autre petite question..
(dans une function) la boucle "for next" fonctionne bien

...
For n = 1 To 18
If (coeff(n, 1) = co1 And coeff(n, 2) = co2 And coeff(n, 3) = co3 And
coeff(n, 4) = co4) Then
coeffn = coeff(n, 5).Value
coeffk = coeff(n, 6).Value
Else
End If
Next n
...

.....mais la boucle "for each next" ne marche pas (dans une function)

...
For each n in coeff
If (coeff(n, 1) = co1 And coeff(n, 2) = co2 And coeff(n, 3) = co3 And
coeff(n, 4) = co4) Then
coeffn = coeff(n, 5).Value
coeffk = coeff(n, 6).Value
Else
End If
Next
...

coeff est toujours une matrice (est-ce que for each ne marche que pour les
collections?)

Merci d'avance et bonnes fetes

2 réponses

Avatar
denis P
Tableaux et fonctions matricielles

Si une fonction doit recevoir un tableau de valeur, l'argument doit
être déclarer de type Variant (ou, ce qui revient au même, sans indication
de type).

- Utilisation d'une matrice de constantes : =MAFONC({1.2.3;4.5.6})

Par exemple, une fonction pourrait accepter indifféremment une plage de
cellules ouun tableau comme argument : =MAFONC(A1:A5) ou
=MAFONC({1;3;2;5;9}).Comme il s'agit de deux types de données différents, la
fonction devra tester si l'argument transmis est une
référence ou un tableau, et adapter son traitement en fonction du résultat
de ce test. Ce point sera traitdans le paragraphe suivant.

L'intérêt principal des tableaux dans les fonctions VBA de feuille de calcul
réside dans la possibilité de
créer des fonctions matricielles, telles que les fonction intégrées
TRANSPOSE ou INVERSEMAT.

Pour construire une fonction matricielle VBA, il suffit d'affecter un
tableau la valeur de retour. La fonction suivante construit par
exemple un tableau contenant les sommes cumul es de la plage donnée
enargument : cellule1, cellule1 + cellule2, ..., somme(cellule1 celluleN) :

Function SOMME_CUMUL(Plage As Range)

Dim Tableau
Dim Cumul As Double
Dim I As Integer, J As Integer

Tableau = Plage

For I = 1 To UBound(Tableau, 1)
For J = 1 To UBound(Tableau, 2)
Cumul = Cumul + Tableau(I, J)
Tableau(I, J) = Cumul
Next J
Next I

SOMME_CUMUL = Tableau

End Function

Si la plage A1:A10 contient les entiers de 10 à 19,
{=SOMME_CUMUL(A1:A10)} saisi sous forme matricielle dans une plage verticale
de 10 cellules renvoie
{10;21;33;46;60;75;91;108;126;145}.

Comme la fonction retourne un tableau de valeurs, celui-ci peut être
transmis à d'autres fonctions nécessitant ce type d'argument,sans saisie
matricielle.Par exemple, =EQUIV(100;SOMME_CUMUL(A1:A50)) renvoie la position
dans la plage A1:A50 du premier élément à partir duquel la somme cumulée est
supérieure ou égale à 100. Il est possible d'affecter à la valeur de retour
d'une fonction VBA matricielle touttype de tableau, qu'il s'agisse comme ici
de tableaux contenus dans des variants,de tableaux de taille fixe, ou de
tableaux dynamiques ajustés par des instructions ReDim.
denis p. (inspirer de LL)"Jiéme" a écrit dans le
message de news:41c91a23$0$26522$
bonjour a tous,

je dois faire une grosse erreur mais je ne la vois pas...
coeff est une matrice et je voudrais recuperer sa dimension max
pour la mettre en limite sup dans l'incrementation d'une boucle mais
ubound

renvoie le message "#valeur!"... pourquoi?

Function limite(coeff)
limite = UBound(coeff)
End Function

une autre petite question..
(dans une function) la boucle "for next" fonctionne bien

...
For n = 1 To 18
If (coeff(n, 1) = co1 And coeff(n, 2) = co2 And coeff(n, 3) = co3 And
coeff(n, 4) = co4) Then
coeffn = coeff(n, 5).Value
coeffk = coeff(n, 6).Value
Else
End If
Next n
...

.....mais la boucle "for each next" ne marche pas (dans une function)

...
For each n in coeff
If (coeff(n, 1) = co1 And coeff(n, 2) = co2 And coeff(n, 3) = co3 And
coeff(n, 4) = co4) Then
coeffn = coeff(n, 5).Value
coeffk = coeff(n, 6).Value
Else
End If
Next
...

coeff est toujours une matrice (est-ce que for each ne marche que pour les
collections?)

Merci d'avance et bonnes fetes





Avatar
Daniel.M
Salut Jième,

Pour ta 2e question, si Coeff correspond à une plage, alors:

For Each n In coeff.Rows
If n.Cells(1, 1) = co1 And n.Cells(1,2) = co2 ... Then

Else

End If
Next n

Salutations,

Daniel M.


"Jiéme" wrote in message
news:41c91a23$0$26522$
bonjour a tous,

je dois faire une grosse erreur mais je ne la vois pas...
coeff est une matrice et je voudrais recuperer sa dimension max
pour la mettre en limite sup dans l'incrementation d'une boucle mais ubound
renvoie le message "#valeur!"... pourquoi?

Function limite(coeff)
limite = UBound(coeff)
End Function

une autre petite question..
(dans une function) la boucle "for next" fonctionne bien

...
For n = 1 To 18
If (coeff(n, 1) = co1 And coeff(n, 2) = co2 And coeff(n, 3) = co3 And
coeff(n, 4) = co4) Then
coeffn = coeff(n, 5).Value
coeffk = coeff(n, 6).Value
Else
End If
Next n
...

.....mais la boucle "for each next" ne marche pas (dans une function)

...
For each n in coeff
If (coeff(n, 1) = co1 And coeff(n, 2) = co2 And coeff(n, 3) = co3 And
coeff(n, 4) = co4) Then
coeffn = coeff(n, 5).Value
coeffk = coeff(n, 6).Value
Else
End If
Next
...

coeff est toujours une matrice (est-ce que for each ne marche que pour les
collections?)

Merci d'avance et bonnes fetes