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
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
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:
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 Ifmerci beaucoup pour ton fichier !!
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 ThenRien que là on a pas mal de chose à comprendre
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 SubIci 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
If objet is Nothinget
If Not objet is NothingIci, 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).ColumnIci 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 - 70Pour 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) + 1Ici 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 = FalseEt 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,
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