Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Une fonction en VBA peut elle renvoyer le résultat de plusieurs calculs?

  • Initiateur de la discussion Initiateur de la discussion nico
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

N

nico

Guest
Bonjour à tous

Je me demandais si on pouvait utiliser une fonction pour effectuer plusieurs calculs différents et ensuite accéder à chacune de ses valeurs séparément. La fonction utilise bien sur les memes parazmètres d'entrée pour tous les calculs.

Ca serait bien pratique pour diminuer la taille de mon code.

Merci d'avance pour l'aide que vous m'apporterez

Nico
 
Bonjour Nico,

La réponse à ta question est certainement "Oui", mais il faudrait un exemple (Xls Pièce jointe avec explications) pour voir plus précisemment ce que tu souhaites faire.

Donc, à bientôt peut-être ...

Omicron.
 
Salut Nico et Omicron,

Quant à moi, je serais tenté de répondre non pour une utilisation habituelle de la fonction car elle ne retourne qu'une seule valeur.
C'est le cas, notamment, des fonctions VBA intégrées dans les formules de calcul d'Excel.

Néanmoins, on peut prévoir dans un programme de doter la fonction de plusieurs variables de sorties ou bien de la faire travailler sur des variables déclarées "Public". Techniquement, cela fonctionne mais ce n'est pas considéré comme une programmation bien propre...

Comme Omicron, j'attends de voir un exemple précis de ce que tu envisages de faire.

A+
Horatio
 
Salut tt le monde

j'ai fait une macro qui calcule les coordonnées d'un point dans un autre repère que celui dans lequel on les connait. J'ai pas eu de problème pour le changement de repère mais ce que j'aimerais c'est pouvoir faire une unique fonction qui calculerait les 3 nouvelles coordonnées X,Y et Z et que suivant la case ou j'implante la fonction celle ci me retourne la valeur correspondante. X pour la case X, Y pour la case Y, etc...

Pour l'instant j'ai donc fait 3 fonctions pour calculer chacune des 3 coordonnées.

Vous pensez qu'il y a une solution?

Merci
 

Pièces jointes

Voilà le code que j'ai écris, c assez long et si je pouvais tout regrouper en une seule fonction ca serait cool


Option Explicit

Function chgt_repere_X(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal PosX As Double, ByVal PosY As Double, ByVal PosZ As Double, ByVal RotX As Double, ByVal RotY As Double, ByVal RotZ As Double) As Variant

Dim mat_pass(3, 3), vect(3) As Double
Dim A As Double
Dim j As Double

A = 0

mat_pass(0, 0) = Cos(RotZ) * Cos(RotY)
mat_pass(0, 1) = Cos(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Sin(RotZ)
mat_pass(0, 2) = -Cos(RotZ) * Sin(RotY) * Cos(RotX) + Sin(RotX) * Sin(RotZ)
mat_pass(0, 3) = PosX
mat_pass(1, 0) = -Cos(RotY) * Sin(RotZ)
mat_pass(1, 1) = -Sin(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Cos(RotZ)
mat_pass(1, 2) = Sin(RotZ) * Sin(RotY) * Cos(RotX) + Cos(RotZ) * Sin(RotX)
mat_pass(1, 3) = PosY
mat_pass(2, 0) = Sin(RotY)
mat_pass(2, 1) = Cos(RotY) * Sin(RotX)
mat_pass(2, 2) = Cos(RotY) * Cos(RotX)
mat_pass(2, 3) = PosZ
mat_pass(3, 0) = 0
mat_pass(3, 1) = 0
mat_pass(3, 2) = 0
mat_pass(3, 3) = 1

vect(0) = x
vect(1) = y
vect(2) = z
vect(3) = 1

For j = 0 To 3
A = A + mat_pass(0, j) * vect(j)
Next j

chgt_repere_X = A

End Function

Function chgt_repere_Y(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal PosX As Double, ByVal PosY As Double, ByVal PosZ As Double, ByVal RotX As Double, ByVal RotY As Double, ByVal RotZ As Double) As Variant

Dim mat_pass(3, 3), vect(3) As Double
Dim B As Double
Dim j As Double

B = 0

mat_pass(0, 0) = Cos(RotZ) * Cos(RotY)
mat_pass(0, 1) = Cos(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Sin(RotZ)
mat_pass(0, 2) = -Cos(RotZ) * Sin(RotY) * Cos(RotX) + Sin(RotX) * Sin(RotZ)
mat_pass(0, 3) = PosX
mat_pass(1, 0) = -Cos(RotY) * Sin(RotZ)
mat_pass(1, 1) = -Sin(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Cos(RotZ)
mat_pass(1, 2) = Sin(RotZ) * Sin(RotY) * Cos(RotX) + Cos(RotZ) * Sin(RotX)
mat_pass(1, 3) = PosY
mat_pass(2, 0) = Sin(RotY)
mat_pass(2, 1) = Cos(RotY) * Sin(RotX)
mat_pass(2, 2) = Cos(RotY) * Cos(RotX)
mat_pass(2, 3) = PosZ
mat_pass(3, 0) = 0
mat_pass(3, 1) = 0
mat_pass(3, 2) = 0
mat_pass(3, 3) = 1

vect(0) = x
vect(1) = y
vect(2) = z
vect(3) = 1

For j = 0 To 3
B = B + mat_pass(1, j) * vect(j)
Next j

chgt_repere_Y = B

End Function

Function chgt_repere_Z(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal PosX As Double, ByVal PosY As Double, ByVal PosZ As Double, ByVal RotX As Double, ByVal RotY As Double, ByVal RotZ As Double) As Variant

Dim mat_pass(3, 3), vect(3) As Double
Dim C As Double
Dim j As Double

C = 0

mat_pass(0, 0) = Cos(RotZ) * Cos(RotY)
mat_pass(0, 1) = Cos(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Sin(RotZ)
mat_pass(0, 2) = -Cos(RotZ) * Sin(RotY) * Cos(RotX) + Sin(RotX) * Sin(RotZ)
mat_pass(0, 3) = PosX
mat_pass(1, 0) = -Cos(RotY) * Sin(RotZ)
mat_pass(1, 1) = -Sin(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Cos(RotZ)
mat_pass(1, 2) = Sin(RotZ) * Sin(RotY) * Cos(RotX) + Cos(RotZ) * Sin(RotX)
mat_pass(1, 3) = PosY
mat_pass(2, 0) = Sin(RotY)
mat_pass(2, 1) = Cos(RotY) * Sin(RotX)
mat_pass(2, 2) = Cos(RotY) * Cos(RotX)
mat_pass(2, 3) = PosZ
mat_pass(3, 0) = 0
mat_pass(3, 1) = 0
mat_pass(3, 2) = 0
mat_pass(3, 3) = 1

vect(0) = x
vect(1) = y
vect(2) = z
vect(3) = 1

For j = 0 To 3
C = C + mat_pass(2, j) * vect(j)
Next j

chgt_repere_Z = C

End Function
 
nico, tous,

Ah, ça calme là, hein ! (lol)

Si RotX, RotY et RotZ représentent toujours la même chose :

.....

For j = 0 To 3
A = A + mat_pass(0, j) * vect(j)
B = B + mat_pass(1, j) * vect(j)
C = C + mat_pass(2, j) * vect(j)
Next j

chgt_repere_X = A
chgt_repere_Y = B
chgt_repere_Z = C
...

Le tout dans la première fonction par exemple.

Ne résoudrait-il pas ton problème ?
Je n'ai pas testé.


Abel
 
Le problème est de savoir quelle valeur me retournera ma fonction globale chgt_repere : chgt_repere_X, chgt_repere_Y ou chgt_repere_Z ?

Ce que j'aimerais c'est que cette fonction globale me retourne l'une des 3 valeurs suivant la cellule où je l'implante.

J'espère que vous voyez ce que je veux dire. Mais sinon c pas grave, je m'en sortirai avec les 3 fonctions.

Merci à tous

PS: toutefois si vous trouvez une solution miracle, je suis preneur

Nico
 
voilà comment tu peux modifier ta fonction. Tu remarqueras que j'ai créé un type Enum qui permet de déterminer quelle valeur X, Y, ou Z prendre en compte. Si tu l'appelles dans une cellule Excel, tu tapes simplement 0,1 ou 2 pour ce dernier paramètre


Enum eRepere
x = 0
y = 1
z = 2
End Enum

Function Chgt_Repere#(ByVal x#, ByVal y#, ByVal z#, _
ByVal PosX#, ByVal PosY#, ByVal PosZ#, _
ByVal RotX#, ByVal RotY#, ByVal RotZ#, _
Repere As eRepere)
Dim Mat_Pass(3, 3) As Double, Vect(3) As Double
Dim A#, j#

A = 0

Mat_Pass(0, 0) = Cos(RotZ) * Cos(RotY)
Mat_Pass(0, 1) = Cos(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Sin(RotZ)
Mat_Pass(0, 2) = -Cos(RotZ) * Sin(RotY) * Cos(RotX) + Sin(RotX) * Sin(RotZ)
Mat_Pass(0, 3) = PosX
Mat_Pass(1, 0) = -Cos(RotY) * Sin(RotZ)
Mat_Pass(1, 1) = -Sin(RotZ) * Sin(RotY) * Sin(RotX) + Cos(RotX) * Cos(RotZ)
Mat_Pass(1, 2) = Sin(RotZ) * Sin(RotY) * Cos(RotX) + Cos(RotZ) * Sin(RotX)
Mat_Pass(1, 3) = PosY
Mat_Pass(2, 0) = Sin(RotY)
Mat_Pass(2, 1) = Cos(RotY) * Sin(RotX)
Mat_Pass(2, 2) = Cos(RotY) * Cos(RotX)
Mat_Pass(2, 3) = PosZ
Mat_Pass(3, 0) = 0
Mat_Pass(3, 1) = 0
Mat_Pass(3, 2) = 0
Mat_Pass(3, 3) = 1

Vect(0) = x
Vect(1) = y
Vect(2) = z
Vect(3) = 1

For j = 0 To 3
A = A + Mat_Pass(Repere, j) * Vect(j)
Next j

Chgt_Repere = A
End Function
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…