Problème d'appel de fonction

Résolu
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006
-
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
-
Bonjour, j'ai un problème je voudrais que dans ma form1 un meme boutton appel differentes fonctions situées dans une feuille module. Je m'explique, j'ai des nombreuses fonctions à la fin de chacune d'entre elles un choix est laissé a l'utilisateur et provoque l'appel d'une autre fonction et ainsi de suite... le bouton "choix1" par exemple n'appelera donc la meme fonction à chaque fois.
J'ai essayer de mettre le nom de la fonction suivante a appelée dans un string et faire un call de ce string mais sans pointeur ca signifie pas grand chose.
Si qq a une idée .....

18 réponses

Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Lis bien le Select case, au lieu d'évaluer une variable, ou une constante (l'argument du case), tu utilises le même nom que la fonction que tu appelles.
Donc, quand tu testes A1 (case A1:), tu l'exécutes, elle modifie Num, comme au retour de A1, Num est différent de A1, on traite A65 (en l'exécutant) et ainsi de suite.

je suis prêt à parier que A1 n'est pas une Sub mais une fonction! (c'est un effet de bord qui t'empêche de voir l'erreur)

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Ben appelle ta fonction directement dans ton module après avoir demandé le choix de l'utilisateur...

Si ce n'est pas cà, c'est que j'ai pas compris ce que tu cherche à faire !
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006

en faite on pe voir les differentes fonctions comme des pages d'un livres et a la fin on te le laisse le choix de te rendre a differentes pages.
donc lors de la premiere fonction le bouton choix1 appelera a la fonction96 par exemple et la tu aura un autre choix et le bouton choix1 appelera alors une autre fonction.
en esperant avoir été plus clair
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,


Tu peux te faire un truc du style










Private Sub Choix1_Click() 
Static NumPage As Integer 
NumPage = NumPage + 1 
Select Case NumPage 
    Case 1: Call Fonction96 
    Case 2: Call Fonction95 
    Case 3: Call Fonction98 
    '[etc...]
End Select 
End Sub 
 







<small> Coloration syntaxique automatique [AFCK]</small>

       







 






@+,   Ju£i?n
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut 621506 loki61, salut =13557 DARKSIDIOUS, salut 89254 jrivet,

exécuter le call sur une string?

tu veux dire une string contenant le nom de la fonction a exécuter?
En anglais, you want call a function by its name?

Quelle folie :)

utilises donc la fonction
CallByName( Object As Object, ProcName As String, CallType As VbCallType, Args() As Variant) !

ça donne des choses du genre :

CallByName Me.Text1, "Text", VbLet, "test"                     ' équivaut à Me.Text1.Text ="test"
CallByName Form1, "Show", VbMethod, VbModal          ' équivaut à... je vous laisse deviner
CallByName CreateObject("Serv.Class"), "MethQueVBNeConnaisPasAlaCompil", VbMethod, Param

oh que je l'aime celle là :)

Ceci dit, le Select Case reste plus conventionnel, et plus adapté à ton besoin (avec un peu d'effort pour que les utilisateurs aient une liste de choix de la fonction à exécuter. Parfois, on appelle ça un Menu).

à+ 

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006

Merci a vous 3, Jrivet ta methode marche effectivement (ca va me faire un case avec une centaines de ligne mais bon). Rvblog pour ta methode elle d'un niveau un peu trop elevé pour moi mais merci quand meme.
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006

En faite un nouveau probleme ce crée avec la methode des Cases :

je reprend :

Private Sub Cmdsuite_Click()
Select Case Num
Case A1: Call A1
Case A65: Call A65
End Select
End Sub

le probleme c'est que dans la fonction A1 la valeur de num se met à A65 donc le programme enchaîne directement les 2 Cases sans que l'on est à rappuyer sur Cmdsuite.
Quelqu'un aurait il un idee pour sortir du case ? (j'ai essayer de faire un exit sub sans résultat)
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Bizarre,

que la variable Num soit gloable, c'est une chose, que la procédure CmdSuite_Click (privée de surcroit), se ré-exécute sans qu'on la sollicite, c'en est une autre! 

quelqu'instruction de ton code doit sûrement rappeler cette fonction, directement (possible), ou indirectement (là, j'ai plus de mal, à moins que, comme son nom ne l'indique pas, CmdSuite n'est pas de type CommandButton, mais plutôt ComboBox ou ListBox)!

à+






rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006

je ne pense pas que la procédure CmdSuite_Click se ré-exécute sans qu'on la sollicite, je pense qu'apres etre sortie de la fonction A1 le programme retourne dans le select case vu qu'il n'ets pas arrivé au End Select mais entre temps la valeur de num a changer donc a la place de sortir de Cmdsuite et d'attendre que l'on rappui sur le bouton il charge la fonction suivante : A65
en esperant avoir été plus clair
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,


Lorsque VB rentre dans une condition TRUE lors d'un case, Il ne rentrera que dans une seule.


Peu etre as tu un probleme à un autre endroit.


Peu etre devrais tu nous mettre une petite portion de ton code. car la j'ai teste ceci dans une feuille








Option Explicit 
Dim Nump As Integer 

Private Sub Form_Load() 
Nump = 1 
Select Case Nump 
    Case 1: Call A1 
    Case 2: Call A2 
    Case 3: Call A3 
    Case 4: MsgBox ("4") 
End Select 

End Sub 

Private Sub A1() 
Nump = 2 
End Sub 

Private Sub A2() 
Nump = 3 
End Sub 

Private Sub A3() 
Nump = 4 
End Sub 

 







<small> Coloration syntaxique automatique [AFCK]</small>

       





Et en aucun cas Nump n'est arrivé a 4 (chose qui aurait du se produire si l'on suit ton résonnement)
D'ou la question du code/
@+,   Ju£i?n
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
non, je viens de comprendre :

Private Sub Cmdsuite_Click()
Select Case Num
    Case A1: Call A1
    Case A65: Call A65
End Select
End Sub

me suis-tu?

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006

En effet apres quelque essai ce n'est pas mon case qui appel ma fonction A65 je vé faire quelque essai en pas a pas pour trouvé ce qui l'appel, et je posterai mon code si je ne trouve pas.
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,
De toute facon une fois rentrer dans un case meme si les valeurs du case sont changées, on NE RENTRE plus dans les autres

@+,   Ju£i?n
Messages postés
9
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
21 septembre 2006

Le probleme venait que la variable du Case et que le nom de la fonction avaient le meme nom chez mit le Num en integer et ca marche tres bien :

Private Sub Cmdsuite_Click()

Select Case Num
Case 1: A1
Case 65: A65
End Select
End Sub
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut 89254 jrivet,

testes ça au pas à pas, tu vas te marrer :

Private Num As Integer

Private Sub Command1_Clcik
   Select Case Num
      Case A1: Call A1
      Case A2: Call A2
End Sub

Function A1
   Num = 2
End Function

Function A2
   Num = 3
End Function

Private Sub Form_Load()
   Num = 1
End Sub

et après t'être marré, change A1 et A2 en Sub, et tu vas pleurer :)
rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
j'ai oublié le End Select

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
rvblog: J'ai teste Mais Voila ce que cela me donne:

Cas Avec les Function => Le case n'est jamais verifié et donc les Fonction Jamais appelé deux fois (Juste Une fois dans le case ce qui est jusqu'ici Normal)
Cas Avec Les SUb => IMPOSSIBLE A teste => Fonction Ou Variable Attendue.

> Je ne vois donc pas comment loki61 a pu avoir des problèmes (Sauf dans le cas ou c'etait des fonctions)

Enfin Bref Son probleme est resolu et c'est le principal.
@+,   Ju£i?n
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
parce que les fonctions que tu as testé sont les miennes, et dans mon cas on exécute toutes les fonctions.

lui il n'a pas dit que le A65 s'exécutait 2 fois, mais qu'il avait l'impression que le Command_Click s'exécutait 2 fois, parce qu'il devait l'observer indirectement : et il voyait donc que A1 s'était exécuté et que A65 aussi.

Mais tu a raison, le problème est réglé.

à+

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>