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

Résolu
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 15 févr. 2007 à 16:10
dysorthographie Messages postés 62 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 9 janvier 2023 - 29 nov. 2022 à 16:42
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
A voir également:

12 réponses

jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
15 févr. 2007 à 16:57
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
3

Super ça bien marché, je séchais depuis 4J , j'ai adapté et paf ça fonctionne ! cool

0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 21
15 févr. 2007 à 18:36
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
3
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
16 févr. 2007 à 13:17
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
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
16 févr. 2007 à 13:31
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
16 févr. 2007 à 14:15
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
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
16 févr. 2007 à 14:38
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
0
dysorthographie Messages postés 62 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 9 janvier 2023 4
28 nov. 2022 à 16:13

Bonjour,

je n'es pas compris l'intérêt vu le cotexte, mais oui c'est tout à fait possible!

Sub test()
Dim TabSurface() As Integer
TabSurface() = Surface(10, 5, 4)
End Sub
Public Function Surface(Largeur As Integer, Longueur As Integer, Multiplicateur As Integer) As Integer()
Dim TabSurface() As Integer, x As Integer
ReDim TabSurface(Multiplicateur - 1)
For x = 1 To Multiplicateur
   TabSurface(x - 1) = Largeur * Longueur * Multiplicateur
Next
Surface = TabSurface
End Function
0
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
28 nov. 2022 à 16:42

Bonjour dysorthographie
15 ans après, réécrire quasi à lindentique le code qui avait justifié à l'époque que le sujet soit résolu. Résolution qui a été remerciée aujourd'hui.

Est ce nécessaire?


Tu aurais pu expliquer que Redim et Redim Preserve sont respectivement gourmand et très gourmand et qu'il serait plus judicieux d'utiliser une Collection plutôt qu'un tableau et mettre un exemple, ça aurait eu plus d'intérêt, non?

0
dysorthographie Messages postés 62 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 9 janvier 2023 4
Modifié le 28 nov. 2022 à 17:42

Oui je sais pas pourquoi ce sujet est réapparu dans mon navigateur car je n'es fait aucune recherche pourtant !

Au poste #7

https://codes-sources.commentcamarche.net/forum/affich-888876-vba-resultat-d-une-fonction-sous-forme-de-tableau-de-variables#7

Pour le reste le postulat de départ était tout à fait convenable c'est pour cela que je l'ai repris !

0
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
28 nov. 2022 à 18:51

Oui je sais pas pourquoi ce sujet est réapparu dans mon navigateur 

Simplement parce qu'aujourd'hui le message 7 a été ajouté en commentaire du message 1, afin de remercier l'auteur pour sa solution qui a aidé l'auteur du message 7 aujourd'hui.

Et la solution du message 1 est exactement la même que la tienne.

Donc 15 ans après tu rebondis sur un merci pour répéter la raison du merci


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
dysorthographie Messages postés 62 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 9 janvier 2023 4
Modifié le 29 nov. 2022 à 13:11

Bonjour,

Il n'empêche que même 15 ans après, ça peut être intéressant de savoir qu'il est possible qu'une fonction retourne un tableau typé et pas seulement un variant

La preuve ça peut intéresser l'auteur du poste #7!

Du reste mon premier poste c'est fait à la suite du poste #7

Public Function Surface(...) As Integer()
0
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
29 nov. 2022 à 14:42

Bon

j'essayais gentiment de te faire comprendre que ton intervention avait peu d'intérêt par rapport à ce qui était déjà écrit. Mais puisque que tu ne sembles pas comprendre je vais être un peu plus cash.

  • Quand on lit le message 8, on a l'impression que tu réponds à la question initiale ou à la première réponse, sans prendre en compte, les 5 réponses intermédiaires et les 15 années écoulées.
  • A un détail près, à savoir que tu as transformé une sub, en fonction (j'y reviens après) ton code est exactement le même que celui déjà présenté
  • la fonction, admettons que ça ait de l'intérêt dans ce contexte, alors dès le message 8, il faudrait le signaler clairement, "tiens une fonction au lieu d'une sub ça serait comme ça". Mais selon ma lecture, une sub qui reçoit un tableau en paramètre, byref, et le modifie, répond au besoin qui est de modifier un tableau existant et pas d'en avoir un nouveau. Donc sans préciser que la function est une seconde option (au message 1)ça ne saute qu'aux yeux d'un codeur averti (probablement pas celui qui découvre Redim)
  • En plus tu réutilises Redim, ce n'est pas une bonne pratique. Redim, crée un nouveau tableau, et modifie la référence dans la variable. Proposer une solution alternative comme par exemple une collection aurait eu plus d'intérêt pédagogique.
  • enfin "Du reste mon premier poste c'est fait à la suite du poste #7", non le message 7 dit merci, le message 8 ne répond pas au message 7. A priori, tu voulais répondre au  message 2, mais on ne le comprend que quand on vois que tu justifies après coup "ça peut être intéressant de savoir qu'il est possible qu'une fonction retourne un tableau typé et pas seulement un variant". Mais on reviens à ma 2eme puce, t'en parles pas dans ton message donc, ça passe à la trappe.


Donc, oui en introduisant clairement, le fait qu'au message 2 il a été proposé une fonction retournant un tableau sous forme de variant, ça peut avoir un petit intérêt. Mais ça ne correspond pas au besoin initial, à savoir modifier un tableau existant. Et en plus, tu y présentes la même mauvaise pratique que les autres... 

Mais formulé tel que, non ça ne valait pas le coup de surenchérir sur un merci qui exhume un sujet endormi depuis 15 ans.


Et comme l'exhumation inutile, c'est contraire à la charte, j'aurais simplement supprimer ton message quand je l'ai lu. Mais j'ai préféré essayer de te faire comprendre le peu d'utilité de cette intervention.

La prochaine fois, si tu estimes apporter quelque chose de nouveau, soit explicite sur les nouveautés et essaye de ne pas promouvoir de mauvaise pratique.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
dysorthographie Messages postés 62 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 9 janvier 2023 4
29 nov. 2022 à 16:42

Je comprends !

0
Rejoignez-nous