Calendrier d'entreprise dynamique

Bonjour,

Je créer ce poste après des heures de recherche et malheureusement sans rien trouver qui puisse réellement m'aider.

Je fais un calendrier pour mon entreprise, mais j'ai quelques soucis :

1. Génération des dates

Comme tout calendrier en VBA j'aimerais que les jours puisses se charger selon l'année et le mois qui sont mis en SpinButton.

Sur mon calendrier, je n'ai pas les samedi et dimanche, j'aimerais donc qu'il regarde également si c'est un lundi mettre dans la première des 5 cases, etc.. pour chaques semaine (j'affiche également les numéros de semaine ISO avec une formule selon la date).

2. Mise en forme

Le calendrier se charge et le tableau se rempli avec les informations de ma feuilles DATA, cependant le bas de mon tableau devrait avoir une ligne en gras (comme le haut, les cotés,etc..) mais elle ne s'affiche jamais. J'ai eu beau chercher de quoi venais se problème, mais sans résultat.

3. Actualisation des absences

J'aimerais également que les absences se charge sur la feuille calendrier en prenant comme base de données la feuille "DB_ABS", j'ai ma petite idée pour ça mais je ne sais pas comment dire en VBA d'aller d'une date à une autre et faire de même avec toutes celles qui sont entre..

4. Rapidité

Je suis encore débutant en VBA et je sais que mes codes sont très loin d'être optimale. Ce qui a pour effet d'avoir un fichier un peu lent, surtout pour charger les données, car celui-ci devrais être adapté à 500 lignes environ.

Je m'intéroge donc sur les moyens d'augmenter la rapidité de mon fichier ?

Voilà les points qui me sont un peu bloquant actuellement.

Je ne cherche pas un code miracle tout fait, mais au moins que l'on puisse m'aiguiller sur les bonnes fonctions, synthaxe.

Merci beaucoup :)

Kilian

Bonjour,

je me décide à répondre car personne n'a pris en charge ce sujet

mon soucis est que le fichier génère pas mal d'erreurs déjà

capture d ecran 462 capture d ecran 463

Tu utilises peut-être un calendrier particulier ...

Ma configuration excel est une configuration standard sans ajout et c'est volontaire de façon à avoir une réponse la plus universelle. Donc attention dans ton cas en cas d'évolution de ta version d'excel et/ou export auprès d'autres personnes de ton planning de ne pas bloquer ton fichier.

Sur mon calendrier, je n'ai pas les samedi et dimanche, j'aimerais donc qu'il regarde également si c'est un lundi mettre dans la première des 5 cases,

Pas compris. Cette phrase me parait être emprunté au langage chinois ! en français cela donne quoi ? qu'est-ce que tu souhaites ?

2. Mise en forme

le bas de mon tableau devrait avoir une ligne en gras (comme le haut, les cotés,etc..)

3. Actualisation des absences

J'aimerais également que les absences se charge sur la feuille calendrier en prenant comme base de données la feuille "DB_ABS"

4. Rapidité

fichier un peu lent, surtout pour charger les données, car celui-ci devrais être adapté à 500 lignes environ.

N'ayant pas accès au fichier je ne peux pas répondre aux points 2 et 3.

Pour le 4, pour accélérer une macro qui fait appel à un grand nombre de données, il y a plusieurs actions possibles :

  1. se méfier des MFC qui parfois se multiplient à l'infini
  2. screenupdating : bloquer l'écran en début d macro et le rafraichir à la fin https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.screenupdating
  3. xlcalculation : passer en manuel le temps de la macro https://docs.microsoft.com/fr-fr/office/vba/api/excel.xlcalculation
  4. éviter les appels aux feuilles pendant le déroulé de la macro, dans ce cas travailler avec des tableaux (array), surtout que 500 lignes c'est in fine très peu

Hello Steelson,

Tout d'abords je te remercie pour ta réponse.

Je ne comprend pas bien l'erreur dû aux objets car j'utilise des objets excel standard (a l'exception d'une image..), voici le rendu :

image

Concernant la bibliothèque je penses qu'il s'agit de Microsoft Outlook 16.0 que j'ai ajouté pour une macro, je m'en suis déjà servi dans d'autres fichier et jamais eu de problème.

Pas compris. Cette phrase me parait être emprunté au langage chinois ! en français cela donne quoi ? qu'est-ce que tu souhaites ?

Peut-être me suis-je mal exprimé, comme tu peux le voir ci-dessus, en dessous de chaque semaine il y a 5 cellules qui correspondent aux dates et au jour de la semaine. J'aimerais que lorsque je change de mois, les jours de la semaine ce mettent correctement selon leurs jours, exemple :

Cellule E5 = Lundi, F5 = Mardi, G5 = mercredi, etc...

2. Mise en forme

Comme nous pouvons le voir sur ton image et sur la mienne, le bas de la ligne 22 n'est pas mis en gras comme sur les côtés, le reste du tableau se génère automatiquement, mais je n'arrive pas à mettre celle-ci dans la même mise en forme.

4. Rapidité

Je comprend bien que 500 lignes ce n'est pas beaucoup, mais si je pose la question c'est qu'avec seulement 22 lignes ça me paraît déjà lent..

Mais je prend bien note de tes réponses et je vais approfondire ceci.

Pour les points 1 et 3, je remet mon fichier, en espérant que cette fois-ci ça marche.

Merci,

Kilian

Pour le point 1,

  1. j'ai remplacé les spin bouton par des toupies (contrôle de formulaire) qui permettent de lier à des cellules,
    1. en l'occurrence C2 pour l'année
    2. et D2 pour le mois, E2 est donc issu de C2.
  2. j'ai mis des formules pour le premier lundi du mois ou du premier lundi précédent le début de mois
  3. ainsi qu'une formule et un format spécial pour le numéro de semaine
  4. et enfin une MFC pour "cacher" les jours en dehors du mois affiché

les macros de spin.button sont inutiles (c'est déjà pas mal car je pense que le premier adage pour bien utiliser VBA c'est parfois de s'en passer).

je vais regarder les autres points

B25 est à supprimer (c'était provisoire pour contrôler que je commençait bien un lundi)

Point 2 : change le format de tableau

capture d ecran 469

Pour le point 3

=SI(SOMMEPROD((Absences[Matricule]=[@Colonne2])*(Absences[Absent au]<=E$5)*(Absences[Absent de]>=E$5))>0;"x";"")

à recopier en faisant copier/coller (ne pas tirer à droite)

attention à l'ordre dans l'onglet absence ...

capture d ecran 471

Pour le point 4, désolé, trop copieux ! ma règle est que la somme des codes ne doit pas dépasser une feuille A4.

Merci beaucoup pour ton investissement, je vais regarder tout ça !

Il faudrait que j'apprenne à ne pas me compliquer la tâche, souvent les formules suffisent plutôt qu'un bout de code..

Pour ta formule :

=SI(SOMMEPROD((Absences[Matricule]=[@Colonne2])*(Absences[Absent au]<=E$5)*(Absences[Absent de]>=E$5))>0;"x";"")

Elle ne convient pas très bien, car j'ai plusieurs type d'absences qui doivent afficher différentes couleur et texte.

image Avec une formule =SI ça va données quelques choses de très long.. C'est pour ça que je voulais en VBA ajouté le type d'absences qu'il y a en cellule D2 de la feuille DB_ABS et juste faire des MFC. Même si je craint que ça ralentisse le tout.

ok, je n'avais pas vu où était cette grille et les différents cas

cela justifie en effet une macro, mais il y en a déjà une (qui bloque chez moi)

Private Sub Worksheet_Activate()

je te ferai une proposition demain, qui comprendra aussi la MFC qu'il vaut mieux rafraîchir à chaque chargement.

autre question ... la date de retour doit-elle être comptée en absence ou présence ?

tu as aussi certains horodatages, est-ce nécessaire ?

Dans la feuille DATA tu trouveras toutes ces infos.

Cette macro qui te bloque me sert à afficher mes secteurs que je prend en colonne N de la feuille DATA. Mais je songe à un autre système car ce n'est pas idéale.

Merci beaucoup déjà pour toutes ces propositions

Les dates : "Absent de" et "Absent au" sont compté comme absence.

L'horodatage n'est pas nécessaire, il s'agissait juste d'un test.

J'ai ajouté un module RafraichirFeuilleCalendrier

Sub rafraichir()
Dim motifs As Object, cle As Variant
Dim derL%, i%, j%, m%, a%
Dim jours, matricules, tableau, absences

    Set motifs = CreateObject("Scripting.Dictionary")
    With Sheets("DATA")
        For i = 2 To .Range("Q" & Rows.Count).End(xlUp).Row
            motifs(.Range("Q" & i).Value) = .Range("R" & i).Value & "|" & .Range("R" & i).Interior.Color
        Next
    End With

    absences = Sheets("DB_ABS").ListObjects(1).DataBodyRange
    jours = ActiveSheet.Range("E5:AC5")
    matricules = ActiveSheet.Range("Tableau2[[Colonne2]]")
    ReDim tableau(1 To UBound(matricules, 1), 1 To UBound(jours, 2)) ' ActiveSheet.Range("Tableau2[[Colonne6]:[Colonne30]]")

    ActiveSheet.Range("Tableau2[[Colonne6]:[Colonne30]]").ClearContents
    ActiveSheet.Range("Tableau2[[Colonne6]:[Colonne30]]").Interior.Color = xlNone
    For m = 1 To UBound(matricules, 1)
        For j = 1 To UBound(jours, 2)
            For a = 1 To UBound(absences)
                If matricules(m, 1) = absences(a, 1) Then
                    If jours(1, j) <= absences(a, 2) And jours(1, j) >= absences(a, 3) Then
                        tableau(m, j) = Split(motifs(absences(a, 4)), "|")(0)
                        Range("E6").Offset(m - 1, j - 1).Interior.Color = Split(motifs(absences(a, 4)), "|")(1)
                    End If
                End If
            Next
        Next
    Next
    Range("E6").Resize(UBound(matricules, 1), UBound(jours, 2)) = tableau
End Sub

Il faudrait que tu remettes les traits verticaux qui se sont effacés ! désolé ...

ça à l'air de marcher, juste je vois que les dates d'absences "DE" et "AU" ont été échanger (dû au faites que mon userform chargeais les dates à l'envers je suppose).

J'ai remis tout ça dans un autre calendrier (car dans celui que tu m'as joint les userforms n'avait plus certain champs) et ça ne fonctionne malheureusement plus..

Quand je remet les dates dans l'autre sens, elle s'affiche mais ne disparaisse pas au changement de mois ou d'année.

Peux-tu encore regarder stp

C'est en effet ce que j'vais signalé !

attention à l'ordre dans l'onglet absence ...

Je ne peux pas utiliser ton fichier à cause de nombreuses erreurs qu'il génère chez moi. Je pense que c'est dû à l'absence de déclaration des variables cette fois-ci.

Pour que la macro fonctionne il faut que tes toupies mois et année appellent la macro rafraichir

J'ai remis tout ça dans un autre calendrier (car dans celui que tu m'as joint les userforms n'avait plus certain champs) et ça ne fonctionne malheureusement plus..

si tu as inversé les dates du et au, alors il faut inverser les indices 2 et 3 ici :

If jours(1, j) <= absences(a, 2) And jours(1, j) >= absences(a, 3) Then

fais le test, on verra

Si tu as beaucoup de données et que la mise à jour (rafraichissement) te semble long, il est possible de l'optimiser. Dans un premier temps je l'ai fait de façon très (trop) séquentielle.

C'est en effet ce que j'vais signalé !

Ah, je ne l'avais pas compris dans ce sens là.

J'ai donc inverser les arguments deux et trois et tout fonctionne très bien !

Pour l'instant, il n'y aura pas énormément de ligne donc ça devrait aller, je regarderai la rapidité en temps voulu.

Dernier problème, qui m'est d'ailleurs déjà arrivé sur d'autre fichier, lorsque j'ajout via un userform une absences, elle s'ajoute dans le tableau en décaler, voir code et exemple :

With Sheets("DB_ABS")
    .Range("A" & Rows.Count).End(xlUp).Offset(1).Value = absences.TextBox1.Value 'Ajoute le numéro de matricule
    .Range("B" & Rows.Count).End(xlUp).Offset(1).Value = absences.DTPicker3.Value 'Ajoute la date du début d'absence
    .Range("C" & Rows.Count).End(xlUp).Offset(1).Value = absences.DTPicker2.Value 'Ajoute la date de la fin d'absence
    .Range("D" & Rows.Count).End(xlUp).Offset(1).Value = absences.ComboBox2 'Ajoute le type d'absences
End With

If absences.CheckBox1 = True Then
Sheets("DB_ABS").Range("E" & Rows.Count).End(xlUp).Offset(1).Value = "Yes"
Else
Sheets("DB_ABS").Range("E" & Rows.Count).End(xlUp).Offset(1).Value = "No"
End If
image

J'avais chercher pourquoi il considère une ligne d'un tableau étant non vide, mais rien trouvé de concluant.. Peux être connais-tu une autre alternative ?

J'utilise rarement des UserForm

mais voici une solution à tester

With Sheets("DB_ABS")
    ligne = .Range("A" & Rows.Count).End(xlUp).row + 1
    .Range("A" & ligne).Value = absences.TextBox1.Value 'Ajoute le numéro de matricule
    .Range("B" & ligne).Value = absences.DTPicker3.Value 'Ajoute la date du début d'absence
    .Range("C" & ligne).Value = absences.DTPicker2.Value 'Ajoute la date de la fin d'absence
    .Range("D" & ligne).Value = absences.ComboBox2 'Ajoute le type d'absences
End With

au passage, DTPicker n'est plus souvent utilisé, et c'est l'une des raisons du plantage chez moi

Rechercher des sujets similaires à "calendrier entreprise dynamique"