Liste déroulante pour recherche

Bonjour,

Pas eu le temps de tout compléter (notamment le sélecteur de date annoncé) mais ça suffit pour voir le mécanisme.

La feuille d'enregistrement, appelée Memo est masquée, tu n'y écris rien et tu n'as pas normalement à t'en occuper.

Une ScrollBar figure en C1:D1, le SmallChange est réglé à 1, le LargeChange à 8 et le Min à 1, le Max sera variable au fil du temps, il est calculé à l'ouverture du classeur à partir de la date du jour (diminué de la date choisie comme origine) réduite à la centaine et on y ajoute 600 jours. Soit tu peux avancer dans le calendrier d'un peu plus d'un an et demi par rapport à la date du jour, et tous les 100 jours, le Max va s'accroître de 100...

La date fixée comme Jour0 (enregistrée comme constante dans le Gestionnaire de noms) est 31/12/2016. La date minimale que tu peux atteindre est donc le 01/01/2017.

La ScrollBar a une cellule liée, qui est M1. A l'ouverture du classeur, on calcule la différence entre la date et la valeur Jour0 et cette différence est affectée à M1, et se répercute ainsi comme valeur de la ScrollBar.

La cellule E3 contient une formule : =Jour0+M1, qui donc à l'ouverture renverra la date du jour (et par la suite sera modifiée par tes actions sur la ScrollBar). De F3 à L3, les jours suivants s'affichent.

Si le dispositif d'ouverture change la valeur de la ScrollBar, la procédure ScrollBar1_Change sera déclenchée : elle lance une procédure RappelMemo avec en argument sa valeur.

Cette procédure récupère sous forme de tableau, sur la feuille Memo, les valeurs d'une plage correspondant à la taille de la plage d'affichage : E5:L30 (laquelle est nommée PlgMemo) et l'affecte sur cet emplacement.

Pour suivre tes modalités de départ, les colonnes des samedis et dimanches sont masquées (sur les 8 colonnes de la plage, il y en aura donc 6 ou 5 de visibles selon le jour en E)

NB- Une formule en ligne 4 calcule le Modulo 7 de la date figurant en ligne 3, ce qui renvoie une valeur selon le jour de la semaine de 0 (samedi) à 6 (vendredi), permettant de connaître les colonnes à masquer.

Une variable booléenne Rappel est définie comme variable publique. La proc. RappelMemo la passe à True avant d'opérer et la ramène à False ensuite. Ce qui permet d'inhiber le déclenchement de la procédure Change de la feuille (qui lancera l'enregistrement de tes saisies) lorsque l'on se trouve en rappel des données déjà existantes.

Lors de saisies, la proc. Change de la feuille lance une proc. EnregMemo qui opére l'enregistrement de la plage modifiée...

Si des données doivent être calculées, c'est au niveau de cette procédure Change que se décidera quand le calcul peut être fait est lancée.

Par exemple, en ligne 9 figure Effectif nécessaire, en 10 Effectif attribué et en 11 Différence : lorsque dans une colonne tu saisiras une valeur en ligne 9 ou en ligne 10, elle sera enregistrée selon le processus déjà vu. Mais si on doit calculer automatiquement la différence devant figurer en 11, on va surveiller la saisie en lignes 9 et 10. Tant que les 2 ne sont pas saisies, on ne fait rien, mais les 2 étant saisies on peut faire la différence et on l'affecte en ligne 11. Cette affectation déclenchera un nouveau changement qui provoquera l'enregistrement de cette nouvelle données.

Il s'agira donc de recencer les calculs spécifiques à faire, définir une procédure pour chacun et introduire la surveillance dans la procédure Change pour appeler ces proc. spécialisées lorsque les conditions sont détectées...

Comme tu peux voir il n'y a que peu de code globalement pour faire fonctionner ce mécanisme. On l'étoffera sans doute un peu avec des proc. de calcul dédiées, mais cela n'augmentera pas considérablement le volume de code...

Cordialement.

Bonjour,

excuse moi pour la réponse tardive, je viens tout juste de récupérer l'ordinateur du bureau, je regarde ça tout de suite

merci

Bonjour,

c'est super! c'est exactement ce que j'avais en tête, merci beaucoup,

Petites questions :

  • Comment puis-je changer la date de départ pour avoir un calendrier 2018 voir 2019 ou plus ?
  • Puis-je faire des calculs simple dans la feuille 1 du genre : F6-F5 ?

Merci encore pour ce travail

Bonsoir,

Il me semble qu'au départ, il n'était pas question de calendrier annuel (ou sur quelque période prédéterminée). Ton fichier initial cherchait à débuter un affichage à partir d'une date quelconque choisie par toi (au moyen de 3 listes déroulantes), donc à avoir en fait un calendrier mouvant permettant de te rendre sur n'importe quelle date.

Et c'est bien ce qu'on fait !

VBA pouvant gérer des dates du 1er janvier 100 au 31 décembre 9999, on pourrait donc en théorie se balader sur toute cette période... Encore qu'on pourrait avoir quelques problèmes non gérés par VBA qui nécessiterait des dispositifs correctifs si on remontait avant le 15 octobre 1582 (1er jour du calendrier grégorien), et éventuellement d'autres jusqu'à une date relativement récente selon l'échelle géographique que l'on veut couvrir (les derniers pays à passer au calendrier grégorien ne l'ont fait qu'au XXe siècle, et jusque là les mêmes jours n'ont pas été la même date pour tout le monde, souvenons-nous que la révolution d'octobre s'est déroulée en novembre selon notre calendrier...) Mais si ces questions peuvent impacter des travaux historiques ou la généalogie, ce ne sera pas le cas pour une utilisation plus actuelle.

Sur le principe, on a besoin d'une date-pivot, ce que j'ai appelé Jour0, à partir de laquelle on calculera les déplacements dans le temps. Selon le type d'activité, on pourra faire en sorte de circuler de part et d'autre de cette date, mais dans le cas d'une mise en place pour une activité débutant à un moment donné on n'a en général pas besoin de reculer en deçà de la date choisie...

Pour des raisons pratiques et rendre les déplacements plus efficaces avec les outils de sélection utilisés, il est préférable qu'un simple petit clic ne nous expédie 10 ans plus loin que les dates sur lesquelles on est censé travailler. De même, les limitations qu'on peut être amené à introduire sont liées au dispositif d'enregistrement de données prévu parallèlement.

A cet égard, si on adopte la position de ne pas remonter en-deçà du Jour 1 (qui suit la date 0 arrêtée) et l'enregistrement des données prévu sur une seule feuille en réservant une colonne par jour, on dispose d'une latitude d'utilisation sur 44 ans à partir de la date choisie... Ce qui laisse une marge très raisonnable.

Comment ça fonctionne dans le cas présent : Jour0 est défini comme nom dans le classeur auquel est affecté la date du 31 décembre 2016, on y fait appel comme à une constante. Le premier jour utile auquel on peut remonter est donc le 1er janvier 2017.

Il y aurait surtout besoin de modifier cette date de départ si on voulait consigner des données à des dates antérieures. Sinon on peut éventuellement souhaiter la faire avancer périodiquement en réinitialisant le classeur : pas de problème si on redémarre à zéro, on remplace alors la feuille de stockage par une vierge et on modifie la date de départ, et c'est reparti avec un nouveau classeur ; par contre, si on veut modifier la date en conservant des données déjà saisies et restant accessibles de la même façon avec la date modifiée, un dispositif de transfert doit alors être mis en place (ce qui peut s'envisager et n'est pas une opération lourde, mais il conviendrait alors d'examiner cette question dans un cadre plus large de l'archivage éventuel des données et de l'accessibilité des données plus anciennes...)

On a donc toute liberté de fixer le Jour0 avant de commencer, ensuite ce ne sera plus le cas et nécessitera la mise en place d'un dispositif de gestion de ce type de changement.

Par contre l'étendue calendaire accessible peut pratiquement à tout moment être réglée à convenance.

La date maximale qu'on peut atteindre est fixée dans la procédure Workbook_Open par ce calcul :

    j = CLng(Date - [Jour0])
    m = (j \ 100 + 6) * 100

La valeur de m est affectée comme maximum à la ScrollBar qui permet la navigation calendaire.

Pour calculer on arrondit à la centaine inférieure le nombre de jour écoulé depuis Jour0 et on ajoute 600.

Aujourd'hui (23/12/2017) il s'est écoulé 357 jours depuis le 31/12/2016. (3 + 6)*100 = 900 : 900 jours après Jour0 on sera le 19/06/2019, c'est la date accessible aujourd'hui dans le calendrier...

Dans 43 jours, le 04/02/2018, l'écart atteindra 400, et le max passera à 1000, qui portera la date la plus lointaine accessible au 27/09/2019.

Tous les 100 jours on augmente le maximum de 100 jours. L'objectif est que le curseur de la ScrollBar ne soit pas tassé à l'une des extrémités de la barre, ce qui ergonomiquement gênerait un peu la manipulation.

On plus à tout moment ajuster de plus près à la période qu'on veut couvrir en naviguant... Le plus simple est de modifier le +6 de la 2e ligne, toute variation d'une unité fera varier le max de 100 jours dans un sens où l'autre (ou on peut mettre une formule de définition de m plus fine si on le souhaite).

En tout cas, si on opère une modification, il suffit d'un clic pour faire réexécuter la procédure et le nouveau Max est immédiatement pris en compte. Et cela est sans incidence sur le reste du fonctionnement.

Pour l'occasion, la dernière version qui comporte un sélecteur de date à atteindre utilisant 3 SpinButtons placés dans la cellule A1 : de gauche à droite chaque bouton-toupie fait varier respectivement de 1 an, 1 mois, 1 jour la date initialement en G3, la nouvelle date cible s'affichant en A1. Lorsqu'on a atteint la date voulue, on clique sur le bouton Aller à et le calendrier se recadre avec la date visée en G3 (A1 s'efface alors). Un autre bouton portant l'intitulé Aujourd'hui permet de réaligner le calendrier sur la date du jour en G3.

NB- ces dispositifs ne sont pas autonomes les uns des autres, c'est toujours la valeur de la ScrollBar (cellule liée en M1) qui conditionne l'affichage du calendrier et déclenche la mise à jour de l'affichage des données. Les dates définies au moyen du sélecteur ou par le bouton Aujourd'hui passent par une modification de la valeur de la ScrollBar qui seule conditionne l'affichage.

Pour les calculs, relis les indications que j'ai déjà données. Le calendrier étant mouvant, les formules pour opérer des calculs sur les données sont bannies, ce doit être remplacé par des calculs faits automatiquement pour que seuls les résultats soient insérés... Il faudrait m'indiquer toutes les formules que tu souhaiterais mettre de façon que je puisse les traduire en procédures...

Cordialement.

Rechercher des sujets similaires à "liste deroulante recherche"