VBA - Résultat d'une Fonction sous forme de tableau de variables [Résolu]

Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
- - Dernière réponse : Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
- 16 févr. 2007 à 14:38
Bonjour,

Petite question :
Je suis en train de me crée une fonction en VBA. Je n'ai aucun souci pour faire des fonctions de ce type :

Public Function Surface(Largeur as integer, Longueur as integer) as integer
   
         Surface = Largeur * Longueur

end Function

Ce que je voudrais pouvoir faire, c'est sortir de ma fonction un tableau de valeur.
Question : Est-ce que c'est possible ?

Exemple fictif :

Public Function Surface(Largeur as integer, Longueur as integer, Multiplicateur as integer)
   
         For x = 1 to Multiplicateur  
            Surface(x-1) = Largeur * Longueur * Multiplicateur
         next x

End Function
Si c'est possible, je n'arrive pas à trouver la bonne syntaxe.

Si c'est impossible ...
J'ai tenté de contourner mon problème en créant une variable tableau publique à l'intérieur de ma fonction, comme suit :

Public Function Surface(Largeur as integer, Longueur as integer, Multiplicateur as integer)
         
         Public TabSurface(Multiplicateur-1) as integer

         For x = 1 to Multiplicateur  
            TabSurface(x-1) = Largeur * Longueur * Multiplicateur
         next x

End Function
Problème : Impossible de déclarer une variable publique à l'intérieure d'une fonction publique si j'ai bien compris.
Réellement impossible ou je déclare mal quelque chose ?

Question subsidiaire : Si quelqu'un voit comment je peux résoudre mon problème, quelque soit la façon. merci d'avance

Molenn
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
45
3
Merci
Salut,

Une variable Public doit etre déclarer dans un module (comme une déclaration d'API) pas dans une Fonction

Si tu veuc contourne ce problème tu peux essayer de passer ton tableau en paramtre, vu que par défaut en VB6 (A) les parametre sont passer par référence, ton tableau sera modifier aussi à l'extérieur de ta fonction.

Exemple

'La procédure
Public Sub Surface(Largeur As Integer, Longueur As Integer, Multiplicateur As Integer, TabSurface() As Integer)
Dim x As Integer
   ReDim TabSurface(Multiplicateur - 1)
   For x = LBound(TabSurface) To UBound(TabSurface)
       TabSurface(x) = Largeur * Longueur * Multiplicateur
   Next x

End Sub
, ----
[code.aspx?ID=41455 By Renfield]

'L'appel
Dim MesResultat() As Integer
Dim i As Integer
Call Surface(2, 3, 3, MesResultat)
'Verification
For i = LBound(MesResultat) To UBound(MesResultat)
   Call MsgBox(MesResultat(i))
Next, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jrivet
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
3
Merci
Une Function peut retourner un tableau sous forme de Variant
Essaie ceci

Option Explicit

Sub MaSub()
    Dim Valeur As Variant
   
    Valeur = Surface(10, 15, 5)
    MsgBox Valeur(3)  '<= ici Valeur est "devenue" un tableau
   
End Sub


Function Surface(Val1 As Integer, Val2 As Integer, Multiplicateur As Integer) As Variant
    Dim X As Integer, Tablo() As Integer
   
    ReDim Tablo(Multiplicateur)
   
    For X = 1 To Multiplicateur
       Tablo(X - 1) = Val1 * Val2 * Multiplicateur
    Next X
   
    Surface = Tablo()
End Function

MPi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
4
0
Merci
Je fondais beaucoup d'espoir sur la méthode de MPI, qui effectivement fonctionne bien jusqu'à un tout petit point.Une fois ma fonction terminée, et donc que je me retrouve avec la valeur de la fonction à un tableau (Surface Tablo( ) ), il y a juste un problème. Je ne peux plus appeler le contenu de mon tableau.
Si je tente derrière de faire un simple msgbox Surface(0), au lieu de me ressortir la valeur attendue, le code relance la fonction et donc plante, puisqu'aucun des paramètres n'est correct.

J'ai donc pris la méthode indiquée par jrivet (je n'avais même pas pensé à coller le tableau en paramètre, honte à moi) et après quelques tâtonnements pour adapter à ma procédure, ça fonctionne.

Merci bien !

Molenn
Commenter la réponse de Molenn
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
45
0
Merci
Salut,
Etrange que l'exemple de MPi ne convienne pas non plus => qu'as tu testé commen code?

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
4
0
Merci
Je ne l'ai plus, comme je n'y arrivais pas, j'ai tenté l'autre méthode et ça fonctionnait. Comme il faut que j'avance sur mon fichier, j'ai pas poussé trop loin.

Mais à relire son code, moi aussi je trouve bizarre que ça ne convienne pas.
Il est bien possible que j'ai oublié de mettre le As variant à la fin de ma fonction, dans

Function Surface(Val1 As Integer, Val2 As Integer, Multiplicateur As Integer) As Variant

Est-ce que ça suffirait à expliquer mon problème ? Ca m'écoeurerait ^^
Je tenterai d'y revenir Lundi, quand j'en serai rendu à optimiser mon fichier. Pour l'instant, j'en suis encore à faire un truc qui doit fonctionner pour hier, comme d'habitude

Molenn
Commenter la réponse de Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
4
0
Merci
Rhaa, et voilà que ça me travaillait, imopssible de me concentrer, je suis donc retourné sur ma fonction pour re-vérifier !

Bon, en fait, c'est moi qui n'avait pas les yeux en face des trous : effectivement, j'avais oublié le type variant, mais surtout, j'avais zappé une ligne sur l'appel de la fonction.

Au lieu de faire :
 Dim Valeur As Variant
Valeur = Surface(10, 15, 5)
MsgBox Valeur(3)  '<= ici Valeur est "devenue" un tableau

je tentais de faire directement
MsgBox Surface(2)
Ca ne risquait pas de fonctionner, et ça explique pourquoi je retournais dans la fonction (j'ai juste passé un quart d'heure à revérifier la fonction alors que le pb était sous mes yeux depuis le début )

En tous cas, les deux solutions fonctionnent, youpiiiii

Molenn
Commenter la réponse de Molenn