Bonjour tout le monde !
Tout est dans le titre : j'aimerais cocher les différentes checkbox de mon état en fonction des éléments sélectionnés d'une zone de liste à sélection multiple de mon formulaire.
Merci d'avance![]()
Bonjour tout le monde !
Tout est dans le titre : j'aimerais cocher les différentes checkbox de mon état en fonction des éléments sélectionnés d'une zone de liste à sélection multiple de mon formulaire.
Merci d'avance![]()
fait une fonction que tu peux affecter à ta checkbox en t'inspirant de ce code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Function test() As Boolean For Each chx In Liste0.ItemsSelected 'voir Forms!MonForm!MaListe test = True 'ici mettre le test sur le champ ou affectation dans une variable pour des tests ultérieurs Next chx End Function![]()
Ok, j'ai mis en application ce que tu m'as dit et je pense que c'est ok, mais je ne peux hélas pas encore tester car j'ai un problème de sélection dans ma zone de liste que je n'ai pas encore résolu
C'est décrit ici, si tu as une astuce à me donner![]()
Salut !
Vu que mon souci de ZdL est solutionné, je peux maintenant tester ta fonction
Le problème, c'est que si au moins un motif est sélectionné, toutes les cases à cocher sont cochées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Function coch() As Boolean Dim chx As Variant For Each chx In Forms![frmContratIrregulier].lstMotif.ItemsSelected 'voir Forms!MonForm!MaListe coch = True 'ici mettre le test sur le champ ou affectation dans une variable pour des tests ultérieurs Next chx End Function
Bonjour
Tes cases sont-elles indépendantes ou liées à ta source ?
Starec
Ben actuellement, elles sont indépendantes, mais je peux le changer s'il le faut ...
Je voudrais qu'elles soient cochées suivant les lignes sélectionnées dans ma zone de liste.
Tu connais un moyen ?
Dans tous les cas, merci de te pencher sur mon problème, je commençais à désespérer (d'où mes UP)![]()
Re
Une idée, passer par une table temporaire, avec les données de ta liste, et une cas à cochée à True, et mettre cette table comme source de ton état.
Starec
On ne pourrait pas envoyer en même temps que l'état en paramètre, un tableau contenant des booléens tel que vrai=sélectionné et faux=non sélectionné ?
J'ai essayé de creuser de ce côté, et j'ai pondu ce code :
Je stocke dans un tableau de booléens vrai si la ligne est cochée, et faux dans le cas contraire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Function ligCoch(num As Integer) ReDim tempo(Forms![frmContratIrregulier].lstMotif.ListCount - 1) Dim ligne As Integer Dim valeur As Variant Dim colonne As Integer Dim i As Integer ' Colonne de la zone de liste dans laquelle se situe l'information colonne = 0 ' Parcours de la zone de liste For ligne = 0 To Forms![frmContratIrregulier].lstMotif.ListCount - 1 If Forms![frmContratIrregulier].lstMotif.Selected(ligne) Then ' On stocke sa valeur dans la collection tempo tempo(ligne) = True Else tempo(ligne) = False End If Next ligne For i = 0 To UBound(tempo) MsgBox tempo(i) Next i ligCoch = tempo(num) End Function
Ensuite, quand on appelle la fonction, on donne en pérémètre le numéro de motif, et la fonction devrait retourner vrai ou faux en allant consulter la case du tableau correspondante.
Les cases à cocher de mon état ont dans la propriété Source contrôle :
1 étant le numéro du motif numéro 1=ligCoch(1)
Je veux bien un coup de main pour arriver à faire fonctionner cette fontion.
Merci d'avance![]()
Bonjour,
Pour commencer, je suppose que ton état est de type continu et que ta checkbox se trouve dans la partie continu. A partir de là, les choses sont compliquées. En effet, comme Loa Tseu l’a dit : "tu ne peux pas te fier à ce que tu vois."
Quand Starec te demandeJe pense qu'il voulait en venir au fait que c'est impossible avec un contrôle indépendant. Explication :Tes cases sont-elles indépendantes ou liées à ta source ?
Dans un état de type continu (c'est pareil pour les formulaires d'ailleurs), ce n'est parce que tu vois plusieurs checkbox qu'il en existe plusieurs. Et oui, c'est un effet d’optique. En réalité il n'en existe qu'une. C'est pour ça que si tu fais Me.chkbox.Value = True toutes les checkbox du formulaire sont cochées.
Il faut donc du coup utiliser une checkbox dépendente. La bonne question est comme faire dans ton cas. Il faut que dans ta requête source tu ajoutes un champ Vrai/Faux.
La nouvelle question est donc comme attribuer la valeur vrai pour les enregistrements sélectionnés dans ta liste box?
Et là malheureusement je ne connais pas la réponse.
Mais en bricolant un peu ça doit être possible, il faut que tu crée une fonction dans un module à part (or état, or formulaire). Cette fonction prend en entrée la clé d'un enregistrement et qui retourne Vrai ou Faux suivant si l'enregistrement est sélectionné dans ta listbox.
Houlà, va falloir sortir la caisse à outil.
Une fois que tu as ta fonction tu peux t'en servir dans une requête (Du moins c'est possible avec l'assistant de requêtes Access).
Donc là, je te souhaite bon courage, ça risque de prendre un peu de temps. Pour la création de la fonction je suis désolé mais je ne m’y connais pas trop en listbox mais pour intégrer la fonction dans ta requête je pourrai peu être t’aidé.
Cordialement
Etant philosophe, j'ai un problème pour chaque solution. [R. Zend]
Et bien justement je creusais dans ce sens là : comme je l'ai dit plus haut, j'ai fait une fonction pour cocher mes checkbox dans un module séparé.
Que penses-tu de la fonction que j'ai posté au dessus ?
Edit : Que veux-tu dire par ajouter un champ vrai/faux dans ma requête ?
Re,
C'est un peu ca mais ta fonction retourne tous les enregistrements selectionnés dans ta listbox. Ce que je te propose est d'ajouté à cette fonction une entrée. Cette entrée doit te permettre d'identifier un enregistrement spécifique. Le but est d'integré cette fonction dans une requête. Elle doit pour chaque ligne de ta requête dire s'il selectionné ou non.
Exemple :
Si tu arrives à faire une fonction de ce type qui marche, tu pourra l'ajouter dans ta requête source. Tu auras donc un champs de type Vrai/ Faux que tu pour mettre dans ton état.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Function ligCoch(ByVal Monenregistrement as string) dim Colonne as integer dim ligne as integer ' Colonne de la zone de liste dans laquelle se situe l'identifiant des enregistrement colonne = 0 ligcoch = False 'Parcours de la zone de liste For ligne = 0 To Forms![frmContratIrregulier].lstMotif.ListCount - 1 If Monenregistrement = forms![FrmContratIrregulier.lstMotif.Column(colonne,ligne) Then ligCoch = Forms![frmContratIrregulier].lstMotif.Selected(ligne) exit function end if Next ligne End Function
Cordialement
Etant philosophe, j'ai un problème pour chaque solution. [R. Zend]
Rebonjour.
J'ai réussi à faire la fonction en question (je crois) :
Et je fais appel à cette fonction dans ma requète (c'est dans le SELECT) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Function ligCoch(ByVal Monenregistrement As Integer) Dim colonne As Integer Dim ligne As Integer ' Colonne de la zone de liste dans laquelle se situe l'identifiant des enregistrement colonne = 0 'Parcours de la zone de liste For ligne = 0 To Forms![FrmContratIrregulier].lstMotif.ListCount - 1 If Monenregistrement = Forms![FrmContratIrregulier].lstMotif.Column(colonne) Then ligCoch = Forms![FrmContratIrregulier].lstMotif.Selected(ligne) Exit Function Else ligCoch = False End If Next ligne End Function
Pour ceux qui ne veulent pas chercher :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT N.NumNote, N.DateNote, C.NumContrat, Cl.NumCli, Cl.NomCli, C.DateEffetContrat, C.NatureContrat, V.NomVendeur, S.PrenomEmploye, M.LibMotif, A.NumAgence, ligCoch(M.NumMotif) AS Coch, S.TelEmploye, S.NomEmploye, A.NomAgence, N.ComNote FROM NOTES AS N, CONTRAT AS C, CLIENT AS Cl, AGENCE AS A, VENDEUR AS V, SERV_ASSU AS S, MOTIF AS M, Avoir AS Av WHERE C.NumContrat=N.NumContrat And C.NumCli=Cl.NumCli And C.NumAgence=A.NumAgence And C.NumVendeur=V.NumVendeur And N.NumEmploye=S.NumEmploye And M.NumMotif=Av.NumMotif And Av.NumNote=N.NumNote And Av.NumNote=CStr(Forms!frmContratIrregulier!lstNotes);
Et dans mon état, la propriété Source contrôle de mes checkbox contient :ligCoch(M.NumMotif)
Alors quand j'affiche mon état, rien n'est coché.reqEtat.Coch
Par contre je crois que j'approche du but car quand j'exécute la requète isolément,
seuls les enregistrements sélectionnés de ma zone de liste sont retournés
Une idée ? Une suggestion ?
![]()
Re,
J'ai peu etre une idée : dans la fonction ligCoch, remplace les lignes
Par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 If Monenregistrement = Forms![FrmContratIrregulier].lstMotif.Column(colonne) Then ligCoch = Forms![FrmContratIrregulier].lstMotif.Selected(ligne) Exit Function Else ligCoch = False End If
Cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 If Monenregistrement = Forms![FrmContratIrregulier].lstMotif.Column(colonne) Then If Forms![FrmContratIrregulier].lstMotif.Selected(ligne) then ligCoch = 1 Else ligCoch = 0 End if exit function End if
Etant philosophe, j'ai un problème pour chaque solution. [R. Zend]
Bonjour.
Je te remercie pour les corrections, mais je crois que ce ne sont pas les bonne valeurs pour True et False :
Mais même en corrigeant ça, et en mettant True et False, ça ne marche pasLorsque des valeurs de type Boolean sont converties en d'autres types de données, False devient 0 et True devient -1.
D'autre part j'avais oublié de déclarer la fonction en Public et de mettre qu'elle retournait un booléen.
J'ai fait des tests, et j'ai l'impression que le souci vient de l'indépendance des cases à cocher. En effet, quand j'exécute la requête à part, si je ne mets que M.NumMotif, ça me retourne toutes les notes dont le motif est sélectionné dans la zone de liste, donc tous les NumMotif sélectionnés.
Et quand je mets ligCoch(M.NumMotif), ça me retourne 0 pour les 4 lignes (c'est à dire Faux), d'où le fait que les cases à cocher soient toutes décochées.
Je crois qu'il y a un truc à faire sur mon état pour faire en sorte que les cases soient indépendantes ou alors leur affecter un numéro unique ?
Enfin je ne connais pas la solution
Voilà le dernière version de ma fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Public Function ligCoch(ByVal Monenregistrement As Integer) As Boolean Dim colonne As Integer Dim ligne As Integer ' Colonne de la zone de liste dans laquelle se situe l'identifiant des enregistrement colonne = 0 'Parcours de la zone de liste For ligne = 0 To Forms![FrmContratIrregulier].lstMotif.ListCount - 1 If Monenregistrement = Forms![FrmContratIrregulier].lstMotif.Column(colonne) Then If Forms![FrmContratIrregulier].lstMotif.Selected(ligne) then ligCoch = True Else ligCoch = False End If Exit Function End If Next ligne End Function
Bingo !
J'ai trouvé comment différencier les cases à cocher :
la case à cocher qui correspond au motif numéro 1 fait appel à ma fonction avec en paramètre le numéro 1, donc la propriété Source contrôle contient :
Ensuite, j'ai modifié ma fonction (qui devient ultra simple) :=ligCoch(1)
En fait, je suis parti du constat que ma requête ne me retournait que les enregistrements dont le NumMotif était sélectionné dans ma zone de liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Public Function ligCoch(ByVal NoMotif As Integer) As Boolean ' Si le numéro de motif reçu en paramètre correspond à un des enregistrements de la requète If DCount("*", "reqEtat", "M.NumMotif= " & NoMotif) > 0 Then ' On coche la case ligCoch = True Else ' Sinon on décoche la case ligCoch = False End If ' Dans les autres cas, on sort de la fonction Exit Function End Function
Ensuite, il fallait différencier les cases à cocher, donc j'ai fait en sorte que chacune renvoie un nombre qui correspond à son NumMotif.
Enfin, la fonction vérifie tout simplement que l'enregistrement existe dans les résultats de la requête et retourne vrai ou faux en fonction de ça.
Merci à tous ceux qui m'ont aidé à trouver la solution et à bientôt sur le forum
See you space cowboy![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager