Conditionnement d'un type de données d'un paramètre de fonction

Victor Porée Messages postés 79 Statut Membre -  
Victor Porée Messages postés 79 Statut Membre -
Bonjour à tous ! :)

Comment faire pour que — dans une procédure de fonction — un paramètre puisse définir le type de données d'un autre paramètre ?

Par exemple, si le premier argument de la fonction est 1, alors le deuxième argument est une cellule ; si 2, alors la valeur de la cellule, etc.

--
Cordialement,
Victor Porée.

Configuration :
macOS Sierra
Microsoft Office 2016

3 réponses

  1. Kalissi Messages postés 221 Statut Membre 20
     
    Bonjour,

    Tu peux utiliser le type Variant ainsi que le mot clé [ Optional ].

    Exemple :

    Public Sub EssaiParamatres(ByVal pArg1 As Variant, Optional ByVal pArg2 As Variant, Optional ByVal pArg3 As Variant)

    Select Case pArg1
    Case "1"
    ' Traiter le cas 1
    Case "2"
    ' Traiter le cas 2
    ' etc...
    End Select

    End Sub


    En utilisant le type [ Variant ], chaque variable peut contenir
    n'importe quel [ Type ]. Et en utilisant le mot clé [ Optional ],
    l'argument peut ne pas être présent.

    Avec une combinaison des deux, tu devrais pouvoir obtenir
    le comportement souhaité.

    K
    0
    1. Victor Porée Messages postés 79 Statut Membre 2
       
      Bonjour Kalissi !

      Merci pour ta réponse ! :)

      Je l'avais déjà testé, et ça fonctionne, effectivement. Mais l'inconvénient, c'est qu'il faut jouer avec les virgules (ou points-virgules) pour obtenir le bon type de données. Ce qui n'est finalement pas très pratique. L'intérêt serait d'avoir à la même position de paramètre, par exemple, tantôt un
      String
      , tantôt un
      Range
      . Et puis j'ai pas mal de types à déclarer, alors les paramètres n'en finiraient pas.

      Sinon, est-il possible de modifier le type de données d'une variable au cours de la procédure ?
      0
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > Victor Porée Messages postés 79 Statut Membre
         
        Bonjour Victor Porée,

        Tout ceci n'est pas très clair !

        « Sinon, est-il possible de modifier le type de données d'une variable au cours de la procédure ? » Non, en VBA, il n'est pas possible de modifier le type d'une variable.
        Par contre il est possible de déterminer le type de variable contenue dans une variable déclarée en Variant à l'aide des fonctions VarType ou TypeName :

        Sub test(maVariable As Variant)
          
          Select Case TypeName(maVariable)
            Case "String"
              'Traitement des String
              MsgBox maVariable
            Case "Range"
              'Traitement des Range
              MsgBox maVariable.Address
          End Select
        
        End Sub

        Si nécessaire, tu peux réaffecter ensuite cette variable à une autre variable de type correspondant (par exemple pour bénéficier de l'intellisense) :

        Sub test(maVariable As Variant)
        Dim rng As Range
        
          Select Case TypeName(maVariable)
            Case "String"
              'Traitement des String
              MsgBox maVariable
            Case "Range"
              'Traitement des Range
              Set rng = maVariable
              MsgBox rng.Address
          End Select
        
        End Sub
        0
  2. Kalissi Messages postés 221 Statut Membre 20
     
    Bonjour,

    Autre possibilité qui est moins utilisé et pourtant très efficace
    est de créer des structures [ Type ].

    Ainsi, tu peux n'avoir qu'un seule variable qui contiendra, tous les
    types dont tu as besoin.


    Option Explicit

    Type TypBloc
    Cible As Range
    Valeur As String
    Limite As Double
    Compteur As Long
    Identifiant As Integer
    Val1 As Integer
    Val2 As Long
    Val3 As Double
    Val4 As Variant
    End Type

    Type TypBoite
    Bte1 As TypBloc
    Bte2 As TypBloc
    Bte3 As TypBloc
    End Type

    Sub Essai(ByRef LaVariable1 As TypBloc, ByRef LaVariable2 As TypBloc)

    Select Case LaVariable1.Val1
    Case 1
    Set LaVariable2.Cible = LaVariable1.Cible
    Case 2
    LaVariable2.Valeur = LaVariable1.Valeur
    Case 3
    ' etc...

    End Select

    End Sub


    Ainsi, tu pourras avoir tous les types nécessaires
    au déroulement des opérations à l'intérieur d'une seule
    structure (d'une seule variable).

    J'utilise beaucoup cette façon de faire avec des structures imbriquées.

    K
    0
  3. Victor Porée Messages postés 79 Statut Membre 2
     
    Merci pour les réponses !

    Je ne vous ai pas oubliés, j'ai juste mis ce problème en suspens. Je vous tiens au courant. :)

    --
    0