Forum Clubic

Masquer et demasquer des colonnes en VBA sur Excel selon la date

Bonjour a tous

Je voudrais :

Masquer ou démasquer certaines colonnes dans une feuille en VBA selon le nombre de semaines écoulées depuis le 1er janvier.

Par exemple si nous sommes semaine 27 par exemple, ne laisser visible sur la feuille que les colonnes 27 et 28 ?

Est-ce possible?

Merci d’avance aux doués qui voudront bien m’aider a réaliser ce code.
Edité le 08/06/2008 à 13:54

C’est faisable par macro, soit à l’ouverture du classeur, soit en mettant dans la feuille un bouton destiné à cet effet.
Dans les deux cas, il faudra écrire une macro (en VBA), et le problème est qu’il n’existe pas (à ma connaissance) de fonction VBA retournant le numéro de la semaine.
Par contre, il existe une fonction excel pour le faire.
Donc une solution simple pourrait être celle-là :

  • choisir une cellule de la feuille.
    pour l’exemple, on va dire A1, mais ce peut être n’impote quelle autre, même dans une autre feuille, il suffit d’adapter la macro
  • y mettre la formule
    =NO.SEMAINE(AUJOURDHUI())
  • dans la macro servant à masquer, mettre simplement la ligne
    range(cells(1,1), cells(1,range(“A1”))).entirecolumn.hidden=true
  • mettre la macro en auto exec à l’ouverture du classeur ou créer sur la feuille un bouton pour la lancer

Edit:
Pour démasquer
columns(“A:BZ”).hidden=false
Edité le 06/06/2008 à 21:21

Merci gcc de t’être penché sur mon problème. Finalement j’ai opté pour une autre solution. Je voulais afficher dans chaque feuille la période en cours (du 26 au 25) et la période suivante. je suis passé par le nombre de jours écoulés depuis la dernière période de l’année précédente que j’ai divisé par 31 jours. Tout cela me parait fonctionner parfaitement bien. mon code me parait un peu lourd et manque d’élégance, on pourrait sans doute l’améliorer. Pour information, chaque période fait 6 colonnes de largeur, et l’année commence Colonne “B” et se termine colonne “CA”. Voici le code que j’ai écrit, en changeant la date horloge du PC , on peut vérifier que toutes les feuilles affichent bien seulement les deux périodes voulues selon la date du jour. Le plus difficile étant de convertir la valeur de la colonne en string, mais j’ai facilement trouvé la petite macro sur internet

Private Sub Worksheet_Activate()
’ On n’affiche que les deux mois en cours
Dim DateFinPrec, i As Long, x As Long, s As String, lettrecol As String

'nombre de jour écoulés depuis le 25 decembre 2007
DateFinPrec = DateSerial(2007, 12, 26)
nbjour = -DateDiff("d", Now, DateFinPrec)

'on affiche toutes les colonnes
Range(Columns("B"), Columns("CA")).EntireColumn.Hidden = False

'calcul des colonnes à masquer avant les deux périodes
colamasquer = Int(nbjour / 31 * 6) ' Autant de fois qu'il y a de périodes de 31 jours écoulées on ajoute 6 colonnes

'on converti la valeur de la dernière colonne a masquer en string
Numerocol = colamasquer
For i = 6 To 0 Step -1
x = (26 ^ (i + 1) - 1) / 25 - 1
If Numerocol > x Then
s = s & Chr(((Numerocol - x - 1) \ 26 ^ i) Mod 26 + 65)
End If
Next i
lettrecol = s

'on masque avant les deux mois en cours
Range(Columns("B"), Columns(lettrecol)).EntireColumn.Hidden = True

' on remet la variable a vide
s = ""

' et on recalcule ou recommencer a masquer
Numerocol = colamasquer + 13
For i = 6 To 0 Step -1
x = (26 ^ (i + 1) - 1) / 25 - 1
If Numerocol > x Then
s = s & Chr(((Numerocol - x - 1) \ 26 ^ i) Mod 26 + 65)
End If
Next i
lettrecol = s

' On masque a partir de cette colonne jusqu'a la fin du fichier
Range(Columns(lettrecol), Columns("CA")).EntireColumn.Hidden = True
Range("A1").Select

End Sub

Une proposition de simplification ou écriture plus élégante de ce code serais très sympa. Mais ma question est toutefois résolue.
Edité le 07/06/2008 à 16:45

Si j’ai bien compris, tes données évoluent mois par mois et non semaine par semaine, et il y a 6 colonnes pour chaque mois.
Egalement, tu travailles sur 13 mois, puisque le tableau s’arrête en janvier.

je n’ai pas testé, mais le coup du 31, ça me laisse dubitatif, je ne suis pas sûr que les jours en bordure de période (24,25,27) soient toujours traités dans leur bonne période.

Sinon, ta méthode chr(x)+64 pour obtenir la lettre en fonction de la valeur numérique est bonne (c’est chr(x)+48 pour convertir un chiffre sous forme de chaine), mais tu peux faire autrement, en utilisant cells à la place de Range, ou travaillant avec les offsets.

Pour DateFinPrec, tu seras obligé de le modifier manuellement en fin d’année ;
Tu peux peut être mettre
DateFinPrec = DateSerial(year(now) -1, 12, 26)
Ca ne marchera pas entre le 26/12 et le 01/01, mais bon …

sinon, si tu veux un code un peu léger, je peux te proposer ce qui suit :
Tant qu’à faire d’utiliser DateDiff, autant lui demander de retourner des mois plutôt que des jours (DateDiff(“m”,…)

Le code devient
Dim today As Date, currentmonth As Integer, coloffset As Integer

’ démasquer toutes les cellules
Range(“B:CA”).EntireColumn.Hidden = False

'provisoire pour la mise au point : plutôt que de changer l’heure du PC, on met la date dans la 1e cellule de la feuille
il suffira ensuite de remplacer par today=now

today = DateValue(Range(“A1”))
currentmonth = DateDiff(“m”, DateSerial(Year(today) - 1, 12, 26), today)
If Day(today) > 25 Then
currentmonth = currentmonth + 1
End If

’ calcul du nombre de colonnes à masquer à gauche;
-1 car on ne compte pas la colonne B

coloffset = 6 * (currentmonth - 1) - 1
If coloffset > 0 Then
Range(“B1”, Range(“B1”).Offset(0, coloffset)).EntireColumn.Hidden = True
End If

’ masquage des colonnes de droite
coloffset = 6 * (12 - currentmonth) - 1
If coloffset > 0 Then
Range(“CA1”, Range(“CA1”).Offset(0, -coloffset)).EntireColumn.Hidden = True
End If

Merci gcc pour ce code effectivement plus léger et bien plus élégant ,qui fonctionne parfaitement. Sans vouloir abuser, comment dois-je modifier le contrôle If Day(Today)>25 pour que le changement de masque ne se fasse qu’au 10 du mois suivant et non le 26 de la période courante. en effet certaines informations sont encore susceptibles d’êtres vues ou modifiées jusqu’à cette date ou elles sont définitivement figées.

Hors sujet … gcc = j’ai cessé? Ou coincidens d’initiales??? Pure curiosité…

merci pour la qualité et la rapidité de tes conseils

Cordialement
Edité le 08/06/2008 à 13:59

Finalement poser une question n’empêche pas de chercher. J’ai trouvé la modification a faire:

Private Sub Worksheet_Activate()

Dim today As Date, currentmonth As Integer, coloffset As Integer
today = Now
currentmonth = DateDiff(“m”, DateSerial(Year(today) - 1, 12, 26), today) - 1
If Day(today) > 9 Then currentmonth = currentmonth + 1

’ démasquer toutes les cellules
Range(“B:CA”).EntireColumn.Hidden = False

’ calcul du nombre de colonnes à masquer à gauche;
coloffset = 6 * (currentmonth - 1) - 1
If coloffset > 0 Then Range(“B1”, Range(“B1”).Offset(0, coloffset)).EntireColumn.Hidden = True

’ masquage des colonnes de droite
coloffset = 6 * (12 - currentmonth) - 1
If coloffset > 0 Then Range(“CA1”, Range(“CA1”).Offset(0, -coloffset)).EntireColumn.Hidden = True

End Sub

Merci encore pour ton aide très appréciable.

Cordialement

:jap:

[hors_sujet] GCC rien que de très prosaïque
C’est G comme groupe, compte créé à l’origine pour faire prendre aux stagiaires la (bonne) habitude de chercher un peu par eux mêmes avant de faire le siège de mon bureau.[/hors_sujet]