XL 2019 Macro d'activation de mise en forme conditionnelle "glissante"

Flomax

XLDnaute Nouveau
Bonjour,

J'ai développé un fichier pour gérer les compétences et polyvalences qui plait bien et qui est visuel, mais malheureusement la mise en forme conditionnelle ralenti énormément sa mise à jour.

N'étant pas expert en macro (je sais juste changer des paramètres dedans, ou une ou deux bidouilles) :

- sauriez-vous faire une macro de mise en forme conditionnelle qui reprend celle créée manuellement ci-dessous ? :

ET((SI(NB.SI('BDD Fiches de formation'!$E:$E;CONCAT(F$1;$A6))>0;1;0)+SI(NB.SI('BDD Fiches de formation'!$E:$E;CONCAT(F$2;$A6))>0;1;0)+SI(NB.SI('BDD Fiches de formation'!$E:$E;CONCAT(F$3;$A6))>0;1;0)+SI(NB.SI('BDD Fiches de formation'!$E:$E;CONCAT(F$4;$A6))>0;1;0))<NBVAL(#REF!);F6<>"")

Cette mise en forme est appliquée de la case F6 à I9, créée sur la case F6 puis étendue sur les autres, donc la colonne analysée pour la MFC évolue selon la colonne de la case concernée.

J'ai cherché sur internet mais je n'ai pas trouvé d'exemple que je pourrais reporter sur mon cas.

J'ai mis en pièce jointe une version "générique" du fichier d'origine. L'originale contient beaucoup plus de colonnes et de lignes (de L5 à PV79 actuellement), qui fait qu'après une saisie de case on attend 10 à 20s pour que le calcule se fasse, ce qui n'est pas le cas dans cette version.

Au plaisir de vous entendre,

Flomax
 

Pièces jointes

  • 20221121-mdp-pour-macro-mise-en-forme-conditionnelle.xlsm
    60.4 KB · Affichages: 11
Solution
Bonjour,

Avec un peu de délai, je reviens sur le sujet ! La mise en forme de Gégé était pas mal mais ça ne me surlignait pas les bonnes cases. Comme j'avais d'autres sujets plus prioritaires sur le sujet, je ne m'étais pas penché dessus, jusqu'à hier ! Du coup j'ai trouvé le problème, qui était sur la formule principale. Voici donc la version qui fonctionne impeccablement :
VB:
Sub Coloriage()
Dim objCollabos As Object, Col1 As Range, ChampCible As Range, NbLignes As Long, NbColonnes As Long, i%, j%, wkCollabos As Worksheet, wkProd As Worksheet, Combo1$, Combo2$, Combo3$, Combo4$
    Set wkCollabos = ThisWorkbook.Worksheets("BDD Fiches de Formation")
    Set objCollabos = wkCollabos.ListObjects("_Collaborateurs")
    Set wkProd =...

TooFatBoy

XLDnaute Barbatruc
J'ai dupliqué les lignes du tableau de la feuille "BDD Fiches de formation" jusqu'à la ligne 2501.
J'ai dupliqué les lignes du tableau de la feuille "MdP" jusqu'à la ligne 135.

Effectivement, ça ralenti pas mal. :(
Ca ne prend pas 10 secondes, mais ça en prend bien 3. :( :( :(


Donc si tu veux, tu peux éditer #15 et supprimer le zip, d'autant plus qu'il y a des noms de personnes.
 

Flomax

XLDnaute Nouveau
Certes, mais la macro ne prendrait du temps qu'au chargement de la page, ensuite les mises à jour sur l'événement Change seraient instantanées (puisqu'elles ne seraient appliquées que sur les cellules modifiées), non ? ... sauf si les événements déclencheurs ont lieu dans la feuille 'BDD Fiches de formation' et non dans la feuille 'MdP', ce que nous ignorons.
Gégé je viens de voir ton message désolé.
Dans l'idée de la macro, j'aime surtout l'idée qu'on pourrait la désactiver quand on met à jour la matrice, et ainsi on aurait vraiment zéro lenteur, et qu'on peut la réactiver quand on a fini, pour voir la mise en forme.
Pour expliquer le principe de mise à jour de ce document :
- je mets sur le réseau des fiches de formations de personnes,
- je mets ensuite à jour la requête liée à "BDD Fiches de formation" qui me liste toutes les fiches de toutes les personnes qui sont dans le système
- je rajoute de temps en temps des colonnes dans la feuille "MdP", quand des nouveaux procédés sont créés, mais je ne complète jamais la matrice
- les responsables quant à eux ne touche à rien d'autres que la matrice, en mettant à jour le niveau des gens. C'est pour eux que le fichier rame
 

Flomax

XLDnaute Nouveau
J'ai dupliqué les lignes du tableau de la feuille "BDD Fiches de formation" jusqu'à la ligne 2501.
J'ai dupliqué les lignes du tableau de la feuille "MdP" jusqu'à la ligne 135.

Effectivement, ça ralenti pas mal. :(
Ca ne prend pas 10 secondes, mais ça en prend bien 3. :( :( :(


Donc si tu veux, tu peux éditer #15 et supprimer le zip.
De mon côté ça prend comme toi 3s mais pour faire apparaître la nouvelle valeur seulement, je ne peux pas sélectionner une autre case ou saisir la valeur suivante pendant au moins 10s. Il faut dire aussi que le fichier est sur serveur, ça peut jouer aussi
 

TooFatBoy

XLDnaute Barbatruc
Dans l'idée de la macro, j'aime surtout l'idée qu'on pourrait la désactiver quand on met à jour la matrice, et ainsi on aurait vraiment zéro lenteur, et qu'on peut la réactiver quand on a fini, pour voir la mise en forme.
Effectivement, maintenant que je constate les ralentissements, ça prend tout son sens.

Donc je dis : bien vu GG le Grand Gourou !
 
Dernière édition:

Gégé-45550

XLDnaute Accro
Effectivement, maintenant que je constate les ralentissements, ça prend tout son sens.
Sur ces considérations et afin que chacun ne perde pas son temps inutilement, TooFatBoy => tu écris les macros (je pense qu'il en faut 2, une sur activation de la feuille MdP, ou à la demande via un bouton de commande, qui met tout à jour et une sur l'événement Change de chaque cellule des colonnes O à PM, sauf si c'est l'option bouton de commande qui est retenue, d'ailleurs je pense que c'est la meilleure) ou tu préfères que je m'y colle (mais ce ne sera pas avant la fin de la journée)?
Amicalement,
 

Gégé-45550

XLDnaute Accro
Hello,
au départ, avant de vraiment savoir comment je travaillerais la chose, j'avais prévu un certain nombre de variables, dont quelques-unes que je n'ai pas utilisées.
Dans le fichier que j'ai envoyé, j'ai oublié d'apurer la macro ; c'est sans conséquence mais inutile de charger la mémoire pour rien, elle est déjà suffisamment sollicitée pour cette action.
Dans le module 3, la macro 'Coloriage' sera donc avantageusement remplacée par ceci :
VB:
Sub Coloriage()
Dim objCollabos As Object, Col1 As Range, ChampCible As Range, NbLignes As Long, NbColonnes As Long, i%, j%, wkCollabos As Worksheet, wkProd As Worksheet
    Set wkCollabos = ThisWorkbook.Worksheets("BDD Fiches de Formation")
    Set objCollabos = wkCollabos.ListObjects("_Collaborateurs")
    Set wkProd = ThisWorkbook.Worksheets("MdP Prod")
    Set Col1 = objCollabos.ListColumns("Colonne1").DataBodyRange
    Set ChampCible = wkProd.Range("PolyProd[[Colonne2]:[a415]]")        '$N$14:$PM$79 - si des colonnes sont ajoutées APRÈS la colonne PM, remplacer la dernière valeur entre crochets (ici a415) par le nouveau nom de la dernière colonne
    NbLignes = ChampCible.Rows.Count
    NbColonnes = ChampCible.Columns.Count
    Application.ScreenUpdating = False
    usfInfo.Afficher
    For i = 1 To NbLignes
        usfInfo.Actualiser CInt((i / NbLignes) * 100)
        For j = 1 To NbColonnes
            If ChampCible.Cells(i, j) <> "" And (Application.WorksheetFunction.CountIf(Col1, wkProd.Cells(5, j + 13) & wkProd.Cells(i + 4, 1)) + Application.WorksheetFunction.CountIf(Col1, wkProd.Cells(6, j + 13) & wkProd.Cells(i + 4, 1)) + Application.WorksheetFunction.CountIf(Col1, wkProd.Cells(7, j + 13) & wkProd.Cells(i + 4, 1)) + Application.WorksheetFunction.CountIf(Col1, wkProd.Cells(8, j + 13) & wkProd.Cells(i + 4, 1))) > 0 Then
                With ChampCible(i, j).Interior
                    .Pattern = xlSolid
                    .PatternColorIndex = xlAutomatic
                    .Color = 13590431
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
            Else
                ChampCible(i, j).Interior.ColorIndex = xlColorIndexNone
            End If
        Next j
    Next i
    Application.ScreenUpdating = True
    Set wkCollabos = Nothing
    Set objCollabos = Nothing
    Set wkProd = Nothing
    Set Col1 = Nothing
    Set ChampCible = Nothing
End Sub
Bonne soirée
 

Flomax

XLDnaute Nouveau
Hello,
au départ, avant de vraiment savoir comment je travaillerais la chose, j'avais prévu un certain nombre de variables, dont quelques-unes que je n'ai pas utilisées.
Dans le fichier que j'ai envoyé, j'ai oublié d'apurer la macro ; c'est sans conséquence mais inutile de charger la mémoire pour rien, elle est déjà suffisamment sollicitée pour cette action.
Dans le module 3, la macro 'Coloriage' sera donc avantageusement remplacée par ceci :
Salut Gégé,

Désolé pour le retour tardif, je n'ai pas eu le temps de tester en détail la macro vendredi dernier.

Alors le rendu est super ! Merci beaucoup.

Par contre il y a une erreur dans la formule, ça ne renvoie pas la même chose que le fichier d'origine. Il faudra que je me penche dessus.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

En pièce jointe, une proposition utilisant une MFC pour colorier les cellules (MFC qui est supprimée une fois que les cellules sont coloriées).



⚠️ -=- Attention -=- ⚠️

C'est une proposition un peu bancale car
ça va colorier 100 % des cellules de la plage,
et non uniquement les cellules mises en forme par la MFC.
 

Pièces jointes

  • 20221121-mdp-pour-macro-mise-en-forme-conditionnelle_(TooFatBoy-v1).xlsm
    112.6 KB · Affichages: 3
Dernière édition:

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG