Vous êtes sur la page 1sur 28

### Recherche de plusieurs éléments avec filtre

Nous voudrions à présent pouvoir faire un tri multiple sur plusieurs critères comme
dans l'exemple suivant. Il y a 5 listes déroulantes dans notre menu. Au moins une
doit être remplie pour cet exercice. Mais on peut s'imaginer vouloir faire un filtre sur
toutes les œuvres de J.-B. Bach pour clavecin solo.

Nous allons par conséquent encore étoffer la sous-routine suivante :

o Private Sub cmdOK_Click()


o Dim strBit As String
o
o If ContrôleAuMoinsUneCaseACocherValide = True Then
o If chkCollectionJuju Then Call CollectionParticulière
o
o 'Cette procédure construit une chaîne de caractères faite de 0 et de 1
o Call AnalyseDésires(strBit)
o
o 'Cette procédure exécute le filtre automatique en fonction de la chaîne de 0 e
o Call ExécutionDésires(strBit)
o
o End If
o
o End Sub

La première sous-routine qui suit construit une chaîne de caractères en écrivant de gauche à droite pour permettre une
C'est la raison pour laquelle on contrôle en premier la valeur de la case à cocher d'appréciation et en dernier le compos

o 'Précédure appelée par Private Sub cmdOK_Click()


o 'Cette procédure construit une chaîne de caractères faite de 0 et de 1
o Private Sub AnalyseDésires(ByRef strBit As String)
o If chkAppréciation Then strBit = "1" Else strBit = "0"
o If chkInterprétation Then strBit = strBit & "1" Else strBit = strBit & "0"
o If chkInstrumentation Then strBit = strBit & "1" Else strBit = strBit & "0"
o If chkTypeMusique Then strBit = strBit & "1" Else strBit = strBit & "0"
o If chkCompositeur Then strBit = strBit & "1" Else strBit = strBit & "0"
o End Sub

La deuxième sous-routine n'est qu'un énorme Select Case qui exécute le filtre automatique en fonction de la chaîne
construite dans la procédure précédente. La chaîne de caractères se lit de droite à gauche. Chaque "bit" allumé repré
l'activation de la case à cocher.

o 'Procédure appelée par Private Sub cmdOK_Click()


o 'Cette procédure exécute le filtre automatique en fonction de la chaîne de 0 et de 1
o Private Sub ExécutionDésires(ByRef strBit As String)
o Worksheets("Opera Omnia").Activate
o Range("A2").Select
o Selection.AutoFilter
o
o Select Case strBit
o Case "00001" 'colonne 2 par compositeur
o Call FiltreMultiple(0, "", 0, "", 0, "", 0, "", 2, cboCompositeurs)
o Case "00010" 'colonne 9 par type
o Call FiltreMultiple(0, "", 0, "", 0, "", 9, cboTypeMusique, 0, "")
o Case "00011"
o Call FiltreMultiple(0, "", 0, "", 0, "", 9, cboTypeMusique, 2, cboComposit
o Case "00100" 'colonne 7 par instrumentation
o Call FiltreMultiple(0, "", 0, "", 7, cboInstrumentation, 0, "", 0, "")
o Case "00101"
o Call FiltreMultiple(0, "", 0, "", 7, cboInstrumentation, 0, "", 2, cboComp
o Case "00110"
o Call FiltreMultiple(0, "", 0, "", 7, cboInstrumentation, 9, cboTypeMusique
o Case "00111"
o Call FiltreMultiple(0, "", 0, "", 7, cboInstrumentation, 9, cboTypeMusique
o Case "01000" 'colonne 8 par interprétation
o Call FiltreMultiple(0, "", 8, cboInterprétation, 0, "", 0, "", 0, "")
o Case "01001"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 0, "", 0, "", 2, cboCompo
o Case "01010"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 0, "", 9, cboTypeMusique,
o Case "01011"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 0, "", 9, cboTypeMusique,
o Case "01100"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 7, cboInstrumentation, 0,
o Case "01101"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 7, cboInstrumentation, 0,
o Case "01110"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 7, cboInstrumentation, 9,
o Case "01111"
o Call FiltreMultiple(0, "", 8, cboInterprétation, 7, cboInstrumentation, 9,
o Case "10000" 'colonne 12 par appréciation
o Call FiltreMultiple(12, cboAppréciation, 0, "", 0, "", 0, "", 0, "")
o Case "10001"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 0, "", 0, "", 2, cboCompos
o Case "10010"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 0, "", 9, cboTypeMusique,
o Case "10011"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 0, "", 9, cboTypeMusique,
o Case "10100"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 7, cboInstrumentation, 0,
o Case "10101"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 7, cboInstrumentation, 0,
o Case "10110"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 7, cboInstrumentation, 9,
o Case "10111"
o Call FiltreMultiple(12, cboAppréciation, 0, "", 7, cboInstrumentation, 9,
o Case "11000"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 0, "", 0, "
o Case "11001"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 0, "", 0, "
o Case "11010"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 0, "", 9, c
o Case "11011"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 0, "", 9, c
o Case "11100"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 7, cboInstr
o Case "11101"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 7, cboInstr
o Case "11110"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 7, cboInstr
o Case "11111"
o Call FiltreMultiple(12, cboAppréciation, 8, cboInterprétation, 7, cboInstr
o Case Else
o MsgBox "Problème Select Case dans ExécutionDésires(strBit)"
o End Select
o
o End Sub

La sous-routine précédente fait à chaque Case appel à la sous-routine suivante :

o 'Procédure appelée par Private Sub ExécutionDésires(ByRef strBit As String)


o Private Sub FiltreMultiple(ByRef F1 As Integer, C1 As String, F2 As Integer
o F3 As Integer, C3 As String, F4 As Integer, C4 As String
o
o Dim TriSurCompositeurs As Boolean
o
o TriSurCompositeurs = frmRecherche.optCompositeur
o Unload frmRecherche
o
o 'Pour empêcher une erreur si rien n'est demandé, par exemple si on n'a demandé
o 'qu'un compositeur et rien d'autre
o On Error Resume Next
o
o 'On lance le filtre
o Selection.AutoFilter
o
o 'Les lignes suivantes font que si l'utilisateur a choisi p. ex. les compositeur,
o 'mais n'a rien spécifié, tous les compositeurs s'affichent.
o If C1 = "" Then Selection.AutoFilter Field:=F1 Else Selection.AutoFilter Field:=F1
o If C2 = "" Then Selection.AutoFilter Field:=F2 Else Selection.AutoFilter Field:=F2
o If C3 = "" Then Selection.AutoFilter Field:=F3 Else Selection.AutoFilter Field:=F3
o If C4 = "" Then Selection.AutoFilter Field:=F4 Else Selection.AutoFilter Field:=F4
o If C5 = "" Then Selection.AutoFilter Field:=F5 Else Selection.AutoFilter Field:=F5
o
o If TriSurCompositeurs Then
o Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, _
o Key2:=Range("C2"), Order2:=xlAscending, _
o Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
o Orientation:=xlTopToBottom
o End If
o
o End Sub
de 0 et de 1

n de la chaîne de 0 et de 1

à droite pour permettre une concaténation.


tion et en dernier le compositeur.

= strBit & "0"


= strBit & "0"
trBit & "0"
trBit & "0"

ue en fonction de la chaîne de 0 et de 1
. Chaque "bit" allumé représente

chaîne de 0 et de 1
oCompositeurs)

sique, 0, "")

sique, 2, cboCompositeurs)

on, 0, "", 0, "")

on, 0, "", 2, cboCompositeurs)

on, 9, cboTypeMusique, 0, "")

on, 9, cboTypeMusique, 2, cboCompositeurs)

", 0, "", 0, "")

", 0, "", 2, cboCompositeurs)

", 9, cboTypeMusique, 0, "")

", 9, cboTypeMusique, 2, cboCompositeurs)

boInstrumentation, 0, "", 0, "")

boInstrumentation, 0, "", 2, cboCompositeurs)

boInstrumentation, 9, cboTypeMusique, 0, "")

boInstrumentation, 9, cboTypeMusique, 2, cboCompositeurs)

, 0, "", 0, "")

, 0, "", 2, cboCompositeurs)

, 9, cboTypeMusique, 0, "")

, 9, cboTypeMusique, 2, cboCompositeurs)

oInstrumentation, 0, "", 0, "")

oInstrumentation, 0, "", 2, cboCompositeurs)

oInstrumentation, 9, cboTypeMusique, 0, "")


oInstrumentation, 9, cboTypeMusique, 2, cboCompositeurs)

rétation, 0, "", 0, "", 0, "")

rétation, 0, "", 0, "", 2, cboCompositeurs)

rétation, 0, "", 9, cboTypeMusique, 0, "")

rétation, 0, "", 9, cboTypeMusique, 2, cboCompositeurs)

rétation, 7, cboInstrumentation, 0, "", 0, "")

rétation, 7, cboInstrumentation, 0, "", 2, cboCompositeurs)

rétation, 7, cboInstrumentation, 9, cboTypeMusique, 0, "")

rétation, 7, cboInstrumentation, 9, cboTypeMusique, 2, cboCompositeurs)

As String)
As Integer, C2 As String, _
eger, C4 As String, F5 As Integer, C5 As String)

si on n'a demandé

x. les compositeur,

.AutoFilter Field:=F1, Criteria1:=C1


.AutoFilter Field:=F2, Criteria1:=C2
.AutoFilter Field:=F3, Criteria1:=C3
.AutoFilter Field:=F4, Criteria1:=C4
.AutoFilter Field:=F5, Criteria1:=C5
:=False, _
### Recherche par période

Le bouton de recherche par période exige que nous reformations la sous-procédure ci-dessous :

o Private Sub cmdOK_Click()


o Dim strBit As String
o
o If ContrôleAuMoinsUneCaseACocherValide = True Then
o
o If chkCollectionJuju Then
o Call CollectionParticulière
o Else
o If chkPériode Then
o Call ParPériode
o Else
o If chkRechercheLibre Then
o 'Call RechercheLibre A faire dans prochaine feuille "Bout
o Else
o 'Cette procédure construit une chaîne de caractères faite de 0 et de
o Call AnalyseDésires(strBit)
o
o 'Cette procédure exécute le filtre automatique en fonction de la chaî
o Call ExécutionDésires(strBit)
o End If
o End If
o End If
o
o End If
o End Sub

Pour l'exécution du code qui suit, nous avons inséré la ligne suivante dans la section General de la procédure principale

o Public Const ECART = 50 'on choisit de donner 50 ans d'écart par défaut autour d'une date

o 'Procédure appelée par Private Sub cmdOK_Click()


o 'Cette procédure sert à analyser la période demandée, éventuellement dans un certain écar
o 'Si aucun écart n'est demandé, on prend un écart de 50 ans par défaut
o Private Sub ParPériode()
o Dim bolRempliJuste As Boolean
o
o bolRempliJuste = True
o 'Il ne peut y avoir que 4 cas où c'est juste : 000 , 100 , 101 , 110
o Call ContrôlePériode(bolRempliJuste)
o If bolRempliJuste = False Then Exit Sub
o
o Worksheets("Opera Omnia").Activate
o Range("A2").Activate
o
o If frmRecherche.txtDe.Value = "" And frmRecherche.txtA.Value = "" And frmRecherche.tx
o 'Cas 000
o Selection.AutoFilter
o Range("A2").Select
o Selection.AutoFilter Field:=4, Criteria1:="="
o Selection.AutoFilter Field:=5, Criteria1:="="
o Else
o If frmRecherche.txtDe.Value <> "" And frmRecherche.txtA.Value = "" And
o 'Cas 100, écart de ECART ans (défini dans procédure principale)
o Call FiltreElaboré(CInt(frmRecherche.txtDe.Value) - ECART, CInt(frmRecherche.
o Else
o If frmRecherche.txtDe.Value <> "" And frmRecherche.txtA.Value = ""
o 'Cas 101
o Call FiltreElaboré(CInt(frmRecherche.txtDe.Value) - CInt(frmRecherche.txt
o CInt(frmRecherche.txtDe.Value) + CInt(frmRecherche.txt
o Else
o 'Cas 110
o Call FiltreElaboré(CInt(frmRecherche.txtDe.Value), CInt(frmRecherche.txtA
o End If
o End If
o End If
o
o Unload frmRecherche
o End Sub

Si la procédure suivante se déroule sans que bolRempliJuste soit mis à False, c.-à-d. sans que l'utilisateur rentre une
procédure après celle-ci qui se déclenche.

o 'Cette sous-routine contrôle si l'utilisateur a été logique dans son choix de période(s)
o Private Sub ContrôlePériode(ByRef bolRempliJuste As Boolean)
o '000 JUSTE ! On avertit l'utilisateur qu'il va recevoir uniquement des compositio
o If frmRecherche.txtDe.Value = "" And frmRecherche.txtA.Value = "" And frmRecherche.tx
o MsgBox "Vous n'avez choisi aucune période." & vbCrLf & _
o "Vous allez obtenir tous les morceaux de date absolument inconnue."
o End If
o
o '001 FAUX
o If frmRecherche.txtDe.Value = "" And frmRecherche.txtA.Value = "" And frmRecherche.tx
o bolRempliJuste = False
o MsgBox "Vous n'avez rentré qu'un écart." & vbCrLf & _
o "C'est une impossibilité sans indiquer une date de début."
o Exit Sub
o End If
o
o '010 FAUX
o If frmRecherche.txtDe.Value = "" And frmRecherche.txtA.Value <> "" And frmRecherche.t
o bolRempliJuste = False
o MsgBox "Vous n'avez rentré qu'une date de fin." & vbCrLf & _
o "C'est une impossibilité sans indiquer une date de début."
o Exit Sub
o End If
o
o '011 FAUX
o If frmRecherche.txtDe.Value = "" And frmRecherche.txtA.Value <> "" And frmRecherche.t
o bolRempliJuste = False
o MsgBox "Vous avez rentré une période de fin ainsi qu'un écart." & vbCrLf & _
o "C'est une impossibilité ..."
o Exit Sub
o End If
o
o '100 JUSTE ! On averti l'utilisateur de l'écart par défaut.
o If frmRecherche.txtDe.Value <> "" And frmRecherche.txtA.Value = "" And frmRecherche.t
o MsgBox "Vous n'avez pas d'écart." & vbCrLf & _
o "L'écart par défaut autour de la période de début est de 50 ans."
o Exit Sub
o End If
o
o '101 JUSTE !
o ' If frmRecherche.txtDe.Value <> "" And frmRecherche.txtA.Value = "" And frmRecherche.
o ' Exit Sub
o ' End If
o
o '110 JUSTE !
o ' If frmRecherche.txtDe.Value <> "" And frmRecherche.txtA.Value <> "" And frmRecherche
o ' Exit Sub
o ' End If
o
o '111 FAUX
o If frmRecherche.txtDe.Value <> "" And frmRecherche.txtA.Value <> "" And frmRecherche.
o bolRempliJuste = False
o MsgBox "Vous avez rentré une période de début et de fin ainsi qu'un écart." & vbC
o "C'est une impossibilité ..."
o Exit Sub
o End If
o
o End Sub

L'utilisateur a rempli les champs de texte pour la période correctement. On peut procéder au filtre élaboré suivant :

o 'Sous-procédure appelée par Private Sub ParPériode()


o 'Sert à difinir les dates de début et de fin pour le filtre élaboré
o Private Sub FiltreElaboré(ByRef De As Integer, A As Integer)
o Range("AA2").Value = ">=" & CStr(De)
o Range("Ab2").Value = "<=" & CStr(A)
o Range("A1:N342").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
o Range("AA1:AB2"), Unique:=False
o Range("A2").Select
o End Sub
dans prochaine feuille "Bouton Recherche 6"

res faite de 0 et de 1

n fonction de la chaîne de 0 et de 1

de la procédure principale :

aut autour d'une date de recherche

dans un certain écart.


" And frmRecherche.txtEcart.Value = "" Then

e = "" And frmRecherche.txtEcart.Value = "" Then

T, CInt(frmRecherche.txtDe.Value) + ECART)

Value = "" And frmRecherche.txtEcart.Value <> "" Then

CInt(frmRecherche.txtEcart.Value), _
CInt(frmRecherche.txtEcart.Value))

Int(frmRecherche.txtA.Value))

s que l'utilisateur rentre une ineptie, ce sera la

choix de période(s) et d'écart

uement des compositions non datées.


" And frmRecherche.txtEcart.Value = "" Then

ent inconnue."

" And frmRecherche.txtEcart.Value <> "" Then


"" And frmRecherche.txtEcart.Value = "" Then

"" And frmRecherche.txtEcart.Value <> "" Then

t." & vbCrLf & _

"" And frmRecherche.txtEcart.Value = "" Then

de 50 ans."

"" And frmRecherche.txtEcart.Value <> "" Then

> "" And frmRecherche.txtEcart.Value = "" Then

"" And frmRecherche.txtEcart.Value <> "" Then

i qu'un écart." & vbCrLf & _

ltre élaboré suivant :


aRange:= _
### Recherche libre

Nous finissons ce chapitre de recherche en activant la ligne de code désactivée de Private Sub cmdOK_Click()

o Private Sub cmdOK_Click()


o Dim strBit As String
o
o If ContrôleAuMoinsUneCaseACocherValide = True Then
o
o If chkCollectionJuju Then
o Call CollectionParticulière
o Else
o If chkPériode Then
o Call ParPériode
o Else
o If chkRechercheLibre Then
o Call RechercheLibre(txtRechercheLibre)
o Else
o 'Cette procédure construit une chaîne de caractères faite de 0 et de
o Call AnalyseDésires(strBit)
o
o 'Cette procédure exécute le filtre automatique en fonction de la chaî
o Call ExécutionDésires(strBit)
o End If
o End If
o End If
o
o End If
o End Sub

L'idée est la suivante : l'utilisateur voudrait faire une recherche sur un mot clé, mais ne sachant pas très bien où il se trouve
trois colonnes : les œuvres, l'interprétation et les remarques ; ce sont là les seuls champs où on peut rentrer un peu n'impo
dans ces champs s'apparente beaucoup à la recherche que nous avons fait pour une colleciton particulière.

o 'Procédure appelée par Private Sub cmdOK_Click()


o 'Cette procédure recherche un mot clé dans trois colonnes :
o 'les oeuvres, les interprétations, les remarques
o 'puis un filtre automatique est fait pour afficher les morceaux désirés
o Private Sub RechercheLibre(ByRef MotClé As String)
o Dim Cell As Range
o 'Cette variable sert à placer le bouton de Retour au Menu au bon endroit
o Dim Lin As Long
o 'Cette variable se souvient si l'utilisateur a demandé un tri sur les
o 'compositeur, ceci avant que le formulaire soit refermé.
o Dim TriSurCompositeurs As Boolean
o Dim bolTrouvéUneOccurence As Boolean
o
o bolTrouvéUneOccurence = False
o
o TriSurCompositeurs = frmRecherche.optCompositeur
o
o Unload frmRecherche
o
o Worksheets("Opera Omnia").Activate
o Range("N2:N65536").Clear
o Range("A2").Select
o Do While ActiveCell.Value <> ""
o '1.) Colonne 6 des oeuvres
o Set Cell = ActiveCell.Offset(0, 5)
o
o 'La deuxième partie du If suivant génère une erreur si la cellule contient une ch
o 'que le mot clé n'est pas trouvé. En mettant On Error Resume Next, un VRAI est q
o 'même marqué dans la colonne 13 ce que nous voulons éviter. La parade, c'est de
o 'à la sous-routine d'aller chercher sous l'étiquette :Erreur ce qu'il faut faire.
o 'cet endroit on fait sauter une ligne de code afin que le mot VRAI ne soit pas in
o On Error GoTo Erreur_1
o If Cell.Value <> "" And Application.WorksheetFunction.Find(MotClé, Cell) > 0
o ActiveCell.Offset(0, 13).Value = 1
o bolTrouvéUneOccurence = True
o Lin = Lin + 1
o Prochain_1:
o End If
o
o 'Il ne vaut la peine de continuer la recherche que si aucune occurence n'a été tr
o 'dans la colonne des oeuvres
o If bolTrouvéUneOccurence = False Then
o '2.) Colonne 8 des interprètes
o Set Cell = ActiveCell.Offset(0, 7)
o
o On Error GoTo Erreur_2:
o If Cell.Value <> "" And Application.WorksheetFunction.Find(MotClé, Cell) > 0
o ActiveCell.Offset(0, 13).Value = 1
o bolTrouvéUneOccurence = True
o Lin = Lin + 1
o Prochain_2:
o End If
o End If
o
o 'Il ne vaut la peine de continuer la recherche que si aucune occurence n'a été tr
o 'dans la colonne des interprétations
o If bolTrouvéUneOccurence = False Then
o '3.) Colonne 11 des remarques
o Set Cell = ActiveCell.Offset(0, 10)
o
o On Error GoTo Erreur_3:
o If Cell.Value <> "" And Application.WorksheetFunction.Find(MotClé, Cell) > 0
o ActiveCell.Offset(0, 13).Value = 1
o bolTrouvéUneOccurence = True 'Cette ligne est en fait inutile
o Lin = Lin + 1
o Prochain_3:
o End If
o End If
o
o ActiveCell.Offset(1, 0).Activate
o 'Remise à False pour la prochaine ligne
o bolTrouvéUneOccurence = False
o Loop
o
o Call FiltreAutomatique(14, 1, Lin, TriSurCompositeurs)
o
o Exit Sub
o
o Erreur_1:
o Resume Prochain_1
o Erreur_2:
o Resume Prochain_2
o Erreur_3:
o Resume Prochain_3
o End Sub
Sub cmdOK_Click() dans la feuille Bouton Recherche 5.

res faite de 0 et de 1

n fonction de la chaîne de 0 et de 1

pas très bien où il se trouve. Cela concerne


n peut rentrer un peu n'importe quoi. La recherche
n particulière.
llule contient une chaîne
e Next, un VRAI est quand-
La parade, c'est de dire
ce qu'il faut faire. A
t VRAI ne soit pas inscrit.

otClé, Cell) > 0 Then

occurence n'a été trouvée

nd(MotClé, Cell) > 0 Then

occurence n'a été trouvée


nd(MotClé, Cell) > 0 Then

n fait inutile
Améliorations au formulaire de recherche

Mis en ordre du code


Nous avons mis du code aussi bien dans le module principal que dans le code rattaché aux formulaires.
Le code de formulaire contient à présent aussi bien du code événementiel que du code non événementiel. Il convient
le code de formulaire que du code événementiel. Nous allons donc créer un module que nous nommerons
contiendra tout le code non événementiel rattaché au formulaire de recherche.

Les sous-routines suivantes doivent être transférées dans le module FormulaireRecherche :

Private Sub RechercheLibre(ByRef MotClé As String)


Private Sub ExécutionDésires(ByRef strBit As String)
Private Sub FiltreMultiple(ByRef F1 As Integer, C1 As String, F2 As Integer
C3 As String, F4 As Integer, C4 As String, F5 As Integer
Private Sub ParPériode()
Private Sub FiltreElaboré(ByRef De As Integer, A As Integer)
Private Sub ContrôlePériode(ByRef bolRempliJuste As Boolean)
Private Sub DésactiverListeDéroulantes()
Private Sub DésactiverZonesTexte()
Private Sub AnalyseDésires(ByRef strBit As String)

Les sous-routines suivantes doivent être transférées depuis le module FonctionnementClasseur vers le module

Sub RemplirListeDéroulante(ByRef frm As String, sh As String, rge As String


Sub ContrôleAuMoinsUneCaseACocherValide()
Sub CollectionParticulière()
Sub FiltreAutomatique(ByRef Col As Integer, Valeur As Integer, _
Lin As Long, TriSurCompositeurs As Boolean)

Vous devrez sans doute faire quelques ajustement en rajoutant la chaîne de


caractère "frmRecherche." devant les objets faisant partie de ce formulaire…

De plus, tous les Private dans les modules doivent disparaître !

Les sous-routines qui restent dans le formulaire frmRecherche sont les suivantes :

Private Sub UserForm_Activate()


Private Sub chkAppréciation_Click()
Private Sub chkCollectionJuju_Click()
Private Sub chkCompositeur_Click()
Private Sub chkInstrumentation_Click()
Private Sub chkInterprétation_Click()
Private Sub chkPériode_Click()
Private Sub chkTypeMusique_Click()
Private Sub chkRechercheLibre_Click()
Private Sub cmdAnnuler_Click()
Private Sub cmdOK_Click()
Testez soigneusement votre programme ! Il vous faudra plusieurs mois pour
stabiliser, sans compter les erreurs de saisie dans certaines feuilles !

Placer le curseur au bon endroit avec la méthode SetFocus


Lorsque l'utilisateur clique sur une case à cocher affublée d'une zone de texte, il serait sympatique que le curseur se tr
cette zone de texte sans que l'utilisateur ait besoin de cliquer dedans. Voici les changements apportés :

o Private Sub chkRechercheLibre_Click()


o txtRechercheLibre.Visible = Not txtRechercheLibre.Visible
o If txtRechercheLibre.Visible = True Then
o Call DésactiverListeDéroulantes
o chkCollectionJuju = False
o chkPériode = False
o
o txtRechercheLibre.SetFocus
o End If
o End Sub

o Private Sub chkPériode_Click()


o txtDe.Visible = Not txtDe.Visible
o txtA.Visible = Not txtA.Visible
o txtEcart.Visible = Not txtEcart.Visible
o lblDe.Visible = Not lblDe.Visible
o lblA.Visible = Not lblA.Visible
o lblEcart.Visible = Not lblEcart.Visible
o If txtDe.Visible = True Then
o Call DésactiverListeDéroulantes
o chkCollectionJuju = False
o chkRechercheLibre = False
o
o txtDe.SetFocus
o End If
o End Sub

Permettre la recherche, quelle que soit la capitalisation


Il est gênant de devoir rentrer une chaîne de caractère avec la capitalisation exacte. Ainsi, si vous essyez de rentrer "c
le programme ne trouve rien. C'est la raison pour laquelle il convient de changer la fonction Find (TROUVE) utilisée d
RechercheLibre(ByRef MotClé As String) et CollectionParticulière() par la fonction Search

Remplissage d'une liste déroulante simplifiée


Vous pouvez sensiblement améliorer votre code de remplissage des listes déroulantes de la façon suivante :

o Private Sub UserForm_activate()


o Application.ScreenUpdating = False
o Call RemplirListeDéroulante(Me, "Compositeurs", RANGE_COMPOSITEURS, "cboCompositeu
o Call RemplirListeDéroulante(Me, "Appréciation", RANGE_APPRECIATION, "cboAppréciati
o Call RemplirListeDéroulante(Me, "Instrumentation", RANGE_INSTRUMENTATION, "cboInst
o Call RemplirListeDéroulante(Me, "Interprétation", RANGE_INTERPRETATION, "cboInterp
o Call RemplirListeDéroulante(Me, "Type de musique", RANGE_TYPE_MUSIQUE, "cboTypeMus
o Worksheets("Menu").Select
o Application.ScreenUpdating = True
o End Sub

o 'Sous-routine servant remplir les différentes listes déroulantes


o 'Sous-routine appelée par UserForm_Activate() aussi bien dans le formulaire
o frmRecherche que frmNouveauCD.
o 'Amélioration aimablement transmise par Pascal Pannatier.
o Sub RemplirListeDéroulante(ByRef frm As UserForm, sh As String, rge As String
o Worksheets(sh).Activate
o frm.Controls(cbo).RowSource = Worksheets(sh).Range(rge).Address
o End Sub
formulaires.
événementiel. Il convient de ne laisser dans
ous nommerons FormulaireRecherche qui

As Integer, C2 As String, F3 As Integer, _


F5 As Integer, C5 As String)

asseur vers le module FormulaireRecherche :

As String, cbo As String)


lusieurs mois pour le
es feuilles !

patique que le curseur se trouve tout de suite dans


ts apportés :

si vous essyez de rentrer "cri" au lieu de "Cri",


Find (TROUVE) utilisée dans les procédures
la fonction Search (CHERCHE).

a façon suivante :

TEURS, "cboCompositeurs")
ATION, "cboAppréciation")
RUMENTATION, "cboInstrumentation")
PRETATION, "cboInterprétation")
_MUSIQUE, "cboTypeMusique")

formulaire

ge As String, cbo As String)