Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2011, 16h49   #1
Membre éclairé
 
Avatar de timoth
 
Inscription : octobre 2005
Messages : 471
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2005
Messages : 471
Points : 369
Points : 369
Par défaut Valeur d'un paramètre désigné par une valeur

Bonjour à toutes et tous !

Petit pb propre à l'utilisation de VBA:

Dans une fonction ayant 3 paramètres (Param1, Param2, Param3)
J'ai une boucle qui fait des traitements et qui a parfois besoin de Param1, Param2 ou Param3. C'est la valeur ValX qui me le détermine (égale à "Param1", "Param2" ou "Param3" selon les besoins).

Comment utiliser ValX pour qu'elle me sorte la valeur des paramètres et non leur nom (dont je me fous) ??

J'ai utilisé la fonction Eval() sans succès. Une autre idée ?
Bien à vous,
__________________
puis et puis et encore . Sinon sans oublier et
timoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 18h14   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Ta boucle est à l'extérieur de ta fonction oU à l'intérieur ?

Peut-être ceci t'aidera

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select case ValeurX
   case "Param1"
      'Faire quelque chose
 
   case "Param2"
      'Faire autre chose
 
   case "Param3"
      'Faire quelque encore chose
 
   case else
      error(5)
 
end select
Sinon je pense que ce serait bien si tu postais ton code. Ça aide à fixer les idées.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 11h54   #3
Membre éclairé
 
Avatar de timoth
 
Inscription : octobre 2005
Messages : 471
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2005
Messages : 471
Points : 369
Points : 369
Hello ! Merci marot_r

Ma boucle est dans ma fonction. Mon problème n'est pas très critique mais c'est déja la deuxième fois que je ressens ce genre de besoin. Je m'en tire effectivement toujours avec un SELECT CASE.
Mais dans certain cas, ça peut être fastidieux.

Mon code est un peu complexe tel qu'il est et j'ai peur que vous ne passiez un temps inutile à le comprende. J'en poste un qui correspond à mon besoin:

Code :
1
2
3
4
5
6
7
Param1 = "A"
Param2 = "B"
Param3 = "C"
 
ValX = "Param1"
 
MsgBox FonctionX(ValX)
J'aimerais trouver une fonction qui me donnera ici la valeur "A". Eval me donne une erreur 2482 'Access can't find the name 'Param1' you entered in the expression'

Bien à vous !
__________________
puis et puis et encore . Sinon sans oublier et
timoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 12h39   #4
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Bonjour.

Selon moi il faut remplacer :

Code :
1
2
3
 
 
ValX = "Param1"
par

Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 13h22   #5
Membre éclairé
 
Avatar de timoth
 
Inscription : octobre 2005
Messages : 471
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2005
Messages : 471
Points : 369
Points : 369
Merci jj4822,

dans ma fonction, ValX est une valeur d'un champ dans un jeu de données. Je lis ce jeu de données qui m'indique quelle valeur prendre (Param1, Param2, Param3)

Code :
1
2
3
4
5
6
7
Param1 = "A"
Param2 = "B"
Param3 = "C"
 
ValX = rec.Fields("MonParametre")
 
MsgBox FonctionX(ValX)
donc, si dans mon jeu de données, il est écrit "Param1", msgbox valX va me retourner "Param1" alors que c'est "A" que je voudrais.
__________________
puis et puis et encore . Sinon sans oublier et
timoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 14h07   #6
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Si l'on met Param1 entre guillemet, VBA considere que la valeur est egale au texte Param1 et non a la valeur de la variable Param1.

A chaque fois que j'utilise une variable je fais de la maniere suivante :

Code :
1
2
3
4
5
6
 
 
dim Param1 as string 'string par exemple
Param1 ="A"
 
ValX = Param1
Dans le cas present, sauf erreur de ma part :

Code :
1
2
3
 
 
ValX = rec.Fields(param1) 'devrait considerer qu'il doit aller chercher le champ A
Maintenant, ne connaissant pas le detail du programme je ne sais pas si je repond bien a la question.

Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 15h04   #7
Membre éclairé
 
Avatar de timoth
 
Inscription : octobre 2005
Messages : 471
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2005
Messages : 471
Points : 369
Points : 369
Non. En étant plus clair :
Code :
1
2
3
4
5
6
7
8
Param1 = "A"
Param2 = "B"
Param3 = "C"
 
ValX = rec.Fields("MonParametre")
'Ici ValX aura la valeur du nom du paramètre à utiliser "Param1", "Param2" ou "Param3"
 
MsgBox FonctionX(ValX)
Donc je cherche un fonctionX qui lise "Param1" et qui comprenne qu'il faut aller chercher la valeur derrière Param1.

Est-ce plus clair ??
__________________
puis et puis et encore . Sinon sans oublier et
timoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 15h37   #8
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Que penses-tu de

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
public function GetParam1() as variant
   GetParam1=valeur de param1
end function
 
public function GetParam2() as variant
   GetParam2=valeur de param2
end function
 
public function GetParam3() as variant
   GetParam3=valeur de param3
end function
dans l'appel

Code :
Tavaleur=eval("get" & valX & "()")
comme cela tu va évaluer la fonction GetParam1, getParam2 ou getParam3 selon la valeur de ValX.

Je ne suis pas sur que cela simplifie vraiment ton code car c'est un select case déguisé mais cela devrait marcher.

Note que tu perds aussi tous contrôles à la compilation sur le type de tes données et que tu te retrouves à manipuler des variables globales ce qui est toujours à faire avec précaution.

Il me semble d'ailleurs que si tu veux appeler des fonction il y a d'autres mécanismes que le Eval().

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 15h57   #9
Membre éclairé
 
Avatar de timoth
 
Inscription : octobre 2005
Messages : 471
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2005
Messages : 471
Points : 369
Points : 369
Oui, ça marcherait mais comme tu dis, ça ne simplifiera pas mon code et ça revient en même qu'un Select Case.

Merci de ta réponse en tout cas !
__________________
puis et puis et encore . Sinon sans oublier et
timoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 18h29   #10
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Bonsoir.

Pour eviter les case ou autre, pourquoi ne pas :

1) 1 1ere table deja existante contenant le champ "MonParametre"
2) 1 2eme table contenant deux champs. Le 1er champ "parametre" contient les valeurs param1, param2 etc, le 2eme champ "Valeur" contient les valeurs correspondantes ("A", "B" etc).
3) 1 requete rapprochant les deux tables et faisant ressortir la valeur correspondante au Parametre choisi. Si la 1ere table contient "param1" alors la requete fait apparaitre "A".

Dans le module, on recupere la valeur de la requete (ici "A").

Il suffit ensuite de rapprocher ValX de la valeur recuperee dans la requete.
Valx est donc alors egale a "A" dans l'exemple et non plus a "param1".

Avantage supplementaire : si je dois rajouter un param4, il suffit de mettre a jour la 2eme table. Idem si la valeur de Param1 (ou param2 etc) change.


J'espere avoir apporte une reponse satisfaisante.

Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2011, 19h16   #11
Membre Expert
 
Avatar de keita
 
Homme
Inscription : novembre 2002
Messages : 879
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Côte d'Ivoire

Informations forums :
Inscription : novembre 2002
Messages : 879
Points : 1 015
Points : 1 015
Envoyer un message via MSN à keita
bonjour
Faisons comme ceci pour voir:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Commande459_Click()
    Dim Param1 As String, Param2 As String, Param3 As String
    Param1 = "A"
    Param2 = "B"
    Param3 = "C"
 
    ValX = rec.Fields("MonParametre")
 
    MsgBox Essai(ValX)
 
 
End Sub
Function Essai(vVal As String) As String
 
    Essai = vVal
 
End Function
c'est compris que Commande459 est un bouton que j'ai créé sur un form pour mon essai.
@+
keita est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 19h39   #12
Membre Expert
 
Femme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 480
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Ain (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 480
Points : 1 024
Points : 1 024
Bonjour,
Le type de variable Collection peut faire l'affaire :
Code :
1
2
3
4
5
6
7
8
9
Dim colParam As New Collection
 
colParam.Add Param1, "Param1"
colParam.Add Param2, "Param2"
colParam.Add Param3, "Param3"
...
ValX = rec.Fields("MonParametre")
MsgBox colParam(ValX)
...
tedo01 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 11h53   #13
Membre éclairé
 
Avatar de timoth
 
Inscription : octobre 2005
Messages : 471
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : octobre 2005
Messages : 471
Points : 369
Points : 369
Keita,
Ta fonction Essai ne fait que renvoyer la valeur que tu lui as donné en paramètre. donc si ValX= "Param1", il va me ressortir exactement "Param1".

JJ4822, Ted001
Vos deux solutions se ressemblent, l'un avec une table l'autre une collection.
C'est effectivement une bonne approche, mais qui implique avant d'executer le code de ma fonction de remplir la table ou la collection des paramètres.
J'aurais peut être la préférence pour une collection qui est facile à créer et facile à manipuler.

J'aurais simplement cru qu'il existait dans VBA une fonction toute faite qui permettait d'interpréter une chaine de caractère comme une valeur. Mais ça n'est peut être pas possible.

Je clos le sujet, merci à JJ4822 et Ted001 pour leurs meilleures réponses et merci à vous tous!!
__________________
puis et puis et encore . Sinon sans oublier et
timoth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h03   #14
Membre Expert
 
Avatar de keita
 
Homme
Inscription : novembre 2002
Messages : 879
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Côte d'Ivoire

Informations forums :
Inscription : novembre 2002
Messages : 879
Points : 1 015
Points : 1 015
Envoyer un message via MSN à keita
bonjour
Citation:
Ta fonction Essai ne fait que renvoyer la valeur que tu lui as donné en paramètre. donc si ValX= "Param1", il va me ressortir exactement "Param1".
Cela dépend de ce que retourne rec.Fields("MonParametre"); à mon sens il retourne Param1 et non "Param1"; et donc la fonction Essai a comme argument Param1 et non "Param1". Sinon Essai(Param1) renvoie bien A comme valeur.

@+
keita est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h14.


 
 
 
 
Partenaires

Hébergement Web