Bouton pour changer les année sur planning

Bonjour,

j'ai commencé à faire un fichier mais je suis coincé

mon fichier est un planning avec des semaines de tous année sur la même feuille

j'aimerai faire un bouton qui changer les années +1 ans ou -1 ans

ci quelle qu'un a une piste ou ce genre de fichier

merci

35planning.zip (67.16 Ko)

Bonjour,

Une solution serait de tout étaler sur plusieurs colonnes et de masquer automatiquement les colonnes qui ne sont pas dans l'année sélectionnée, c'est simple et ne demande pas de création de base de données.

Il faut juste me donner un jeu de données suffisant pour que je te code ça, pour le moment tu n'as le contenu que d'une année sur ta feuille, il m'en faudrait plus

Bonjour,

Un fichier xls (Excel 97-2003) crée en 1996 !...

Cdlt.

bonjour Ausecour

désolé de ne pas avoir répondu avant

voici le fichier avec quelque années

merci

85new.xlsm (448.03 Ko)

Bonjour,

Merci pour le fichier, il me manque malheureusement encore une information, comment sais-tu quelle est l'année de ta plage de cellules, j'ai par exemple la première plage qui va de la semaine 1 à 52, mais je n'ai pas la moindre idée de l'année à laquelle ça correspond, et si je ne sais pas ça, la macro ne le saura pas non plus, ça commence donc en 1996 et tu as ensuite 1997, 1998 et ainsi de suite, sans interruption?

bonjour,

j'aimerai commencer de 2018 jusqu’à 2040 minimum ou plus sans interruption oui =) stp

merci

bonne journée

Re,

Je te propose cette solution:

66copie-de-new.xlsm (482.54 Ko)

Tu verras que les colonnes affichées ne sont pas toujours les mêmes

Je viens de regarder ton fichier parfait

j'ai regarder le code je ne suis pas expert en VBA ce code j'ai du mal a le comprendre

If Not Range(Cells(1, 12), Cells(1, derCol)).Find(annee, lookat:=xlWhole) Is Nothing Then
    colAnnee = Range(Cells(1, 12), Cells(1, derCol)).Find(annee, lookat:=xlWhole).Column
    colDep = colAnnee - 70
    nSem = WorksheetFunction.Max(WorksheetFunction.WeekNum(DateSerial(annee, 12, 31), 21), _
        WorksheetFunction.WeekNum(DateSerial(annee, 12, 31) - 7, ))
    colFin = colDep + 2 * (nSem - 1) + 1

    Range(Cells(1, colDep), Cells(1, colFin)).EntireColumn.Hidden = False
End If

merci beaucoup pour ton fichier !! ça m’enlève une bonne épine du pied

maintenant je vais essayer de comprendre comment le code fonctionne pour si un jour j'ai besoin de faire des modif ou de refaire pareil sur un autre fichier on ne sais jamais

encore merci

bonne fin de journée

Bonjour,

Dans ce cas je vais essayer de décortiquer un peu ce que j'ai écrit

If Not Range(Cells(1, 12), Cells(1, derCol)).Find(annee, lookat:=xlWhole) Is Nothing Then

Rien que là on a pas mal de chose à comprendre je vais déjà commencer par te dire qu'il existe deux grandes familles de variables, les "simples", les variables qui contiennent des nombre, du texte, une valeur True ou False... et les objets, qui contiennent plein de choses, des méthodes/fonctions, des propriétés (variables de l'objet). Un Range, qu'on peut aussi appeler plage de cellules, contient différentes propriétées, le nombre de cellules qu'il contient par exemple, on peut faire Range.Cells.Count pour y accéder.

Ces deux grandes familles de varables ne se manipulent pas de la même façon, et pour savoir si elles sont vides ou non... on écrit pas non plus de la même façon... Voici un petit code exemple pour te montrer:

Sub test()
Dim a As String
Dim b As Integer
Dim bol As Boolean
Dim cellule As Range

MsgBox (a)
MsgBox (b)
MsgBox (bol)
If cellule Is Nothing Then MsgBox ("cellule n'existe pas")
End Sub

Ici si tu essayais d'afficher directement cellule via un msgbox, tu aurais fait planté ton code, car comme l'objet n'existe pas, tu ne peux pas l'afficher pour tester qu'un objet existe ou non, on utilise le test

If objet is Nothing

et

If Not objet is Nothing

Ici, mon test revient à savoir si un objet existe ou non, il ne reste plus qu'à savoir lequel:

Range(Cells(1, 12), Cells(1, derCol)).Find(annee, lookat:=xlWhole)

Ici on utilisé une fonction propre à un objet Range, la fonction Find, cette fonction permet de chercher une valeur dans une plage de cellules, et si elle la trouve, renvoie un objet Range qui est la cellule où se trouve la valeur trouvée, la fonction s'arrête à la première cellule qui contient la valeur que l'on cherche. J'ai ajouté un paramètre pour dire que je voulais comparer ma valeur cherchée à la totalité du contenu de la cellule, si je n'avais pas fait ça, tu peux chercher 2019, et avoir 20190 en résultat... bon ici ça a peu de chance d'arriver, mais je préfère le préciser quand même dans la fonction

Et bien sûr pour chercher une valeur, il faut lui donner une plage de cellules dans laquelle chercher, ici j'utilise Range(cellule1, cellule2) cellule 1 c'est la cellule ligne 1, colonne 12, et la cellule 2 et la cellule ligne 1, à la dernière colonne de l'ensemble des années.

colAnnee = Range(Cells(1, 12), Cells(1, derCol)).Find(annee, lookat:=xlWhole).Column

Ici c'est exactement la même recherche, sauf que je décide de renvoyer la valeur de la propriété "colonne" de ma cellule, pour savoir quel est son numéro de colonne, que j'enregistre dans une variable, cette colonne correspond donc à celle qui contient l'année que l'on chercher à la ligne 1 de la feuille.

colDep = colAnnee - 70

Pour savoir quelles colonnes je dois révéler, je dois faire quelques calculs, ton année se trouve en plein milieu de ton année, à 70 colonnes de la colonne de départ pour être exact

nSem = WorksheetFunction.Max(WorksheetFunction.WeekNum(DateSerial(annee, 12, 31), 21), _
        WorksheetFunction.WeekNum(DateSerial(annee, 12, 31) - 7, ))

Là ça peut parraître un peu compliquer donc je vais expliquer, je devais savoir combien de semaines contenait l'année, pour ça j'ai voulu voir le numéro de semaine maximum que j'avais entre le 31 décembre et le 24 décembre, DateSerial permet de créer une date en lui donnant une année, un mois, et un jour, la fonction WorksheetFunction.WeekNum est la fonction NO.SEMAINE, tu lui donnes une date, et la méthode de calcul (j'ai pris 21 car c'est la norme française de mémoire).

Ce numéro de semaine me servira à calculer le nombre de colonnes que contient l'année

colFin = colDep + 2 * (nSem - 1) + 1

Ici pas de surprise, je calcule la colonne de fin, d'ailleurs j'ai fait une petite erreur, tu ne verras pas les 2 colonnes de synthèse normalement, il faut remplacer "+1" par "+3"

Si ce calcul n'est pas explicite, tu me le diras

Range(Cells(1, colDep), Cells(1, colFin)).EntireColumn.Hidden = False

Et enfin, on utilise encore l'objet Range avec une propriété, Hidden, qui permet de dire si la plage de cellules est masquée ou non, je regarde si c'est la colonne qui est masquée, en utilisant EntireColumn. Encore une fois, j'utilise deux cellules, première ligne, colonne de départ, et première ligne, colonne de fin, le numéro de ligne importe peu comme on va prendre toute la colonne, je mets ensuite la valeur de la propriété à False afin d'afficher ces colonnes

bonjour Ausecour,

super explication ! merci beaucoup d'avoir pris le temps de tout détailler.

cela servira à plus d'un

encore un grand merci pour tout explication et le fichier rien a dire !!

bonne journée

Re,

de rien

Merci d'avoir passé le sujet en résolu

Rechercher des sujets similaires à "bouton changer annee planning"