Bonjour,
J'ai créé une table et un formulaire dans Access 2000, pour le suivi de chantiers.
Ces 2 objets (table et formulaire) contiennent de nombreux champs, dont [RéfChantier] et [Responsables]
Le champ Mémo [Responsables], comme son nom l'indique, contient la liste des responsables du chantier : 1 à 4 personnes, suivant la taille du chantier.
Le champ [Responsables] est alimenté à partir d'une zone de liste à sélection multiple :
è l'origine source de la zone de liste est une table qui donne le nom des responsables
è la propriété « sélection multiple » de la zone de liste = étendu
è j'ai créé un bouton dans le formulaire, pour rendre visible la zone le la zone de liste uniquement lorsque j'en ai besoin, cad pour la sélection/Désélection des responsables, et l' alimentation du champ [Responsables] (ceci afin de ne pas encombrer le formulaire d'une grande zone de liste)
Voici le code qui permet d'alimenter le champ [Responsables] à partir de la zone de liste :
Private Sub zdlResponsables_AfterUpdate()
Me!Domaine = Null 'RAZ du champ avant alim
Dim i As Integer 'Compteur de ligne pour la zone de liste
For i = 0 To Me![zdlResponsables].ListCount - 1 'Nombre de lignes dans zone de liste
If Me![zdlResponsables].Selected(i) Then 'Si la ligne est sélectionnée
' On ajoute le Responsable sélectionné à [Responsables], en les séparant par un VbCrLf
Me!Responsables = Me!Responsables & Me![zdlResponsables].Column(0, i) & vbCrLf
End If
Next i
End Sub
Ce code me donne entière satisfaction.
Par contre ma méthode présente un inconvénient majeur : lorsque je veux ajouter ou supprimer un responsable à un chantier, je dois à nouveau re-sélectionner tous les responsables de ce chantier, car la zone de liste est indépendante (et il y a un risque d'erreur de sélection).
Je suis à la recherche d'une méthode qui sélectionne automatiquement les enrgts de la zone de liste, en fonction du contenu du champ [Responsables], dès l'instant où je rends visible cette zone de liste indépendante.
J'ai tenté ce code « sur clic » du bouton : il permet l'affichage ou non de la ZDL (zone de liste), puis sélectionne les enrgts de la ZDL suivant le contenu du champ [Responsables]. mais ça ne marche pas :
Private Sub btnAfficheZDL_Responsables_Click()
If Me!zdlResponsables.Visible = True Then 'si la ZDL est visible, alors elle devient invisible
Me!zdlResponsables.Visible = False
Else 'si la ZDL est invisible, elle devient visible
Me!zdlResponsables.Visible = True
Dim strResp As String 'contiendra le nom du Responsables entre 2 "VbCrLf"
Dim strTMP as String ''contiendra le caractère lu dans "me!Responsables", à l'aide de la fonction "mid"
Dim intTMP as Integer 'variable temporaire
Dim i as Integer
Dim j as Integer
If Not IsNull(Me!Responsables) Then 'Théoriquement peu probable
i = 1 'pr lire à partir du 1er caractère du me!Responsables
j = Len(Me!Responsables) 'pr lire tous les caractères jusqu'à la fin du me!Responsables
Do While i <= j
'4) on lit LE caractère (car = "1") qui est débute en position "i"
strTMP = Mid(Me!Responsables, i, 1)
'5) Si on est sur le début d'un saut de ligne (Chr(13), puis Chr(10)), alors le [Responsables] a été entièrement reconstitué, et on peut le tester avec le [Responsables] de "tblResponsabless"
If strTMP = Chr(13) Then 'Théo chaque [Responsables] de "tblMémo" doit se terminer par un saut de ligne
'6) Test si strResp existe bien dans un (et un seul) enrgt de "tblResponsabless"
intTMP = DCount("[Responsables]", "tblResponsabless", "[Responsables] = " & Chr(34) & strResp & Chr(34))
'7) Si strResp (qui est un Responsables reconstitué ds tblMémo) exite pas dans [Responsables] de "tblResponsabless" => on le sélectionne dans la zdlResponsables
If intTMP = 1 Then
'Sélection automatique du Responsables dans la zdl => NE MARCHE PAS !!!
pintMsg = 0
For pintMsg = 0 To Forms!frmMG![zdlResponsables].ListCount - 1 ' Nombre de lignes dans zone de liste
If Forms!frmMG![zdlResponsables].Column(0, pintMsg) = strResp Then ' Si la ligne est sélectionnée
Forms!frmMG![zdlResponsables].Selected(pintMsg) = True
End If
Next pintMsg
DoCmd.RepaintObject acForm, "frmMémo"
End If
strTMP = "" 'pr effectuer de nouvelles recherches de caractères ds "me!Responsables"
strResp = "" 'car nouveau Responsables à venir
i = i + 1 'pr lire le caractère suivant
Else
strResp = strResp & strTMP 'ajout de la lettre (ou de l'espace) qui vient d'être lu
End If
i = i + 1 'pr lire le caractère suivant
Loop
End If
End If
DoCmd.RepaintObject acForm, "frmMémo"
End Sub
Je vous remercie par avane pour tous les conseils que vous pourrez me communiquer.
Bien cdlt,
BBOURDIER