Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Excel-VBA - Problème de bouche trop longue

yannos12

XLDnaute Nouveau
Bonjour,
J'ai un problème dans la gestion de mon fichier "vacances".
Le problème est un problème de lenteur de calcul dû à des boucles dans mon VBA qui contraignent le tout.
Je n'arrive pas à penser à une autre solution donc je fais appel à votre génie ;-)
Je ne peux pas partager mon fichier donc je vais essayer d'être assez clair dans mes explications.
J'ai une liste de 50 employés qui ont droit à 6 semaines de vacances.
Chaque employé peut définir 3 semaines de vacances prioritaires et 3 autres.

J'enregistre aujourd'hui dans un onglet 1 des numéros de semaine en face de chaque nom
Nom/InitialesPrio 1Prio 2Prio 2Autres 1Autres 2Autres 3
AS13751123552
AF2535362351

Ensuite je compile tout cela dans un autre onglet sur un calendrier lineaire ou j'empile les noms sous les numeros de semaine.

Numero Sem12...343536...5152
ASAF
ASAFAFAFASAS

Donc dans mon vba, je passe donc ligne par ligne, les 3 colonnes prioritaires pour empiler les demandes prioritaires puis je refais la même chose pour les autres.

Bref cela fonctionne mais c'est lourd.
Une idée pour alléger cela?

D'avance merci ;-)
 

vgendron

XLDnaute Barbatruc
En fait, on peut tout faire.. il faut juste avoir toutes les infos dès le départ (d'ou l'intérêt du fichier)
et il faut lister et décrire toutes les contraintes que tu as pour remplir
tu utilises beaucoup les couleurs j'ai l'impression.. il faudrait avoir une feuille qui décrit le code couleur
 

yannos12

XLDnaute Nouveau
Salut @vgendron ,
Je suis en train de compiler ton fichier dans le mien et encore merci de ton aide ;-)
Comme tu peux l'imaginer, je me heurte à des problématiques que je ne sais pas vraiment traiter avec cette gestion en tableau... Je t'explique.

Dans le fichier joint, j'ai rajouter 2 colonnes.Ancienneté: L'initiale qui a le plus gros chiffres va en bas de sa colonne en respectant les couleurs des vacances (bleu, bleu clair, rouge, jaune) Pour moi il faut donc faire le tri avant de charger les "Dico" . Comment?
Statut: Si il y a une date, il faut que les initiales apparaissent en blanc dans le tableau de report de l'onglet "Annuel"

Dernière spécialité... quand le fond de la cellule de l'onglet Vacances est en jaune, lors du report dans l'onglet "Annuel" il faudrait formater la cellule avec des diagonales.
Il restera une problématique des "Fisolés", actuellement le report ne reporte que les initiales, il faudrait que les dates en commentaires soient aussi transférées. Possible?
Merci ;-)
 

Pièces jointes

  • Essai vacances Ver5.xlsm
    137.5 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Hello

je viens de regarder ce qu'on avait fait.
jusquà présent, dans les dictionaire, on associe à chaque numéro de semaine, la liste des initiales

la.. ce que tu demandes, c'est de pouvoir aussi associé, une ancienneté + statut + couleur jaune

si on garde les dictionnaires, il faudrait modifier pour associer à chaque semaine, les 4 infos
la valeur serait donc constituée de ces 4 données
ensuite,
la restitution (viderdico) se chargerait d'isoler chaque information et de les traiter...

pour la coloration Jaune qui devient "hachurée": une MFC ne serait elle pas possible??
la question étant: qu'est ce qui justifie qu'une cellule est jaune ou pas?
 

yannos12

XLDnaute Nouveau
en pj, j'ai ajouté le tri en fonction de l'ancienneté
pour le reste..... je ne vois pas trop comment faire..
Je pense à un truc pour l'association "association+statut+couleur"...
Je peux imbriquer 3 Dico entre eux? Un pour chaque besoin.

L'histoire de la case avec fond jaune (puis diagonale sdans l'onglet annuel) est pour ne pas comptabiliser la semaine dans le calcul de présentiel des personnes mais la matérialisé quand même. En gros la personne voit que sa semaine est prise en compte mais elle n'est pas encore validée.
Faire manuellement serait source d'erreur.
 

vgendron

XLDnaute Barbatruc
Hello

Je peux imbriquer 3 Dico entre eux? Un pour chaque besoin.

oui c'est possible, mais je ne vois pas vraiment comment tu imagines la chose..
un exemple de dictionnaire de dictionnaires
L'auteur de ce site était sur ce forum, il est malheureusement décédé, il y a quelques mois..

VB:
Dictionnaire de dictionnaire
Sub DictionnaireDictionnaire()
  'Microsoft scripting runtime est coché
  Dim d1 As New Scripting.Dictionary
  Dim d2 As New Scripting.Dictionary
  Dim dd As New Scripting.Dictionary ' dictionnaire de dictionnaire
  Dim Ptr As New Scripting.Dictionary

  d1.Add "aa", 11: d1.Add "bb", 22
  d2.Add "cc", 33: d2.Add "dd", 44

  Set dd("dico1") = d1: Set dd("dico2") = d2

  Set Ptr = dd("dico1")
  MsgBox Ptr.Items(1): MsgBox Ptr("bb") ' affiche 22
  Set Ptr = dd("dico2")
  MsgBox Ptr.Items(1): MsgBox Ptr("dd") ' affiche 44
End Sub
 

yannos12

XLDnaute Nouveau
Tu m'as fait un Dico avec le rapport entre le numéro de semaine (clé) et les initiales (valeur).
Peut on faire un Dico avec un rapport entre Initiales et Statuts qui sera interrogé lorsque qu'on utilise les initiales?
Ou sinon peut on faire un Dico avec une 3ème valeurs (Initiales / Ancienneté / Statut) et lors du transfert si Statut est non-vide, on change la couleur de la police?
 

yannos12

XLDnaute Nouveau
J'ai vu comment rajouter la 3ème données dans la valeur ( & "*" & TabData(i,4) ) mais je n'arrive pas à y accéder pour la tester ensuite.
 

vgendron

XLDnaute Barbatruc
pour faire simple
un dictionnaire, c'est une liste de clés UNIQUE associées à des valeurs
tu choisis ce que tu veux comme étant la clé (=identifiant unique)

dans le cas présent, la clé correspond au numéro de semaine==> on a donc 52 clés différentes
la valeur est constituée de l'ensemble des initiales..
pour ajouter l'ancienneté, j'ai intégré l'info dans la valeur qui est donc constitué de "Initiale * Ancienneté"
pour pouvoir les distinguer par la suite, j'ai séparé avec une "*"

on a donc un dictionnaire qui contient les données suivantes (par exemple)
Clé: Semaine1 ==> Valeur = Initial1*Ancienneté1 / Initial2*Ancienneté2 / Inital38*Ancienneté38
Clé: Semaine2==> Valeur= Initial7*Ancienneté7 / Initial9*Ancienneté9 / Inital72*Ancienneté72

pour récupérer et isoler les informations contenues dans les valeurs, j'utilise la fonction Split(Valeur,"/")
j'obtiens donc un tableau de N éléments (N= Nb de clés)
chaque élément est constitué de INitial * Ancienneté

pour isoler Initial et Ancienneté, j'utilise à nouveau la fonction split mais avec le séparateur "*"
split(élément,"*")(0) ==> c'est la première partie de l'élement = initiale
split(élément,"*")(1) ==> c'est la deuxième partie de l'élément = ancienneté
maintenant, si tu veux y intégrer une information de plus, il te suffira de récuperer la troisième partie avec
split(élément,"*")(2)

sinon. pas de bouquin ( ca existe surement): perso ma source: c'est la touche F1 - Google et ce forum
 

yannos12

XLDnaute Nouveau
J'ai trouvé une solution autre plutôt que de changer la couleur de la cellule.
En fait ce qui m'importe est le total par semaine de personnes sous ce statut.
Donc sous le tableau j'ai rajouté une ligne où je répercute le décompte avec avoir compter depuis le split du tabaleau.
 

yannos12

XLDnaute Nouveau
Salut @vgendron
Comment je peux modifier ce transfert de t_Saisies vers TabData en ne transferant que les cellules qui ont un fond blanc par exemple?
Est ce qu'on peut imaginer un transfert cellule/cellule plus que la table en one shoot?

With Sheets("Vacances").ListObjects("t_Saisies") 'avec la table "t_Saisies" de la feuille Vacances
TabData = .Range.Value 'on met TOUT dans le tablo VBA
End With
 

yannos12

XLDnaute Nouveau
Et dernière problématique où je suis complètement "perdu". C'est la gestion des Commentaires pour mes "FIsolés"
J'ai besoin que dans l'Onglet "Annuel" apparaissent les initiales et en commentaires les "JIsolés" correspondant.
Ou à défaut le nombre de jours correspondant à ce numéro semaine.
 

Discussions similaires

Réponses
8
Affichages
452
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…