Problème passage d'un tableau comme paramètre d'une fonction

dafrip Messages postés 3 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 21 août 2006 - 21 août 2006 à 14:12
Kemarnaud Messages postés 2 Date d'inscription mardi 9 août 2011 Statut Membre Dernière intervention 5 septembre 2011 - 5 sept. 2011 à 18:46
Bonjour,

J'utilise VBA sur Excel 2000, et dans ma macro, je dispose de tableaux de String que je voudrais trier.

Dim tab(),tab1() as String
Redim tab(0), tab1(0)

'Je remplis mes tableaux en parcourant les cell de la feuille cible
Tri(tab)
Tri(tab1)

A l'appel de la fonction Tri, il y a une erreur de compilation me disant:
"Incompatibilité de type:Tableau ou type défini par l'utilisateur attendu"

Je comprend pas pourquoi il ne voit pas tab et tab1 comme deux tableaux, je suis bloqué dessus et j'ai essayé maintes solutions mais le résultat est le même. Merci beaucoup de m'éclairer sur le sujet
-------------------------------------------------------------------------
Ma fonction Tri

Private Sub Tri(tabl() As String)

Dim temp As String

' trier le tableau
For i = 0 To UBound(tabl) - 1
For j = i + 1 To UBound(tabl)
If tabl(i) > tabl(j) Then
temp=tabl(i)
tabl(i) = tabl(j)
tabl(j) = temp
End If
Next j
Next i

End Sub

<!-- / message -->

8 réponses

cs_bultez Messages postés 13616 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
21 août 2006 à 14:32
bonjour,
   avec VB j'aurais répondu : Private Sub Tri(ByVal tabl)
         ce qui aurait été une bétise, sûrement...
   mais avec VBA ?
   poser la question dans le forum approprié : VB,VBA,VB.net
         serait, sans doute, plus profitable...
cordialement   Bul    
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
21 août 2006 à 14:37
Salut,

Il suffit d'enlever les parenthèses autour de tab et tab1 et de mettre un espace lors de l'appel à Tri.

Petit rappel:

Si tu utilises le mot clé Call, tu mets des parenthèses, sinon tu les omets.

Cf MSDN.

De plus pense à bien mettre ByRef pour le paramètre de ta fonction, c'est davantage explicite.

j!nH
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
21 août 2006 à 14:54
Salut,


Peu etre que cela viens aussi du fait que tab() n'est PAS de type string mais Variant


En effet si tu déclare comme suit:


Dim Tab(), Tab1() as string , seul Tab1() est de type string Tab() lui est un tableau de Variant.


Il faut déclarer comme suit
Dim  Tab() as String, Tab1() As string






@+, Julien
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
21 août 2006 à 15:18
Le fait de ne pas spécifier le type, et donc de se retrouver avec un type Variant à déterminer ne provoquera pas d'erreur. Par contre, cela prendra plus de temps à l'exécution.
Donc Julien a raison, il vaut mieux être rigoureux.

j!nH
0

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

Posez votre question
kalobit Messages postés 169 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 7 avril 2008 2
22 août 2006 à 11:56
salut,


Tu utilise Tab() pour déclarer ton tableau or Tab() est une fonction intrinsec à vba.

remplace donc Tab() par Tab2() et suit les instruction de jinh68.

Le byref est obligatoire pour que les changements soients effectifs sut tab1 et 2 et non seulement sur tabl ( par défaut byval prévaut dans un passage d'arguments)

@ +++

[mailto:K@lobit K@lobit] < Ne pas clicker ici < Mais ici

Je cherche des personnes pour développer un site dédié à excel, si vous êtes partant pou
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
22 août 2006 à 12:00
Salut,


 MSDN Dit
1- (dans l'aide pour Call) : "Pour passer un tableau entier à une procédure, entrez le nom du tableau, suivi de parenthèses vides."




>136120 kalobit : Erreur, c'est ByRef par défaut en VB (A) (autre que .NET car je ne connais pas)
=> MSDN le dit aussi :


ByRef,
Facultatif. Indique que l'argument est passé
<object id="alink_25" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>par référence. ByRef est l'option par défaut dans Visual Basic.





@+, Julien
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
26 août 2006 à 22:40
Salut 537030 dafrip, salut =51635 bultez, salut 142365 jinh68, salut =89254 jrivet, salut 136120 kalobit,

=89254 jrivet a raison (comme souvent), le 1er tableau se doit d'être typé fort pour passer par l'argument de type tableau de string. Il ne peut pas passer sans erreur, le contraire fonctionne (tableau déclaré typé fort [string] passé en argument typé faible [variant]).

142365 jinh68 a raison, il faut spécifier le ByRef (sans commentaires, par défaut, lisibilité, portabilité,... , il le faut).

Et =136120 kalobit a raison, tu ne peux pas appeler ton tableau tab (en VBA Excel).

à+

PS: j'arrive tard et 537030 dafrip a sûrement trouvé la réponse, je sais, mais je n'aurais pas répondu si =142365 jinh68 n'avait pas dit que le tableau déclaré en variant pouvait passer par un argument typé string.

rvblog<sup>n
Je veux ton bien....et je l'aurais....mais jamais avant la page 4 des derniers échanges</sup>
0
Kemarnaud Messages postés 2 Date d'inscription mardi 9 août 2011 Statut Membre Dernière intervention 5 septembre 2011
5 sept. 2011 à 18:46
salut j'ai un probleme; actuellement je developpe une application qui sera mit en reseau et j'utilise winsock en vb6. ce je n'arrives pas a faire de prendre le resultat d'une requete et l'affecte dans un tableau pour ensuite le renvoyer au client connécté qui émet juste un signal comme besoin de prochain numéro. aidez moi svp
0
Rejoignez-nous