Instruction comme paramètres pour une Sub
Résolu
Orbital38
Messages postés
71
Date d'inscription
Statut
Membre
Dernière intervention
-
Orbital38 Messages postés 71 Date d'inscription Statut Membre Dernière intervention -
Orbital38 Messages postés 71 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je voudrais créer une fonction (ou une sub ?) mais avec des instructions en guise de paramètres. Est-ce que c'est possible ?
En fait il y a une série de If que je répète souvent lors de l'exécution de différentes subs (série de If qui apparait dans un module et un module de classe) :
Voilà je voudrais donc un truc du genre
Merci. Si c'est pas possible tant pis, mais c'est vrai que je m'y perd presque lorsque je dois placer à nouveau ces tests dans mes subs de module et de module de classe.
Je voudrais créer une fonction (ou une sub ?) mais avec des instructions en guise de paramètres. Est-ce que c'est possible ?
En fait il y a une série de If que je répète souvent lors de l'exécution de différentes subs (série de If qui apparait dans un module et un module de classe) :
Dim fichier, groupe_bouton, underscore, nom_macro, test_fichier As String Dim prefixe As Integer fichier = ' paramètre 1 prefixe = InStr(fichier, "-") If prefixe <> 0 Then If IsNumeric(left(fichier, prefixe - 1)) Then groupe_bouton = left(fichier, prefixe - 1) underscore = Mid(fichier, prefixe + 1, 1) nom_macro = Mid(fichier, prefixe + 2) test_fichier = Mid(fichier, prefixe + 1) If underscore = Chr(95) And Not (nom_macro Like "C:\*" Or nom_macro Like "D:\*") Then ' instruction 1 ElseIf test_fichier Like "C:\*" Or test_fichier Like "D:\*" Then ' instruction 2 Else End If Else End If Else End If
Voilà je voudrais donc un truc du genre
fonction_magique "blablabla", Outils.BackColor = vbRed, Outils.BackColor = vbGreenet donc ça appelle le code ci-dessus avec "blablabla" qui irait dans fichier,
Outils.BackColor = vbRedau niveau de l'instruction 1 et
Outils.BackColor = vbGreenau niveau de l'instruction 2.
Merci. Si c'est pas possible tant pis, mais c'est vrai que je m'y perd presque lorsque je dois placer à nouveau ces tests dans mes subs de module et de module de classe.
A voir également:
- Instruction comme paramètres pour une Sub
- Parametres de mon ordinateur - Guide
- Paramètres dns - Guide
- Paramètres de confidentialité - Guide
- Leboncoin paramètres - Guide
- Paramètres iphone - Guide
2 réponses
Tu code en quoi ? VB6, VBA, VB.NET ?
Il me semble que quel VB.NET permet l'appel de code via paramètre (délégué).
Il me semble que quel VB.NET permet l'appel de code via paramètre (délégué).
Bonjour,
Plusieurs petites choses...
1- ta déclaration de variable :
ainsi faite, déclare fichier, groupe_bouton, underscore, nom_macro As Variant.
Il faut, en VBA, typer chaque variable :
2- Si tu veux passer "blablabla" dans la variable fichier, tu peux utiliser une Sub paramétrée. Mais, à ce moment là, il ne faut pas déclarer de variable fichier par Dim. En effet, c'est déjà fait par le passage en paramètre.
Exemple :
3-Pour l'instruction, si tu n'as que des BackColor, il convient de passer les valeurs comme ceci :
Par contre, si tu ne modifies pas que tes backColor, il n'est pas possible de "passer" en paramètre des "lignes de code"...
Donc, décris bien ton problème afin que l'on puisse t'orienter.
Plusieurs petites choses...
1- ta déclaration de variable :
Dim fichier, groupe_bouton, underscore, nom_macro, test_fichier As String
ainsi faite, déclare fichier, groupe_bouton, underscore, nom_macro As Variant.
Il faut, en VBA, typer chaque variable :
Dim fichier As String, groupe_bouton As String, underscore As String, nom_macro As String, test_fichier As String
2- Si tu veux passer "blablabla" dans la variable fichier, tu peux utiliser une Sub paramétrée. Mais, à ce moment là, il ne faut pas déclarer de variable fichier par Dim. En effet, c'est déjà fait par le passage en paramètre.
Exemple :
Sub Code_Appelant() Dim NomFic As String NomFic = "blablabla" Call Transform(NomFic) MsgBox NomFic End Sub Sub Transform(ByRef Fichier As String) Fichier = Fichier & "blibli" End Sub
3-Pour l'instruction, si tu n'as que des BackColor, il convient de passer les valeurs comme ceci :
Sub Code_Appelant() Dim NomFic As String NomFic = "blablabla" Call Transform(NomFic, 255, 0) MsgBox NomFic End Sub Sub Transform(ByRef Fichier As String, Coul_1 As Long, Coul_2 As Long) Fichier = Fichier & "blibli" MsgBox "La couleur 1 est : " & Coul_1 & ", la couleur 2 est : " & Coul_2 End Sub
Par contre, si tu ne modifies pas que tes backColor, il n'est pas possible de "passer" en paramètre des "lignes de code"...
Donc, décris bien ton problème afin que l'on puisse t'orienter.
1- Merci je ne savais pas. Je savais qu'on pouvait en déclarer plusieurs à la chaine sans refaire un Dim mais quand on m'a appris ça c'était il y a 3 ans (et pour des études de mécanique... oui oui XD).
2- Je connais le paramétrage des Sub. ^^ Mais c'est vrai que j'ai mal exposé mon problème. Là j'ai fais un simple copier/coller du code que j'ai actuellement. Je suis conscient que si une modif' est faite pour le "paramètre 1" qu'il faudra changer la désignation de ma variable fichier. ^^
3- Le soucis était plus ici. J'ai mis
Quoi qu'il en soit, vu ton dernier paragraphe j'en déduis que c'est impossible. Je verrais si je peux pas rajouter un truc en amont pour simplifier tout ce bordel. x)
Merci en tout cas pour la première info. C'est un truc qui m'étais complètement sorti de la tête.
Je mets quand même en résolu du coup.
2- Je connais le paramétrage des Sub. ^^ Mais c'est vrai que j'ai mal exposé mon problème. Là j'ai fais un simple copier/coller du code que j'ai actuellement. Je suis conscient que si une modif' est faite pour le "paramètre 1" qu'il faudra changer la désignation de ma variable fichier. ^^
3- Le soucis était plus ici. J'ai mis
Outils.BackColor = vbRed, mais ça aurait pu être n'importe quoi. Dans le 1er code j'ai mis ' instruction 1 c'est vraiment pour une instruction, peu importe laquelle (même si ça restera simpliste). Mais j'aurais pu mettre un LoadPicture, ou MsgBox ou quelque chose du genre.
Quoi qu'il en soit, vu ton dernier paragraphe j'en déduis que c'est impossible. Je verrais si je peux pas rajouter un truc en amont pour simplifier tout ce bordel. x)
Merci en tout cas pour la première info. C'est un truc qui m'étais complètement sorti de la tête.
Je mets quand même en résolu du coup.
si je peux pas rajouter un truc en amont pour simplifier tout ce bordel
Le truc, en programmation, pour remplacer une instruction comme tu souhaites le faire, c'est... la Sub ou la fonction.
Ce qui donnerait, avec le passage de paramètres en String (plus simple)
Le truc, en programmation, pour remplacer une instruction comme tu souhaites le faire, c'est... la Sub ou la fonction.
If underscore = Chr(95) And Not (nom_macro Like "C:\*" Or nom_macro Like "D:\*") Then Call Ma_Sub_1 ElseIf test_fichier Like "C:\*" Or test_fichier Like "D:\*" Then Call Ma_Sub_2 End If
Ce qui donnerait, avec le passage de paramètres en String (plus simple)
Sub Code_Appelant() Dim NomFic As String, UnParametre As String UnParametre = "Pourquoi" NomFic = "blablabla" Call Transform(NomFic, UnParametre) MsgBox NomFic & " - " & UnParametre End Sub Sub Transform(ByRef Fichier As String, Param As String) Fichier = Fichier & "blibli" If Left(Fichier, 3) = "bla" Then Call Ma_Sub_1(Param) ElseIf Left(Fichier, 4) = "blab" Then Call Ma_Sub_2(Param) End If End Sub Sub Ma_Sub_1(monParam As String) Select Case monParam Case "Bonjour": monParam = "1-1" Case "Comment": monParam = "1-2" Case "Pourquoi": monParam = "1-3" End Select End Sub Sub Ma_Sub_2(monParam As String) Select Case monParam Case "Bonjour": monParam = "2-1" Case "Comment": monParam = "2-2" Case "Pourquoi": monParam = "2-3" End Select End Sub
Ah oui, ou bien lier une variable string ou integer à une instruction. Je connais pas trop les Case donc je vais faire avec If :
J'appelle ensuite :
Bon, ça doit paraitre complètement faux comme code, mais est-ce que l'idée peut marcher ? En gros lié une variable (qui peut donc être un paramètre de Sub) à une instruction que l'on appelle avec la Sub ? Ou alors c'est ce que tu as tenté de me dire avec les Case et je n'ai juste pas compris le code ? (ce qui est complétement possible XD)
PS : oui je suis vraiment débutant. J'apprends un peu tout sur le tas comme ça, même si j'ai eu une dizaine d'heure de cours en VBA et C++, c'est pas vraiment suffisant (utilisation API Solidworks notamment pour automatiser la création d'un arbre à came, d'une nervure d'aile d'avion).
Sub Ma_sub(param as string, Optional Obj as object) If param = "modif_backcolor" Then Obj.Backcolor = vbRed ElseIf param = "message" Then MsgBox "Afficher message" ElseIf param = "lancer_macro" Then Call macro_au_pif Else MsgBox "Ça a merdé" End If End Sub
J'appelle ensuite :
If underscore = Chr(95) And Not (nom_macro Like "C:\*" Or nom_macro Like "D:\*") Then Call Ma_Sub(modif_backcolor, Image1) ElseIf test_fichier Like "C:\*" Or test_fichier Like "D:\*" Then Call Ma_Sub(message) End If
Bon, ça doit paraitre complètement faux comme code, mais est-ce que l'idée peut marcher ? En gros lié une variable (qui peut donc être un paramètre de Sub) à une instruction que l'on appelle avec la Sub ? Ou alors c'est ce que tu as tenté de me dire avec les Case et je n'ai juste pas compris le code ? (ce qui est complétement possible XD)
PS : oui je suis vraiment débutant. J'apprends un peu tout sur le tas comme ça, même si j'ai eu une dizaine d'heure de cours en VBA et C++, c'est pas vraiment suffisant (utilisation API Solidworks notamment pour automatiser la création d'un arbre à came, d'une nervure d'aile d'avion).
Bon, ça doit paraitre complètement faux comme code, mais est-ce que l'idée peut marcher ?
C'est tout à fait l'idée.
Une fonction ou une sub, en programmation c'est ni plus ni moins qu'une série d'instructions.
Tu peux donc, facilement, remplacer une instruction par une Sub ou une fonction. Ta variable de type String n'est là que pour différencier les différents cas. CEla tu l'as bien fait dans ton If ElseIf ...
J'ai utilisé Select Case car cela me semble moins "lourd" visuellement. If ElseIf fonctionnera aussi bien, voire même plus vite..
C'est tout à fait l'idée.
Une fonction ou une sub, en programmation c'est ni plus ni moins qu'une série d'instructions.
Tu peux donc, facilement, remplacer une instruction par une Sub ou une fonction. Ta variable de type String n'est là que pour différencier les différents cas. CEla tu l'as bien fait dans ton If ElseIf ...
J'ai utilisé Select Case car cela me semble moins "lourd" visuellement. If ElseIf fonctionnera aussi bien, voire même plus vite..
D'acc'. Merci beaucoup. =)
Dernière petite question : le Select Case, comparé au If ElseIf, n'existe que pour rendre plus clair le code (si jamais on a déjà 5/6 ElseIf) ? Ou bien est-ce qu'il permet des choses en plus (ou en moins, comme par exemple des tests sur des paramètres d'Objets du style Image.BackColor, Label.Caption) ?
Dernière petite question : le Select Case, comparé au If ElseIf, n'existe que pour rendre plus clair le code (si jamais on a déjà 5/6 ElseIf) ? Ou bien est-ce qu'il permet des choses en plus (ou en moins, comme par exemple des tests sur des paramètres d'Objets du style Image.BackColor, Label.Caption) ?
Là je fais ça en VBA car j'ai que ça sous la main. Je passerai en VB6 (avec Visual studio community) après je pense. Là en fait j'utilise VBA avec excel mais je ne fais que lancer un userform sans utiliser la bibli d'excel.
Enfin bref. On va dire VBA, en espérant que ça soit compatible VB6.
Et si seulement VB.NET le permet j'irai poser ma question là-bas, j'apprendrai sur le tas à transformer mon code VBA en VB .NET. ^^
Envisages plutôt un passage sur VB.NET ou C#.NET.
Pour ouvrir un UserForm, c'est pas :
MonUserForm.Show
? (Remplacer "MonUserForm" par le nom réel du UserForm)
Pour appeler un UserForm oui c'est bien ça.