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   -
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

  1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    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
    1. Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    2. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      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
      1. Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    1. Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    3. Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
       
      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
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    5. Orbital38 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
       
      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