[Q] [VBA] Formule VBA et ParamArray => comment sélectionner une zone?

Le
JCF
Bonjour à tous
j'utilise VBA pour me créer une formule (que j'utilise dans des feuilles de calcul) nécessitant jusqu'à 17 variables, mais dont beaucoup sont facultatives..
Jusqu'à présent, j'avais défini ma fonction de la façon suivante

Function IFA(XL0, XL1, XU1, XU0, XP, SWX, YL0, YL1, YU1, YU0, YP, SWY, TypeF, Relation, NivRelation, SWC, CoordSortie

Cette fonction nécessitait donc de saisir 17 entrées, même si plusieurs variables étaient inutilisées. Si les 17 variables se trouvent à la queue-leu-leu, il serait plus facile de pouvoir sélectionner directement une plage de cellules. Idem si il y a moins de 17 variables, ou en deux trois plages de cellules successives. La solution que j'ai trouvé pour faire cela est de déclarer ma fonction de la façon suivante

Function IFA(ParamArray VARS()

TT = UBound(VARS) 'Pour voir combien de variables ont été entrée

Ensuite j'appelle les différentes variables en utilisant "VARS(i)" i étant une valeur de 0 à TT

Et bien ça ne marche que si lors de l'entrée des variables dans la formule, je sélectionne les cellules de la feuille une à une. La selection de plages de cellules ne fonctionne pas. A quoi cela est-il dû? Où me plante-je sachant que j'aimerai bien que l'on puisse indiféremment entrer les variables soit par
-une plage de cellules,
-plusieurs plages de cellules
-cellule par cellule

Merci par avance pour vos remarques et suggestions
JC
Vos réponses
Trier par : date / pertinence
Daniel.M
Le #1502726
Bonjour JC,

La sélection de plages te retournera un Variant qui sera un tableau à 2
dimensions.

'Exemple:
Function IFA(ParamArray VARS())
Dim i As Integer, j As Integer, n As Integer, V As Variant
n = UBound(VARS)
j = LBound(VARS)
For i = j To n
V = VARS(i)
Next i
IFA = 1 + n - j
End Function


Si tu saisis sur la feuille:

=ifa(A1;B1:B5;C1)

À ta 2e itération dans la boucle, V sera un tableau à 2 dimensions.

Salutations,

Daniel M.

"JCF" news:
Bonjour à tous,
j'utilise VBA pour me créer une formule (que j'utilise dans des feuilles de
calcul) nécessitant jusqu'à 17 variables, mais dont beaucoup sont

facultatives...
Jusqu'à présent, j'avais défini ma fonction de la façon suivante:

Function IFA(XL0, XL1, XU1, XU0, XP, SWX, YL0, YL1, YU1, YU0, YP, SWY, TypeF,
Relation, NivRelation, SWC, CoordSortie)


Cette fonction nécessitait donc de saisir 17 entrées, même si plusieurs
variables étaient inutilisées. Si les 17 variables se trouvent à la

queue-leu-leu, il serait plus facile de pouvoir sélectionner directement une
plage de cellules. Idem si il y a moins de 17 variables, ou en deux trois plages
de cellules successives. La solution que j'ai trouvé pour faire cela est de
déclarer ma fonction de la façon suivante:

Function IFA(ParamArray VARS())

TT = UBound(VARS) 'Pour voir combien de variables ont été entrées

Ensuite j'appelle les différentes variables en utilisant "VARS(i)" i étant une
valeur de 0 à TT.


Et bien ça ne marche que si lors de l'entrée des variables dans la formule, je
sélectionne les cellules de la feuille une à une. La selection de plages de

cellules ne fonctionne pas. A quoi cela est-il dû? Où me plante-je sachant que
j'aimerai bien que l'on puisse indiféremment entrer les variables soit par:
-une plage de cellules,
-plusieurs plages de cellules,
-cellule par cellule?

Merci par avance pour vos remarques et suggestions,
JC


isabelle
Le #1502724
bonjour JCF,

je crois bien que c'est impossible, les arguments d'une fonction ne
peuvent être qu'une constante, une variable ou une expression transmise
à une procédure et non un tableau.

isabelle


Bonjour à tous,
j'utilise VBA pour me créer une formule (que j'utilise dans des feuilles de calcul) nécessitant jusqu'à 17 variables, mais dont beaucoup sont facultatives...
Jusqu'à présent, j'avais défini ma fonction de la façon suivante:

Function IFA(XL0, XL1, XU1, XU0, XP, SWX, YL0, YL1, YU1, YU0, YP, SWY, TypeF, Relation, NivRelation, SWC, CoordSortie)

Cette fonction nécessitait donc de saisir 17 entrées, même si plusieurs variables étaient inutilisées. Si les 17 variables se trouvent à la queue-leu-leu, il serait plus facile de pouvoir sélectionner directement une plage de cellules. Idem si il y a moins de 17 variables, ou en deux trois plages de cellules successives. La solution que j'ai trouvé pour faire cela est de déclarer ma fonction de la façon suivante:

Function IFA(ParamArray VARS())

TT = UBound(VARS) 'Pour voir combien de variables ont été entrées

Ensuite j'appelle les différentes variables en utilisant "VARS(i)" i étant une valeur de 0 à TT.

Et bien ça ne marche que si lors de l'entrée des variables dans la formule, je sélectionne les cellules de la feuille une à une. La selection de plages de cellules ne fonctionne pas. A quoi cela est-il dû? Où me plante-je sachant que j'aimerai bien que l'on puisse indiféremment entrer les variables soit par:
-une plage de cellules,
-plusieurs plages de cellules,
-cellule par cellule?

Merci par avance pour vos remarques et suggestions,
JC


isabelle
Le #1502723
... dans le sens de sélection de plage à l'aide de la souris ( puisqu'à
ce moment on est en mode édition)

isabelle


bonjour JCF,

je crois bien que c'est impossible, les arguments d'une fonction ne
peuvent être qu'une constante, une variable ou une expression transmise
à une procédure et non un tableau.

isabelle


Bonjour à tous,
j'utilise VBA pour me créer une formule (que j'utilise dans des feuilles de calcul) nécessitant jusqu'à 17 variables, mais dont beaucoup sont facultatives...
Jusqu'à présent, j'avais défini ma fonction de la façon suivante:

Function IFA(XL0, XL1, XU1, XU0, XP, SWX, YL0, YL1, YU1, YU0, YP, SWY, TypeF, Relation, NivRelation, SWC, CoordSortie)

Cette fonction nécessitait donc de saisir 17 entrées, même si plusieurs variables étaient inutilisées. Si les 17 variables se trouvent à la queue-leu-leu, il serait plus facile de pouvoir sélectionner directement une plage de cellules. Idem si il y a moins de 17 variables, ou en deux trois plages de cellules successives. La solution que j'ai trouvé pour faire cela est de déclarer ma fonction de la façon suivante:

Function IFA(ParamArray VARS())

TT = UBound(VARS) 'Pour voir combien de variables ont été entrées

Ensuite j'appelle les différentes variables en utilisant "VARS(i)" i étant une valeur de 0 à TT.

Et bien ça ne marche que si lors de l'entrée des variables dans la formule, je sélectionne les cellules de la feuille une à une. La selection de plages de cellules ne fonctionne pas. A quoi cela est-il dû? Où me plante-je sachant que j'aimerai bien que l'on puisse indiféremment entrer les variables soit par:
-une plage de cellules,
-plusieurs plages de cellules,
-cellule par cellule?

Merci par avance pour vos remarques et suggestions,
JC




JCF
Le #1502671
----- isabelle a écrit : ----

isabelle a écrit
je crois bien que c'est impossible, les arguments d'une fonction n
peuvent être qu'une constante, une variable ou une expression transmis
à une procédure et non un tableau
Ca m'étonne ce que tu me dis là car en déclarant ma Fonction de la seconde façon (Function IFA(ParamArray VARS())), elle fonctionne, mais seulement si je sélectionne les variables cellule par cellule. Or c'est déjà bien un tableau qui est là fourni à la fonction en argument

En fait mon problème, c'est d'arriver à faire interpréter à la fonction, lorsque c'est une plage de cellules qui est sélectionnée, que chaque cellule correspond à une variable, car pour l'instant elle n'a pas l'air de comprendre cette utilisation là et renvoie l'erreur #value
A
Jean-Christophe

JCF
Le #1500653
----- Daniel.M a écrit : ----

La sélection de plages te retournera un Variant qui sera un tableau à
dimensions

Si tu saisis sur la feuille

=ifa(A1;B1:B5;C1

Tu veux dire qu'en fait le tableau VARS ressemblerait à ça?
A1 B1 C
B
B
B
B5 ?

J'ai beaucoup de mal à comprendre comment il stocke tout ça! En fait, je veux ni plus ni moins arriver à faire la même chose que la fonction intégrée SUM, à laquelle les arguments que l'on passe peuvent être des cellules ou des plages de cellules
Comment dois-je faire pour récupérer les valeurs
Une boucle du même genre que celle que tu as montrée
Merci et à
JC
Publicité
Poster une réponse
Anonyme