bien je viens de tester sous excel 97 SR1... et la fonction retourne bien un tableau ... ( seule la ligne MonTableau = Array(1, 2, 3, 4, 5) provoque une erreur..)Envoyé par ouskel'n'or
bien je viens de tester sous excel 97 SR1... et la fonction retourne bien un tableau ... ( seule la ligne MonTableau = Array(1, 2, 3, 4, 5) provoque une erreur..)Envoyé par ouskel'n'or
Tu ne confonds pas la notion de tableau et variant? Voici un contre exemple à ton affirmation :Envoyé par jmfmarques
1. On peut modifier les valeurs d'un tableau en le passant par référence.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Private tableau() As String Private Sub Main() ReDim tableau(3) For i = 0 To 2 tableau(i) = i Next voila tableau For i = 0 To 2 MsgBox tableau(i) ' et l'on voit que le modif sans voila n'a rien fait finalement Next End Sub Private Function voila(ByRef t() As String) For i = 0 To 2 t(i) = t(i) & "a" ' expres pour que l'on voie que tableau est bien considéré ici MsgBox t(i) Next i End Function
2. On peut renvoyer un tableau en résultat de fonction. Exemple fonction Split!
Voilà un exmple de fonction qui renvoie un tableau :
A mon avis, le plus propre est de passer le tableau en paramètre d'une fonction (ou procédure) plutot que de le renvoyer en résultat de fonction. Cela utilise moins de ressource.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Sub Main() Dim tableau() As String tableau = voila For i = 0 To 2 MsgBox tableau(i) Next End Sub Private Function voila() As String() Dim tmp(3) As String For i = 0 To 2 tmp(i) = i Next i voila = tmp End Function
Je préfère d'ailleurs garder le résultat de la fonction pour dire si le tableau s'est créé ou préciser la taille du tableau (par exemple).
je ne confonds rien du tout et surtout pas une fonction et une procédure.
Dans cet exemple, "voila" n'a de "fonction" que le nom. Ce n'en est certes pas une, mais une simple procédure...
Une fonction retourne SA valeur. Une procédure restitue ses paramètres... et c'est loin d'être la même chose !
L'enlèvement des parenthèses est suffisant pour que l'on voie qu'il ne s'agissait alors plus d'une fonction
Voilà donc, comment fonctionne une fonction :
Et c'est loin d'être pareil.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Private Sub Command1_Click() b = 2 MsgBox toto(b) End Sub Private Function toto(titi) As Integer If titi = 2 Then toto = 3 End Function
Question donc (car la question est là) :
Une fonction peut-elle RENVOYER un tableau qui lui a été passé en argument (autrement dit : peut-elle devenir elle-même un tableau ?)
Cà y est ?
jmf,
j'ai réagi a deux choses :
1 ta remarque :
Ce qui est faux. Cf. le code que j'ai précédement fournisOn ne peut par contre définitivement pas modifier les valeurs du tableau dans la fonction ou la procédure et retrouver ces modifications au retour de la fonction ou de la procédure
2. A la question posée intialement dans le titre du message. Peut-on renvoyer un tableau en résultat de fonction. Réponse oui. Cf. le code précédement donné.
jmf..:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub Command1_Click() Dim b(0 To 1) As Integer b(0) = 2 MsgBox toto(b)(0) End Sub Private Function toto(titi() As Integer) Dim D(0 To 1) As Integer If titi(0) = 2 Then D(0) = 3 toto = D End Function
PS : merci catbull pour ton aide...
Très intéressant.
Maintenant : une fonction étant destinée à plusieurs utilisations, comment passes-tu la dimension (pas connue au départ par la fonction) à la fonction ?
Crois tu que dim va accepter autre chose qu'un chiffre ou une constante ?
Ton truc est bon mais il faut utiliser Redim au lieu de dim et passer la dimension du tableau pour l'utiliser avec redim.
Catbull : ton code n'est pas celui d'une fonction... il ne le serait que s'il retournait la valeur de voila ...
Plusieurs solutions, utiliser un autre paramètre pour préciser la dimension, ou initialiser le tableau avant l'appel de la fonction. Cette initialisation a pour but de définir la taille du tableau.
Enfin, il ne faut pas utiliser un dim, mais un Redim.
? ben tu met redim ..? ou est le probléme ?Envoyé par jmfmarques
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim D() As Integer ReDim D(UBound(titi))
On peut discuter longtemps de la différence entre fonction et procédure. Pour ma part il y en a aucune à part le fait que la procédure ne peut pas renvoyer un résultat. Personnellement j'utilise à 90% du temps des fonctions. Renvoyer un résultat est toujours utile.Envoyé par jmfmarques
D'un point de vue exécution fonction et procédure c'est la même chose à la différence près que la fonction va empiler une adresse supplémentaire qui est celui du résultat de fonction. Donc la différence comportementale est petite.
Je réserve les procédures aux modules de classes. Et je préfère alors employer le terme de méthode que de procédure. Une méthode va agir sur une instance de classe. A la différence d'une fonction qui va renvoyer un résultat. Exemple triviale de la simution d'une course de voiture. On va avoir une méthode avancer qui avance une voiture (classe Voiture) et une fonction qui donne la position de la voiture à l'instant t. Dans le premier j'utilise une procédure dans le deuxième une fonction. Mais j'aurais tout aussi bien pu utiliser une fonction dans les deux cas.
Ceci vient sans doute du fait que j'ai appris la programmation sur les langages oriréntés objects comme l'Eiffel ou Java.
Si si, on va en discuter, car c'est important...
Dans l'exemple du demandeur, il n'était en effet pas utile d'utiliser une fonction.
Une procédure suffisait.
Il en va différemment d'en d'autres (cas) où il est absolument indispensable d'envoyer (celà se fait toujours facilement... voir mon 1er code) un tableau de valeurs que l'on va modifier pour faire, par exemple, des calculs en recherche, sans pour autant modifier le tableau envoyé à la fonction, dont le rôle sera de retourner une valeur (celle du résultat)
On l'appelle alors en lui passant le tableau entre parenthèses.
Si on enlevait ces parenthèses, la fonction se comporterait comme une procédure et le tableau de départ se trouverait indûment modifié.
J'utilise très fréquemment ce principe et cette énorme différence de comportement.
Quant aux fonctions qui retournent un tableau,Envoyé par ousk'
![]()
![]()
trois fois honte à moi. En déclarant le tableau dans la fonction, celle-ci retourne bien un tableau
![]()
Je n'ai pas utilisé ton code, bbil, afin de passer par la variable CopieDuTableau qui ne laisse aucun doute quant au retour d'un tableau par une fonction.![]()
Mon excuse ? J'en ai pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub AppelFonction() Dim CopieDuTableau, LeTableau,i LeTableau = LaFonction(5) CopieDuTableau = LeTableau For i = 0 To UBound(CopieDuTableau) MsgBox CopieDuTableau(i) Next End Sub Function LaFonction(nb) Dim MonTableau MonTableau = Array(5, 4, 3, 2, 1) LaFonction = MonTableau End Function![]()
La raison : J'avais un Option Explicit que j'ai ignoré dans la rédaction du code et qui bien sûr plantait la fonction.
Maintenant que je sais ça, je me sens plus riche d'une expérience et je vais tâcher de voir comment répondre à jemefe...
Mes excuses à bbil
T'as rien perdu ousk !![]()
Car analyse bien tout et tu vas découvrir .... que....
Au bout du compte, le code fort astucieux au demeurant de Bbil pouvait largement etre remplacé par une duplication B du tableau original A et l'utilisation d'une procédure traitant non le A mais le B ...
Il se retrouve en effet in fine avec 2 tableaux différents: le A et la fonction
On aurait eu également 2 tableaux différents : le A et le B
Le tout avec la même occupation de mémoire !![]()
Cela n'a rien à voir. Les parenthèse ne sont qu'un artifice servant à l'analyse syntaxique du compilateur.Envoyé par jmfmarques
La déclaration d'un tableau en VB correspond à un pointeur. Le passage d'un tableau en paramètre de fonction ou de procédure est forcément un passage par référence.
Donc procédure ou fonction tu modifies obligatoire un tableau passé par en paramètre.
Non !
je ne modifie pas le tableau original si je passe le paramètre entre parenthèses à la fonction. Je le modifie si je n'utilise pas les parenthèses (voir codes plus haut)![]()
Ne pose pas de problème. Tu peux passer un paramètre ou non, si tu en as besoin, tu l'utiises, sinon, la fonction retourne le tableauEnvoyé par jmf
Etait-ce là ta question, jemefe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Sub AppelFonction() Dim CopieDuTableau, LeTableau LeTableau = LaFonction(256) CopieDuTableau = LeTableau For i = 0 To UBound(CopieDuTableau) MsgBox CopieDuTableau(i) Next End Sub Function LaFonction(nb) Dim MonTableau,i ReDim MonTableau(nb) For i = 0 To nb MonTableau(i) = i Next LaFonction = MonTableau End Function
A+
jmf,
encore une fois tu confonds variant et tableau. Un variant n'est pas un tableau. Dans le code proposé tu ne passes pas en paramètre un tableau mais un variant!
essaye en mettant "voila (tableau)" avec et sans parenthèses ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Private tableau, t 'pour que l'on voie bien que globale ou non, celà n'a rien à voir dans le résultat Private Sub Command1_Click() Dim tableau(3) For i = 0 To 2 tableau(i) = i Next voila (tableau) For i = 0 To 2 MsgBox tableau(i) ' et l'on voit que le modif sans voila n'a rien fait finalement Next End Sub Private Function voila(t) For i = 0 To 2 t(i) = t(i) & "a" ' expres pour que l'on voie que tableau est bien considéré ici MsgBox t(i) Next i End Function
merci beaucoup ! vraiment bizar j'avais déjà essayé de retourner mon tableau en faisant : CalculStats = TabStats et il m'avait fait une erreur ! et là ça fonctionne...mais j'ai déclaré le tableau en public...ça vient de là vous pensez ?
en fait je retourne mon tableau mais le truc que je pige pas c'est qu'on donne pas un type qu'on retourne
Public function Calculstats ()
blabla
calculstats = tableau
End function
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager