Optimisation de calendrier

Medestrac -  
 Medestrac -
Bonjour,

Je veux faire un calendrier dans Excel: dans chaque cellule de la ligne 5 j'ai le numéro du jour, en ligne 4 j'ai le "nom" du jour, en ligne 3 j'ai une fusion de 7 cellules par semaine avec le numéro de semaine,
en ligne 2 j'ai une fusion de x cellules par mois avec le "nom" du mois.
Je remplis tout ça d'après une variable "annee" de la manière suivante:
annee = 2022
StartDate = DateSerial(annee, 1, 1)
EndDate = DateSerial(annee, 12, 31)
Jours = DateDiff("d", StartDate, EndDate) + 1

***blabla clearcontents et unmerge pour débuter sur une base saine...je passe***
For j = 1 to Jours
 cells(5,j).value = StartDate + j -1
 cells(4,j).value = Format(StartDate + j - 1, "ddd", vbMonday, vbFirstFourDays)

'Si le jour est un dimanche: je fusionne les 7 cellules en ligne 3
If Weekday(StartDate + j - 1) = vbSunday Then
  Select Case j
    Case 1 :'rien, pas de mise en forme particulière   
    Case Is <= 7
      Range(Cells(3, 1), Cells(3, 6 + j)).Merge
      Range(Cells(3, 1), Cells(3, 6 + j)).Borders(xlEdgeLeft).LineStyle = xlContinuous
      Range(Cells(3, 1), Cells(3, 6 + j)).Borders(xlEdgeRight).LineStyle = xlContinuous
      Cells(3, 1).Value = "S" & DatePart("ww", Cells(5, 4).Value, vbMonday, vbFirstFourDays)
    Case Is > Jours - 7
      Range(Cells(3, j-6 ), Cells(3, j)).Merge
      Range(Cells(3, j -6), Cells(3, j)).Borders(xlEdgeLeft).LineStyle = xlContinuous
      Range(Cells(3, j -6), Cells(3, j)).Borders(xlEdgeRight).LineStyle = xlContinuous
      Cells(3, j - 6).Value = "S" & DatePart("ww", Cells(5, j - 6).Value, vbMonday, vbFirstFourDays)
      Range(Cells(3,  j+1), Cells(3, Jours)).Merge
      Range(Cells(3, j+1), Cells(3, Jours)).Borders(xlEdgeRight).LineStyle = xlContinuous
      Cells(3,  j+1).Value = "S" & CInt(DatePart("ww", Cells(5, j - 6).Value, vbMonday, vbFirstFourDays)) + 1
    Case Else
      Range(Cells(3, j - 6), Cells(3, j)).Merge
      Range(Cells(3, j - 6), Cells(3, j)).Borders(xlEdgeRight).LineStyle = xlContinuous
      Cells(3, j - 6).Value = "S" & DatePart("ww", Cells(5, j - 6).Value, vbMonday, vbFirstFourDays)
    End Select

  End If

'si le jour est un premier, je fusionne les x jours du mois en ligne 2
  If Day(StartDate + j - 1) = 1 Then
            nb_jours = Day(DateSerial(annee, Month(StartDate + j - 1) + 1, 1) - 1)
            Range(Cells(2, j), Cells(2, j + nb_jours - 1)).Merge
            Range(Cells(2, j), Cells(2, j + nb_jours - 1)).Borders(xlEdgeRight).LineStyle = xlContinuous
            mois = Format(StartDate + j - 1, "MMMM")
            Cells(2, j).Value = UCase(Left(mois, 1)) & Right(mois, Len(mois) - 1)
  End If

Next j


Mais que c'est long!!! J'ai bien sur fait
application.screenupdating = false 
application.calculation = xlmanual


Quelqu'un a des idées pour accélerer tout ça?
PS: La mise en forme est imposée...sinon je me passerai bien des merge.

Configuration: Windows / Firefox 97.0
A voir également:

4 réponses

f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Bonjour,

Mais que c'est long!!!
Qu'est qui est long, car temps d'execution: 0.078s, ceci
sans
application.screenupdating = false
application.calculation = xlmanual

0.046s avec
0
Medestrac
 
Hein??? Ca a tourné pendant 32s chez moi!

J'ai optimisé en créant un tableau tblAnnee(1,Jours) que je remplit avec les jours en 0 et les noms de jours en 1, puis je colle d'un coup en faisant
range(cells(4,1),cells(5,Jours)) = tblAnnee

Je suis descendu à 2s.

PS: je le fais sur 2 feuilles successivement. Donc 1s par feuille. C'est déjà plus raisonnable...mais bien plus élevé que les 0.078s!
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Re,

Pouvez mettre votre fichier a dispo?

Pour transmettre un fichier,
Veillez a ce qu'il n'y ait PAS DE DONNEES CONFIDENTIELLES
il faut passer par un site de pièce jointe tel que cjoint.com

Allez sur ce site : https://www.cjoint.com/
Clic sur parcourir,
Cherche ton fichier,
clic sur ouvrir,
Clic sur "Créer le lien cjoint",
Copier le lien,
Revenir ici le coller dans une réponse...
0
Medestrac
 
Je ne peux pas, mon fichier contient des données confidentielles et surtout des dizaines de macros, créées par plusieurs personnes différentes.
J'ai copié uniquement ma feuille dans un nouveau classeur, avec le code en question. Exécution en 0.56s (il n'y a plus qu'une feuille au lieu de 2)...là ça passe tout seul.
Quelque chose m'échappe...mais visiblement ça se passe dans le classeur d'origine et je ne peux pas le partager.
Merci quand même pour le coup de main.
0