Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 18/09/2011, 17h01   #1
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Par défaut Combinaison de cases à cocher dans un formulaire

Bonjour,

J'ai créé un formulaire en m'aidant du tuto RechercheMultiCritères.

J'ai 12 cases à cocher (1 par mois). Je voudrai afficher les enregistrements en fonction de(s) case(s) cochée(s). Il se peut que l'utilisateur ne coche que Janvier mais il peut aussi cocher Janvier + Février + Mars. Il doit pouvoir cocher tous les mois qu'il souhaite, sans forcément les cocher d'affilé (par exemple, Janvier + Mars + Juin). Bref, je me demande comment faire car avec 3 cases à cocher, ça me fait déjà beaucoup de combinaisons, alors avec 12... Y a t-il un moyen plus simple ?

Je vous mets le code que j'ai utilisé pour une autre variable, code que je pensais adapter pour mes 12 cases à cocher.

Merci pour votre aide.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
 SQL = "SELECT IdExterne FROM MyTable Where IdExterne <> """" And year(date)=2011 "
 
 If Me.ChkType1.Value = -1 And Me.ChkType2.Value = -1 And Me.ChkType3.Value = -1 Then
        SQL = SQL & "And (Type=1001 or Type=1002 or Type=1003)"
 ElseIf Me.ChkType1.Value = -1 And Me.ChkType2.Value = -1 And Me.ChkType3.Value = 0 Then
        SQL = SQL & "And (Type=1001 or Type=1002)"
 ElseIf Me.ChkType1.Value = -1 And Me.ChkType2.Value = 0 And Me.ChkType3.Value = -1 Then
        SQL = SQL & "And (Type=1001 or Type=1003)"
 ElseIf Me.ChkType1.Value = 0 And Me.ChkType2.Value = -1 And Me.ChkType3.Value = -1 Then
        SQL = SQL & "And (Type=1002 or Type=1003)"
 ElseIf Me.ChkType1.Value = -1 And Me.ChkType2.Value = 0 And Me.ChkType3.Value = 0 Then
        SQL = SQL & "And Type=1001"
 ElseIf Me.ChkType1.Value = 0 And Me.ChkType2.Value = -1 And Me.ChkType3.Value = 0 Then
        SQL = SQL & "And Type=1002"
 ElseIf Me.ChkType1.Value = 0 And Me.ChkType2.Value = 0 And Me.ChkType3.Value = -1 Then
        SQL = SQL & "And Type=1003"
 ElseIf Me.ChkType1.Value = 0 And Me.ChkType2.Value = 0 And Me.ChkType3.Value = 0 Then
        SQL = SQL & "And Type!=1001 And Type!=1002 And Type!=1003"
 End If
debdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 19h15   #2
Membre actif
 
Homme Dominique
Gestion parc machine, assistance informatique, développement Access, Excel...
Inscription : février 2007
Messages : 130
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 56
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Gestion parc machine, assistance informatique, développement Access, Excel...
Secteur : Service public

Informations forums :
Inscription : février 2007
Messages : 130
Points : 161
Points : 161
Bonsoir.
Je te propose ce type de code dans lequel tu testes individuellement chaque case à cocher
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
  Dim blnPremier As Boolean 'Détection de la première case cochée
 
  blnPremier = True
 
  SQL = "SELECT IdExterne FROM MyTable Where IdExterne <> """" And year(date)=2011 "
 
  'Si Janvier est coché
  If Me.ChkType1.Value = True Then
      SQL = SQL & "And Type=1001"
      blnPremier = False
  End If
 
 'Si février est coché
 If Me.ChkType2.Value = True Then
  If blnPremier Then
    SQL = SQL & "And Type=1002"
    blnPremier = False
  Else
    SQL = SQL & "Or Type=1002"
  End If
 End If
 
 'Si mars est coché.....
 
 '.....
 
 'Si décembre est coché
 If Me.ChkType12.Value = True Then
  If blnPremier Then
    SQL = SQL & "And Type=1012"
    blnPremier = False
  Else
    SQL = SQL & "Or Type=1012"
  End If
 End If
Cordialement, Dominique
PapouDomi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 19h23   #3
Membre confirmé
 
Avatar de lelensois16
 
Homme Romain M.
Étudiant
Inscription : avril 2009
Messages : 167
Détails du profil
Informations personnelles :
Nom : Homme Romain M.
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 167
Points : 204
Points : 204
Bonjour,

Voici quelques petits conseils

1 - Lis ce tuto.

2 - Privilégies les
Code :
1
2
3
4
5
6
Select Case Valeur 
Case 1 
Msgbox "Résultat1"
Case 2
Msgbox "Résultat2"
End select
3-
Utilises des requêtes imbriquées ! exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
'm_SQL étant une variable globale à initialiser à chaque chargement de formulaire
Public Sub Form_load()
m_SQL = "SELECT IdExterne FROM MyTable Where IdExterne <> """" And year(date)=2011  And  ( VALUE ) "
i = 0 
'i permet de compter le nombre de clauses , si i = 0 , pas de clause OR 
'J'ai laissé un AND supplémentaire car je suppose qu'il y a au moins 1 case selectionnée ? 
End Sub 
 
Public Sub ChoixCase( Case As Control , SQL As String)
Select Case Forms(NomFormulaire).Controls(Control.Name).Value
Case -1 
if i = 0 Then 
m_SQL = REPLACE(m_SQL,VALUE, SQL )
Else
m_SQL = REPLACE(m_SQL,VALUE, SQL & " Or VALUE" )
End If 
i = 1 
End Select 
End Sub 
 
'Et à la fin tu supprimes le mot VALUE
J'espère avoir été clair

RM
lelensois16 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/09/2011, 20h12   #4
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Merci pour votre aide à tous les 2 !

Je vais tester vos codes et je reviendrai vers vous pour vous tenir au courant.

Bonne soirée
debdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 08h47   #5
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Bonjour,

Je reviens vers vous après avoir testé le code.

@lelensois16: je dois t'avouer que je n'ai pas tout compris le code

@PapouDomi: j'ai appliqué ton code en le modifiant quelque peu à cause des parenthèses des "or" et ça fonctionne très bien . Mon code au final n'est peut être pas super propre mais il marche

Merci bcp !
Bonne journé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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
 SQL = "SELECT IdInterne, Date FROM MyTable Where year(date)=2011 "
 
 Dim blnPremierMois As Boolean 'Détection de la première case cochée
 blnPremierMois = True
 
 If Me.ChkMois1.Value = True Or _
    Me.ChkMois2.Value = True Or _
    Me.ChkMois3.Value = True Or _
    Me.ChkMois4.Value = True Or _
    Me.ChkMois5.Value = True Or _
    Me.ChkMois6.Value = True Or _
    Me.ChkMois7.Value = True Or _
    Me.ChkMois8.Value = True Or _
    Me.ChkMois9.Value = True Or _
    Me.ChkMois10.Value = True Or _
    Me.ChkMois11.Value = True Or _
    Me.ChkMois12.Value = True Then
        SQL = SQL & " and ("
        'Mois1
        If Me.ChkMois1.Value = True Then
         SQL = SQL & " month(date)=1 "
         blnPremierMois = False
        End If
         'Mois2
        If Me.ChkMois2.Value = True Then
             If blnPremierMois Then
               SQL = SQL & " month(date)=2 "
               blnPremierMois = False
             Else
               SQL = SQL & "Or month(date)=2 "
             End If
        End If
		'...
        If Me.ChkMois12.Value = True Then
             If blnPremierMois Then
               SQL = SQL & " month(date)=12 "
               blnPremierMois = False
             Else
               SQL = SQL & "Or month(date)=12 "
             End If
        End If
 End If
 
 If Me.ChkMois1.Value = False And _
    Me.ChkMois2.Value = False And _
    Me.ChkMois3.Value = False And _
    Me.ChkMois4.Value = False And _
    Me.ChkMois5.Value = False And _
    Me.ChkMois6.Value = False And _
    Me.ChkMois7.Value = False And _
    Me.ChkMois8.Value = False And _
    Me.ChkMois9.Value = False And _
    Me.ChkMois10.Value = False And _
    Me.ChkMois11.Value = False And _
    Me.ChkMois12.Value = False Then
        SQL = SQL
 Else
       SQL = SQL & ")"
 End If
debdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 21h12   #6
Membre actif
 
Homme Dominique
Gestion parc machine, assistance informatique, développement Access, Excel...
Inscription : février 2007
Messages : 130
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 56
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Gestion parc machine, assistance informatique, développement Access, Excel...
Secteur : Service public

Informations forums :
Inscription : février 2007
Messages : 130
Points : 161
Points : 161
Bonsoir.
Tu dois pouvoir simplifier ton code, par exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
If Not(Me.ChkMois1.Value = False And _
    Me.ChkMois2.Value = False And _
    Me.ChkMois3.Value = False And _
    Me.ChkMois4.Value = False And _
    Me.ChkMois5.Value = False And _
    Me.ChkMois6.Value = False And _
    Me.ChkMois7.Value = False And _
    Me.ChkMois8.Value = False And _
    Me.ChkMois9.Value = False And _
    Me.ChkMois10.Value = False And _
    Me.ChkMois11.Value = False And _
    Me.ChkMois12.Value = False) Then
       SQL = SQL & ")"
 End If
Crée aussi une procédure qui te modifie le texte de la requête genre
Code :
1
2
3
4
5
6
7
8
9
10
Sub MajSql (Byval intMois as integer, byval strDate as string, byval ChkMois as boolean, Byref blnPrem as boolean,Byref strSql as string)
    If ChkMois = True Then
      If blnPrem Then
        strSQL = strSQL & " month(strDate)=intMois "
        blnPrem = False
      Else
        intSQL = intSQL & "Or month(strDate)=intMois "
      End If
   End If
End Sub
et appelée de cette manière dans la routine principale
Code :
1
2
3
Call MajSql(1, Date,ChkMois1.Value, blnPremierMois, SQL)
Call MajSql(2, Date,ChkMois2.Value, blnPremierMois, SQL)
'....
Ceci est de l'à peu près, car je n'ai pas le temps de vérifier en réel.
Je pense aussi que tu doit pouvoir supprimer une bonne partie du code où tu testes l'état de toutes les cases.
Si j'ai quelques minutes demain, j'essaierais d'être plus précis.
Cordialement, Dominique.
PapouDomi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 08h12   #7
Membre actif
 
Homme Dominique
Gestion parc machine, assistance informatique, développement Access, Excel...
Inscription : février 2007
Messages : 130
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 56
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Gestion parc machine, assistance informatique, développement Access, Excel...
Secteur : Service public

Informations forums :
Inscription : février 2007
Messages : 130
Points : 161
Points : 161
Bonjour.
J'ai eu un peu plus de temps ce matin. Je te propose le code suivant que j'ai testé en réel
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
Sub MajSql(ByVal intMois As Integer, ByVal ChkMois As Boolean, ByRef blnPrem As Boolean, ByRef strSql As String)
    If ChkMois = True Then
      If blnPrem Then
        strSql = strSql & " AND (month(DateTrt)=" & intMois
        blnPrem = False
      Else
        strSql = strSql & " OR month(DateTrt)=" & intMois
      End If
   End If
End Sub
 
Private Sub Commande0_Click()
 
  Dim SQL As String
  Dim blnPremierMois As Boolean 'Détection de la première case cochée
 
  blnPremierMois = True
 
  SQL = "SELECT IdInterne, DateTrt FROM MyTable Where year(DateTrt)=2011"
 
  Call MajSql(1, chkMois1, blnPremierMois, SQL)
  Call MajSql(2, chkMois2, blnPremierMois, SQL)
  '.....
 
  If blnPremierMois Then
    SQL = SQL & ";"
  Else
    SQL = SQL & ");"
  End If
End Sub
Dans ta table MyTable, tu utilises le champ Date qui est un mot réservé => problème. Pour cela, je l'ai remplacé par DateTrt.
Dans le cas actuel, pas besoin du préfixe Me ni du suffixe Value pour désigner une case à cocher.
Cordialement, Dominique.
PapouDomi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h56   #8
Membre habitué
 
Inscription : janvier 2005
Messages : 527
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 527
Points : 134
Points : 134
Salut !

Je reviens sur le forum aujourd'hui et je vois tes réponses. Merci pour ton aide, je vais tester ton code qui a l'air bien plus propre que le mien. Je fais un retour ASAP.

Merci beaucoup !
Bonne fin de journée.
debdev 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 02h21.


 
 
 
 
Partenaires

Hébergement Web