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

Fermé
Victor Porée Messages postés 75 Date d'inscription mardi 11 juin 2013 Statut Membre Dernière intervention 30 mai 2017 - 24 avril 2017 à 20:39
Victor Porée Messages postés 75 Date d'inscription mardi 11 juin 2013 Statut Membre Dernière intervention 30 mai 2017 - 24 mai 2017 à 17:22
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.
A voir également:

3 réponses

Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 20
24 avril 2017 à 20:56
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
Victor Porée Messages postés 75 Date d'inscription mardi 11 juin 2013 Statut Membre Dernière intervention 30 mai 2017 2
25 avril 2017 à 12:06
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776 > Victor Porée Messages postés 75 Date d'inscription mardi 11 juin 2013 Statut Membre Dernière intervention 30 mai 2017
25 avril 2017 à 12:44
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
Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 20
25 avril 2017 à 13:35
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
Victor Porée Messages postés 75 Date d'inscription mardi 11 juin 2013 Statut Membre Dernière intervention 30 mai 2017 2
24 mai 2017 à 17:22
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