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 25/07/2011, 11h25   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Par défaut Recherche multicritères avec listbox multiselection

Bonjour,

Je reviens vers vous pour savoir comment modifier mon code afin de rendre possible la recherche multicritère par une listbox à sélections multiples.

Actuellement j'utlise des checkboxes mais celà n'est pas évolutif en cas d'ajout d'un paramètres dans ma table :

Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Public Sub RefreshQuery()
 
Dim SQL As String
Dim SQLWhere As String
Dim strFct As String
 
'partie Fonction
If Me.chkFctB Then strFct = strFct & ", " & Chr(34) & "B" & Chr(34)
If Me.chkFctC Then strFct = strFct & ", " & Chr(34) & "C" & Chr(34)
If Me.chkFctCNG Then strFct = strFct & ", " & Chr(34) & "CNG" & Chr(34)
If Me.chkFctD Then strFct = strFct & ", " & Chr(34) & "D" & Chr(34)
If Me.chkFctDRM Then strFct = strFct & ", " & Chr(34) & "DRM" & Chr(34)
If Me.chkFctR Then strFct = strFct & ", " & Chr(34) & "R" & Chr(34)
If Me.chkFctRD Then strFct = strFct & ", " & Chr(34) & "RD" & Chr(34)
If Me.chkFctRDC Then strFct = strFct & ", " & Chr(34) & "RDC" & Chr(34)
 
If Len(strFct) > 0 Then
    strFct = Right(strFct, (Len(strFct) - 2))
    strFct = "(" & strFct & ")"
End If
 
'Chacune des parties précédentes construisent une chaine qui sera ajoutée à la chaine sql
 
SQL = "SELECT T_Gestion.* FROM T_Gestion WHERE T_Gestion!Id <> Null "
 
If Me.chkNumNational Then
    SQL = SQL & "And T_Gestion![N° national] like '*" & Me.txtNumNational & "*' "
End If
If Len(strFct) > 0 Then
        SQL = SQL & "And T_Gestion!Fct In " & strFct
    Else: SQL = SQL & "And T_Gestion!Fct = Null "
End If
[...]
If Me.chkAnnee Then
    SQL = SQL & "And T_Gestion![Année MES] = '" & Me.cmbRechAnnee & "' "
End If
 
SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
 
'Mise à jour de l'affichage des statistiques
Me.lblStats.Caption = DCount("*", "T_Gestion", SQLWhere) & " / " & DCount("*", "T_Gestion")
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
 
End Sub
Je cherche donc à remplacer mes checkboxes de fonctions par une zone de liste multisélection. Cette zone de liste est alimentée via une requête sur une table "Tb_Fonction":
Code :
SELECT [Tb_Fonction].[CD_Fct], [Tb_Fonction].[LB_Fct] FROM Tb_Fonction ORDER BY [CD_Fct];
Ma recherche sur le sujet n'a pas été fructueuse

Merci par avance
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 12h35   #2
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
bonjour,

tu peux trouver la solution dans le lien suivant:

http://access.developpez.com/sources...erListeRequete

Tu verras comment parcourir une zone de liste et d'extraire les lignes sélectionnées, tu pourras ainsi facilement adapter le code
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 13h39   #3
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Merci pour ta réponse

J'avais survolé trop vite ce code effectivement
Ajouter un champ "Sélection" est tout à fait faisable cependant je ne vais pas avoir qu'une seule zone de liste dans ma recherche multicritère mais 7.
Du coup ajouter 7 champs dans ma table pour mes sélections, ne me semble pas terrible
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 15h26   #4
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
bonjour,

tu vas avoir 1 zone de liste avec la possibilité de sélectionner 1 ou plusieurs champs. Ensuite tu parcoures la liste en ajoutant les champs sélectionnés.

J'ai mis un exemple de zone de liste avec sélection multiple.
Images attachées
Type de fichier : jpg Presse-papiers-1.jpg (12,2 Ko, 10 affichages)
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 15h42   #5
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Alexandre,

J'ai effectivement une listbox de ce type. Aussi, je ne sais pas si nous nous comprennons bien donc comme souvent, une image sera plus parlante
Cette image n'est pas la mienne mais montre très bien ce que je recherche:
remplacer les checkboxes de "Lieu" par exemple au profit d'une listbox multi sélection...


Le lien vers le tutoriel de yannprada:
http://www.developpez.net/forums/d10...res-amelioree/
Images attachées
Type de fichier : jpg capture.jpg (158,7 Ko, 9 affichages)
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h01   #6
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
ok

je vois un peu mieux.

Il te faut faire évidemment 1 zone de liste par champ, dans tous les cas pour le champs lieu, état, utilisation, prochain contrôle.

Le mieux serait d'avoir la requête sous-jacente de la zone de liste d'avoir l'extraction des valeurs du champs (requête avec distinct)

Ensuite dans ton code d'affichage il te faut faire quelque chose qui ressemble à cela:

Code :
Where ([Lieu] in (TFO1, TFO3..)) and ([Etat] in("etalonnage", "en service",...)) and
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h38   #7
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Ma zone de liste est remplie grâce à la requête suivante:

Code :
SELECT [Tb_Fonction].[CD_Fct], [Tb_Fonction].[LB_Fct] FROM Tb_Fonction ORDER BY [CD_Fct];
Veleur renvoyées par cette requête:
CD_Fct
B
C
CNG
D
DRM
R
RD
RDC

Voici mon programme à l'heure actuelle:

Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Public Sub RefreshQuery()
 
Dim SQL As String
Dim SQLWhere As String
Dim strFct As String
Dim VarSol As Variant
 
Dim LimiteSelection As Boolean
 
'Chacune des parties précédentes construisent une chaine qui sera ajoutée à la chaine sql
 
SQL = "SELECT T_Gestion.* FROM T_Gestion WHERE T_Gestion!Id <> Null "
 
If Me.chkNumNational Then
    SQL = SQL & "And T_Gestion![N° national] like '*" & Me.txtNumNational & "*' "
End If
If Me.chkRechFct Then
For Each VarSol In Me.cmbRechFct.ItemsSelected
        SQL = SQL & " And (T_Gestion!Fct In (" & Chr(34) & Me.cmbRechFct.ItemData(VarSol) & Chr(34)
Next VarSol
End If
If Me.chkCodeEtat Then
    SQL = SQL & ")) And T_Gestion![Code état] = " & Chr(34) & Me.cmbRechCodeEtat & Chr(34)
End If
If Me.chkConstructeur Then
    SQL = SQL & " And T_Gestion!Constr = " & Chr(34) & Me.cmbRechConstructeur & Chr(34)
End If
If Me.chkAnnee Then
    SQL = SQL & "And T_Gestion![Année MES] = '" & Me.cmbRechAnnee & "' "
End If
 
SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
 
If Tri_Group <> "" Then
    SQL = SQL & " ORDER BY " & Tri_Group & ";"
Else: SQL = SQL & ";"
End If
 
'Mise à jour de l'affichage des statistiques
Me.lblStats.Caption = DCount("*", "T_Gestion", SQLWhere) & " / " & DCount("*", "T_Gestion")
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
 
End Sub
La fonction marche partiellement:
lorsque je sélectionne une Fonction (Fct) par exemple "R" rien ne change, par contre lorsque je sélectionne un élément d'un autre champ comme "A rébuter" du champ "Code Etat", mon tableau se met à jour avec ma requête.
La multisélection me sort une erreur: ")" en trop (normal vu la tête de ma fonction If Me.chkCodeEtat )

Je sens que ça avance
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h42   #8
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
Re bonjour,

attention il ne faut pas confondre toute les listes.

D'après ce que tu m'a envoyer il y a une zone de liste pour l'affichage des donnés et tu désires filtrer ces données.

Ce que je te propose c'est de rajouter des zones de listes à sélection multiple pour l'établissement du filtre de ta zone de liste présente.

Ceci c'est pour développer ce que viens de faire.

Par contre il me semble que ton problème est très semblable au tutoriel de Caféine pour le filtrage d'un formulaire.
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h49   #9
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Merci pour ta réponse,

Effectivement il y a une zone de liste pour l'affichage des donnés et je désire filtrer ces données (avec des zones de listes multisélection).

Le tutoriel de Caféine est la source de mon programme, seulement il me faut le modifier afin de remplacer les zones de listes déroulantes (sélection multiple impossible) par des zones de listes normales qui me permettront de sélectionner plusieurs critères d'un même champ
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 15h06   #10
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Ne me faites pas croire que personne n'a utilisé la multisélection pour une recherche
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 15h34   #11
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
bonjour,

Pour changer un zone de liste déroulante en zone de liste c'est très simple.
Clique droit avec la souris et tu choisis "remplacer par" ->zone de liste.

puis dans la zone de liste tu vas la feuille de propriété de la zone de liste et tu vas sous l'onglet "autre" , sélection multiple -> étendu.

cela me paraissait basique et je n'ai pas compris que ne savait pas le faire.
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 15h47   #12
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Sisi tout celà est fait depuis un moment

Nous nous sommes effectivement mal compris. Mon code en l'état (cf tutoriel de Caféine), ne fonctionne pas avec des zones de listes à sélections multiples et c'est là qu'est mon problème
Mon code est adapté à des combobox où je faisais 1 sélection et pas 2 ou plus.

C'est cette partie de mon code qui n'est plus adaptée:

Code :
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
29
30
31
32
33
34
35
36
SQL = "SELECT T_Gestion.* FROM T_Gestion WHERE T_Gestion!Id <> Null "
 
If Me.chkNumSerie Then
    SQL = SQL & "And T_Gestion![N° de série] like '*" & Me.txtNumSerie & "*' "
End If
If Me.chkRegion Then
    SQL = SQL & "And T_Gestion![Région Commerciale] = '" & Me.cmbRechRegion & "' "
End If
If Me.chkEmplacement Then
    SQL = SQL & "And T_Gestion!Emplacement = '" & Me.cmbRechEmplacement & "' "
End If
 
If Me.chkConstructeur Then
    SQL = SQL & " And T_Gestion!Constr = " & Chr(34) & Me.cmbRechConstructeur & Chr(34)
End If
If Me.chkModele Then
    SQL = SQL & " And T_Gestion!Modèle = " & Chr(34) & Me.cmbRechModèle & Chr(34)
End If
If Me.chkAnnee Then
    SQL = SQL & "And T_Gestion![Année MES] = '" & Me.cmbRechAnnee & "' "
End If
 
SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
 
Tri_Group = ""
 
If Tri_Group <> "" Then
    SQL = SQL & " ORDER BY " & Tri_Group & ";"
Else: SQL = SQL & ";"
End If
 
'Mise à jour de l'affichage des statistiques
Me.lblStats.Caption = DCount("*", "T_Gestion", SQLWhere) & " / " & DCount("*", "T_Gestion")
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 22h19   #13
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Mon formulaire ressemble à l'image de que je poste, j'ai volontairement enlever des détails

On peut y voir ma zone de sélection multiple qui n'est pas fonctionnelle au niveau du code
Je ne sais pas du tout comment gérer le choix multiple

De même j'ai un autre soucis lorsque ma listebox de résultats est en mode sélection multiple: le double clic pour l'édition d'un enregistrement ne fonctionne pas (erreur) mais ça sera le sujet d'un nouveau poste
Images attachées
Type de fichier : png Capture.PNG (48,8 Ko, 6 affichages)
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 10h17   #14
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
voila,

En fait tu dois parcourir ta zone de liste du début à la fin et prendre seulement ceux qui sont sélectionnés

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim i As Integer
Dim LstRech As String
LstRech = ""
With Maliste
 For i = 0 To .ListCount - 1
  If .Selected(i) Then
    'si MeLst du texte
    LstRech = LstRech & Chr(34) & Me.Maliste & Chr(34) & ";"
    'Si Melst des chiffres
    LstRech = LstRech & Me.Maliste & ";"
  End If
 Next i
End With
 
LstRech = Mid(LstRech, 1, Len(LstRech) - 1)
LstRech = "[MonChamp] in (" & LstRech & ")"
Je vais essayer de commenter.

Pour la sélection des éléments de la zone de liste tu dois mettre une close du type:

Code :
Where Monchamp in( Valeur1; Valeur2; Valeur 3....)
car si tu as plusieurs valeur sélectionnées c'est plus court que

Code :
 Monchamp = valeur1 and monchamp = valeur2 ...
Cependant si c'est une valeur de texte il te faut mettre des "" et si c'est un nombre ce n'est pas nécessaire.

Le code que je t'ai mis va créer un string qui ressemble à:

Code :
 [Monchamp in( Valeur1; Valeur2; Valeur 3....)
comme tu as plusieurs critères à toi de voir ou tu mets le AND

Maintenant si tu as plusieurs zone de liste tu peux très bien te créer une fonction qui va faire le boulot et tu l'appelles pour chaque zone de liste ce qui peux grandement simplifier ton code.

J'espère que cela va t'aider
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/07/2011, 13h17   #15
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Merci pour ton poste, je sens que je suis proche de mon but !

Mon programme est un blagueur
Le code suivant me renvoie une erreur dès que je coche la checkbox se trouvant à côté de l'étiquette "Fonction". Cette checkbox comme les autres sur mon formulaire fait apparaitre ma liste de choix de fonctions (B, C , CNG,...).
Erreur: Erreur d'exécution '3075':
) en trop dans l'expression "T_Gestion!Id <> Null And)"

Je ne pense pas que l'erreur soit vraiment dûe à une parenthèse mal ouverte ou fermée. Je n'en ai pas vu...
Parc contre j'ai un doute bien plus important sur la place de mon "And"


Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Dim SQL As String
Dim SQLWhere As String
Dim strFct As String
Dim VarSol As Variant
 
Dim i As Integer
 
Dim LimiteSelection As Boolean
 
'Chacune des parties précédentes construisent une chaine qui sera ajoutée à la chaine sql
SQL = "SELECT T_Gestion.* FROM T_Gestion WHERE T_Gestion!Id <> Null "
 
If Me.chkNumNational Then
    'Like "*valeur*": critères de recherches non exacts
    SQL = SQL & "And T_Gestion![N° national] like '*" & Me.txtNumNational & "*' "
End If
If Me.chkNumSerie Then
    'Like "*valeur*": critères de recherches non exacts
    SQL = SQL & "And T_Gestion![N° de série] like '*" & Me.txtNumSerie & "*' "
End If
 
If Me.chkRechFct Then
SQL = SQL & "And "
With cmbRechFct
    For i = 0 To .ListCount - 1
        If .Selected(i) Then
            'si MeLst est du texte
            SQL = SQL & Chr(34) & Me.cmbRechFct & Chr(34) & ";"
            'Si Melst est des chiffres
            'SQL = SQL & Me.cmbRechFct & ";"
        End If
    Next i
End With
SQL = Mid(SQL, 1, Len(SQL) - 1)
SQL = "T_Gestion!Fct in (" & SQL & ")"
 
End If
If Me.chkCodeEtat Then
    SQL = SQL & " And T_Gestion![Code état] = " & Chr(34) & Me.cmbRechCodeEtat & Chr(34)
End If
If Me.chkAnnee Then
    SQL = SQL & "And T_Gestion![Année MES] = '" & Me.cmbRechAnnee & "' "
End If
 
SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
 
'Le tri
Tri_Group = ""
 
'Même principe que pour les chaines de sélection multiple
If Me.TriNoSerie Then
    Tri_Group = Tri_Group & ", T_Gestion![N° de série]"
End If
If Me.TriNoNational Then
    Tri_Group = Tri_Group & ", T_Gestion![N° national]"
End If
 
'_____________________Fin du tri
 
If Tri_Group <> "" Then
    SQL = SQL & " ORDER BY " & Tri_Group & ";"
Else: SQL = SQL & ";"
End If
 
'Mise à jour de l'affichage des statistiques
Me.lblStats.Caption = DCount("*", "T_Gestion", SQLWhere) & " / " & DCount("*", "T_Gestion")
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 17h20   #16
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
Ce n'est pas encore cela. Il te faut une String "aide" pour créer le in...

Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Dim SQL As String
Dim SQLWhere As String
Dim strFct As String
Dim VarSol As Variant
Dim StrCmb as string
 
Dim i As Integer
 
Dim LimiteSelection As Boolean
 
'Chacune des parties précédentes construisent une chaine qui sera ajoutée à la chaine sql
SQL = "SELECT T_Gestion.* FROM T_Gestion WHERE T_Gestion!Id <> Null "
 
If Me.chkNumNational Then
    'Like "*valeur*": critères de recherches non exacts
    SQL = SQL & "And T_Gestion![N° national] like '*" & Me.txtNumNational & "*' "
End If
If Me.chkNumSerie Then
    'Like "*valeur*": critères de recherches non exacts
    SQL = SQL & "And T_Gestion![N° de série] like '*" & Me.txtNumSerie & "*' "
End If
 
If Me.chkRechFct Then
StrCmb = ""
With cmbRechFct
    For i = 0 To .ListCount - 1
        If .Selected(i) Then
            'si MeLst est du texte
            StrCmb = StrCmb & Chr(34) & Me.cmbRechFct & Chr(34) & ";"
            'Si Melst est des chiffres
            'StrCmb = StrCmb & Me.cmbRechFct & ";"
        End If
    Next i
End With
' s'il n'y a pas de fonction sélectionnée on passe
if StrCmb <>"" then
StrCmb = Mid(StrCmb , 1, Len(StrCmb ) - 1)
SQL = SQL & "AND T_Gestion!Fct in (" & StrCmb & ")"
 End if
End If
If Me.chkCodeEtat Then
    SQL = SQL & " And T_Gestion![Code état] = " & Chr(34) & Me.cmbRechCodeEtat & Chr(34)
End If
If Me.chkAnnee Then
    SQL = SQL & "And T_Gestion![Année MES] = '" & Me.cmbRechAnnee & "' "
End If
 
SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
 
'Le tri
Tri_Group = ""
 
'Même principe que pour les chaines de sélection multiple
If Me.TriNoSerie Then
    Tri_Group = Tri_Group & ", T_Gestion![N° de série]"
End If
If Me.TriNoNational Then
    Tri_Group = Tri_Group & ", T_Gestion![N° national]"
End If
 
'_____________________Fin du tri
 
If Tri_Group <> "" Then
    SQL = SQL & " ORDER BY " & Tri_Group & ";"
Else: SQL = SQL & ";"
End If
 
'Mise à jour de l'affichage des statistiques
Me.lblStats.Caption = DCount("*", "T_Gestion", SQLWhere) & " / " & DCount("*", "T_Gestion")
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
Un petit conseil.

Dans ce genre de code pour vérifier la validité du SQL un petit test du genre:

te permettra de trouver facilement les erreurs.

Autre conseil n'utilise pas SQL comme nom de variale, c'est un mot réservé utilise plutôt StrSQL

bonne chance
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 08h42   #17
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Merci Alexandre

Pour le code mais aussi pour la vérification de mon code SQL avec msgbox et pour le nom de variable!
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 09h50   #18
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Il ne me reste plus qu'à résoudre un renvoie nul:

En affichant un MsgBox StrSQL dans le code suivant:

Code :
1
2
3
4
5
If StrCmb <> "" Then
    StrCmb = Mid(StrCmb, 1, Len(StrCmb) - 1)
    StrSQL = StrSQL & "AND T_Gestion!Fct in (" & StrCmb & ")"
    MsgBox StrSQL
End If
J'ai droit à ce genre de message lorsque je fais 2 choix

Code :
"AND T_Gestion!Fct in ("";"")"
A la ligne suivante en mode débug

En survolant avec ma souris, il est affiché cmbRechFct = Null

me renvoie .ListCount - 1 = < Variable objet ou variable de bloc With non définie >

.Selected(i) me renvoie la même chose

Je vais y arriver
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 18h32   #19
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
Bonjour,,

c'est déjà très bien parti,

j'ai fait une erreur:

Code :
1
2
3
4
5
6
7
8
9
10
With cmbRechFct
    For i = 0 To .ListCount - 1
        If .Selected(i) Then
            'si MeLst est du texte
            StrCmb = StrCmb & Chr(34) & ..Column(0, i) & Chr(34) & ";"
            'Si Melst est des chiffres
            'StrCmb = StrCmb & ..Column(0, i) & ";"
        End If
    Next i
End With
l'erreur est à la ligne 5, mille excuses:
c'est
d'autre part si tu as plusieurs zone de liste. Je pense qu'il serait préférable de créer une fonction pour ne pas répéter du code inutilement

à tester dans ton application

1° création de la fonction si possible dans un module

Code :
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
Public Function FctCmbSelection(CmbRech As ListBox, ColRech As Long, ValRech As Long) As String
'fonction recherche les valeurs sélectionnée dans une zone de liste
'crée un string val1; Val2; Val3....
 
Dim i As Long, StrCmb As String
StrCmb = ""
With CmbRech
    For i = 0 To .ListCount - 1
        If .Selected(i) Then
            Select Case ValRech
            Case 1 'si MeLst est du texte
                StrCmb = StrCmb & Chr(34) & .Column(ColRech, i) & Chr(34) & ";"
            Case 2 'Si Melst est des chiffres
                StrCmb = StrCmb & .Column(ColRech, i) & ";"
            End Select
        End If
    Next i
End With
' s'il n'y a pas de sélection dans la liste sélectionnée on passe
If StrCmb <> "" Then
    FctCmbSelection = ""
Else
    FctCmbSelection = Mid(StrCmb, 1, Len(StrCmb) - 1)
End If
 
End Function
Puis tu peux appeler la fonction pour la recherche des lignes sélectionnées, ceci pratiquement le même code pour chaque zone deliste

Code :
1
2
3
4
5
6
7
8
If Me.chkRechFct Then
    ' recherche des valeurs sélectionnées
    StrCmb = FctCmbSelection(Me.cmbRechFct, 0, 1)
 
    If StrCmb <> "" Then
        SQL = SQL & "AND T_Gestion!Fct in (" & StrCmb & ")"
    End If
End If

bonne chance, je suis une semaine en vacances sans ordi à bientôt et bon courage
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 18h33   #20
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
Attention c'est seulement

pas ..!!!!
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h58.


 
 
 
 
Partenaires

Hébergement Web