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

  • Initiateur de la discussion nico
  • Date de début
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
 
O

omicron

Guest
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.
 
L

Lord Nelson

Guest
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
 
N

nico

Guest
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

  • Chgt_repere.zip
    0 bytes · Affichages: 57
N

nico

Guest
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
 
A

Abel

Guest
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
 
N

nico

Guest
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
 
T

Ti

Guest
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
 

Discussions similaires

Statistiques des forums

Discussions
312 315
Messages
2 087 168
Membres
103 489
dernier inscrit
CACCA