Instruction comme paramètres pour une Sub

Résolu/Fermé
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 - Modifié par Orbital38 le 5/08/2015 à 22:31
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 - 6 août 2015 à 16:52
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) :

    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 = vbGreen
et donc ça appelle le code ci-dessus avec "blablabla" qui irait dans fichier,
Outils.BackColor = vbRed
au niveau de l'instruction 1 et
Outils.BackColor = vbGreen
au 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.


2 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
5 août 2015 à 22:39
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é).
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
Modifié par Orbital38 le 5/08/2015 à 22:49
Ah désolé, j'ai oublié la précision. ><

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. ^^
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
Modifié par NHenry le 5/08/2015 à 23:12
VB6 est obsolète depuis 2003, donc l'utiliser est très peu conseillé.
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)
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 > NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024
6 août 2015 à 15:12
D'accord. Du coup je vais prendre VS community et apprendre le VB.NET et les différences qui existent.

Pour appeler un UserForm oui c'est bien ça.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
6 août 2015 à 08:56
Bonjour,

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.
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
Modifié par Orbital38 le 6/08/2015 à 15:20
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
6 août 2015 à 15:40
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.
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
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
Modifié par Orbital38 le 6/08/2015 à 16:24
Ah oui, ou bien lier une variable string ou integer à une instruction. Je connais pas trop les Case donc je vais faire avec If :

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).
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
6 août 2015 à 16:29
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..
0
Orbital38 Messages postés 68 Date d'inscription dimanche 4 janvier 2015 Statut Membre Dernière intervention 31 octobre 2020
Modifié par Orbital38 le 6/08/2015 à 16:45
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) ?
0