Académique Documents
Professionnel Documents
Culture Documents
De plus, l'utilisateur doit pouvoir choisir l'affichage selon deux critères de tri :
par numéro de CD par compositeur
Nous allons donc créer un formulaire qui sera déclanché par le bouton Recherche de la façon suivante :
Vu que l'utilisateur va pouvoir choisir parmi plusieurs critères de recherche, il convient de n'afficher que les listes déroulantes ou les zones
de textes nécessaires. Cela explique pourquoi beaucoup ont été rendues invisibles et ne deviendront visibles que lorsque l'utilisateur va
cliquer sur une case à cocher correspondante.
Par défaut, il faut s'attendre à ce que l'utilisateur fasse une recherche par compositeur. Dans ce cas - et dans ce cas seulement - il serait
souhaitable d'avoir un tri par numéro de CD. Lors de l'affichage du formulaire, le bouton d'option par numéro de CD ainsi que la case à cocher
par compositeur seront activés automatiquement.
Table des propriétés du formulaire et du cadre
Propriété Valeur Valeur
Name frmRecherche fraChoixDeTri
Caption Formulaire de recherche Choisissez un ordre de tri pour vos résultats !
Height 257.25 41.25
Left 0 7.5
Top 0 7.5
Width 240 217.5
Table des propriétés des boutons d'option Table des propriétés des boutons de commande
Propriété Valeur Valeur Propriété Valeur Valeur
Name optCompositeur optParCD Name cmdOK cmdAnnuler
Caption par compositeur par numéro de CD Caption OK Annuler
Default True False Cancel False True
Height 15.75 15.75 Default True False
Left 11.25 120 Height 18.75 18.75
Top 11.25 11.25 Left 176.25 116.25
Value False True Top 213.75 213.75
Width 86.25 86.25 Width 50 50
Attention : consulter la feuille "Améliorations aux recherches pour y trouver une solution
beaucoup plus simple sous le titre Remplissage d'une liste déroulante simplifiée !
Lorsque le formulaire s'affiche, on voudrait pouvoir avoir immédiatement le listing de tous les compositeurs dans la liste déroulante correspondante. On
ne veut toutefois pas que on ait éternellement le même premier conpositeur qui s'affiche. Par conséquent, on évitera la ligen de code suivante en fin de
sous-procédure :
o frmRecherche.cboCompositeurs.ListIndex = 0
En revanche, on va devoir utiliser la fonction qui nous remplit la liste déroulante plusieurs fois. Il est donc raisonnable de mettre sur pied une sous-
procédure qui accepte des paramètre pour pouvoir remplir n'importe quelle liste déroulante de notre application.
De plus, comme nous allons chercher des listing déjà triés avec des références uniques, il serait intelligent de définir dans quelle feuille de notre classeur
se trouve le listing désiré pour la liste déroulante ainsi que la longueur de chaque listing. C'est la raison pour laquelle nous définissons les constantes
publiques suivantes (ces constantes sont à mettre dans le module principal) :
Ici, le code général pour remplir une liste déroulante (ce code est à placer dans le module FormulaireRecherche) :
En fait, nous allons "nourrir" toutes les listes déroulantes, que celles-ci soient visibles ou non. Ainsi, le travail sera déjà fait
au départ, et dès l'activation d'une case à cocher, la liste déroulante sera visible avec son contenu tout prêt.
Notez le changement du première paramètre "frmRecherche" en Me dans les appels ci-dessus et la répercussion sur la sous-routine elle-même !
Le déclenchement du bouton OK est relié à la procédure qui suit, procédure qui va encore s'étoffer :
Voici la sous-procédure de contrôle qui doit être placée, bien entendu, dans un module ad hoc.
Nous vourdrions commencer par la collection particulière, car c'est la plus simple pour montrer comment nous désirons fair
Nous partons du principe que nous voudrions faire afficher tous les CD dont la remarques dans la feuille "Opera Omnia" co
caractère "Juju".
Par conséquent, nous avons étoffé la sous-routine cmdOK_Click() du formulaire frmRecherche comme suit :
o Sub CollectionParticulière()
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
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 If ActiveCell.Offset(0, 10).Value <> "" Then
o Set Cell = ActiveCell.Offset(0, 10)
o
o 'Le If suivant génère une erreur si la cellule contient une chaîne mais que "
o 'n'est pas trouvé. En mettant On Error Resume Next, un VRAI est quand-même m
o 'dans la colonne 13 ce que nous voulons éviter. La parade, c'est de dire à l
o 'routine d'aller chercher sous l'étiquette :Erreur ce qu'il faut faire. A ce
o ' on fait sauter une ligne de code afin que le mot VRAI ne soit pas inscrit.
o On Error GoTo Erreur
o If Application.WorksheetFunction.Find("Juju", Cell) > 0 Then
o ActiveCell.Offset(0, 13).Value = 1
o 'On se souvient de combien d'occurences vont être trouvées
o Lin = Lin + 1
o
o Prochain:
L'utilisation de l'erreur géné
o End If
par la fonction Find est
o End If particulièrement intéressan
o dans ce code !
o ActiveCell.Offset(1, 0).Activate
o Loop
o
o Call FiltreAutomatique(14, 1, Lin, TriSurCompositeurs)
o
o Exit Sub
o
o Erreur:
o Resume Prochain
o End Sub
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.
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
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.
n de la chaîne de 0 et de 1
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)
, 0, "", 0, "")
, 0, "", 2, cboCompositeurs)
, 9, cboTypeMusique, 0, "")
, 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,
Le bouton de recherche par période exige que nous reformations la sous-procédure ci-dessous :
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
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 :
res faite de 0 et de 1
n fonction de la chaîne de 0 et de 1
de la procédure principale :
T, CInt(frmRecherche.txtDe.Value) + ECART)
CInt(frmRecherche.txtEcart.Value), _
CInt(frmRecherche.txtEcart.Value))
Int(frmRecherche.txtA.Value))
ent inconnue."
de 50 ans."
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.
res faite de 0 et de 1
n fonction de la chaîne de 0 et de 1
n fait inutile
Améliorations au formulaire de recherche
Les sous-routines suivantes doivent être transférées depuis le module FonctionnementClasseur vers le module
Les sous-routines qui restent dans le formulaire frmRecherche sont les suivantes :
a façon suivante :
TEURS, "cboCompositeurs")
ATION, "cboAppréciation")
RUMENTATION, "cboInstrumentation")
PRETATION, "cboInterprétation")
_MUSIQUE, "cboTypeMusique")
formulaire