Remplacer plusieurs procédure par une seule dans un module

Remplacer plusieurs procédure par une seule dans un module - VB/VBA/VBS - Programmation

Marsh Posté le 20-02-2008 à 11:31:56    

Bonjour,
 
J'ai plusieurs procédure sur plusieurs formulaires Access qui sont les mêmes.
Et je voudrais mettre la procédure dans un module et l'appeler à chaque fois que j'en ai besoin.
 
Voilà la procédure d'un formulaire que je veux mettre dans un module :
 

Code :
  1. Private Sub ld_nom_AfterUpdate()
  2.     Dim rs As Object
  3.     Set rs = Me.Recordset.Clone
  4.     rs.FindFirst "[code_contact] = " & Str(Nz(Me![ld_nom], 0))
  5.     Me.Détail.Visible = True
  6.     If Not rs.EOF Then
  7.     Me.Bookmark = rs.Bookmark
  8.     End If
  9. End Sub


 
Code_contact est le champ d'une table et ld_nom une liste déroulante du formulaire.
Ces deux là change à chaque fois que la procédure doit être appelée.
 
Comment dois-je écrire ma procédure dans mon module afin qu'elle puisse etre utilisé à chaque fois ?
Comment dois-je l'appeler par la suite ?
 
Je vous remercie par avance.
 
4rocky4


---------------
- Un con qui marche ira plus loin qu'un intellectuel assis -
Reply

Marsh Posté le 20-02-2008 à 11:31:56   

Reply

Marsh Posté le 20-02-2008 à 17:30:11    

Ta procédure devra contenir plusieurs paramètres :
-Le nom du champ à tester (Code_contact dans ton exemple)
-La valeur à comparer au contenu du champ (renvoyée par ld_nom ou autre)
-Le recordset qui permet de faire la recherche (rs)

 

Avec ces paramètres, ta procédure peut travailler (à moins que j'ai loupé un truc)
Il te suffit alors de copier les instructions actuelles en les adaptant avec les noms de paramètres que tu vas déclarer.

 

Sub ProcDe4rocky4(sNomChamp As String, sValeur As String, rs As Object)

 

Attention, sValeur est de type String ! Mais quand tu fais un .FindFirst, fais gaffe à rajouter ou pas les quotes autour de ta valeur suivant si sValeur est censé contenir du texte ou un nombre.

 

Tu appelles cette procédure par :
ProcDe4rocky4 "code_contact", Str(Nz(Me![ld_nom], 0)), rs


Message édité par tegu le 20-02-2008 à 17:31:57
Reply

Marsh Posté le 21-02-2008 à 09:11:07    

merci pour ta réponse.
 
Alors j'ai fait comme ceci dans mon module:
 

Code :
  1. Public Sub liste_recherche(frm As Form, champ As String, liste As String)
  2.     ' Rechercher l'enregistrement correspondant au contrôle.
  3.     Dim rs As Object
  4.     Set rs = frm.Recordset.Clone
  5.     'Champ et liste par concaténation, car ce sont des variables
  6.     rs.FindFirst "[" & champ & "] = " & Str(Nz(frm![" & liste & "], 0))
  7.     'on affiche la partie détail
  8.     frm.Détail.Visible = True
  9.     'si le nom saisie n'existe pas
  10.     If Not rs.EOF Then
  11.     frm.Bookmark = rs.Bookmark
  12.     End If
  13. End Sub


 
 
Et j'appel la procédure dans le formulaire :
 

Code :
  1. Call liste_recherche(Me, "code_ce", Str(Nz(Me![ld_recherche], 0)))


 
Je n'ai pas mis "rs" car cela ne marchait pas.
 
Lorsque j'exécute le formulaire appelant la procédure, j'obtiens ce message d'erreur :
 
erreur d'exécution '2465':
impossible de trouver le champ "&liste&" auquel il fait référence dans votre expression.

 
 :pfff:


---------------
- Un con qui marche ira plus loin qu'un intellectuel assis -
Reply

Marsh Posté le 21-02-2008 à 10:38:24    

Ton problème est lié à ta formule « Str(Nz(frm![" & liste & "], 0)) » dont tu n'as pas besoin si tu la passes déjà en paramètre
 
La ligne
rs.FindFirst "[" & champ & "] = " & Str(Nz(frm![" & liste & "], 0))
devient
rs.FindFirst "[" & champ & "] = " & liste
 

Reply

Marsh Posté le 21-02-2008 à 14:00:06    

J'ai fait comme ça
 
rs.FindFirst "[" & champ & "] = " & Str(Nz(frm(liste), 0))
 
Et ca marche :)
 
Merci bien :)


---------------
- Un con qui marche ira plus loin qu'un intellectuel assis -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed