Compter les cellules avec couleur affectée par MFC
Bonjour à tous,
Je suis débutant en VBA Excel et je butte sur un sujet
Je vais essayer d'être le plus explicite possible
Je dispose de plusieurs fichiers du type du fichier "C Test" en PJ dans un même dossier que l'on nommera pour l'exemple "en cours". Ces fichiers sont sortis du dossier lorsqu'ils n'ont plus besoin d'être veillés et de nouveaux fichiers sont intégrés au dossier lorsque le besoin se produit. Dans ce type de fichier, il y a des alertes visuelles générée par MFC ; à savoir "alerte à court terme" (MFC=> fond orange) et "alerte dépassement"(MFC=> fond rouge)
J'ai pour idée d'avoir un fichier "Tableau de bord en cours" dans un autre dossier qui lui me servira à lister les fichiers présents dans le dossier "en cours" et qui me remontra le nombre d'alertes présentes dans chaque fichier "C Test" (voir également le fichier en PJ)
Pour ce qui est de rechercher dans le dossier "en cours" et créer la liste pas de soucis (il suffit de cliquer sur le bouton "dossier et de cibler le dossier "en cours")
Par contre je sèche complétement pour la partie : lire les alerte dans chaque fichier...... il faudrait que le fichier "Tableau de bord en cours" aille dans chaque fichier "C Test" lire les plages C6:J6 ; C10:J10, etc... jusqu'à C34:J34 et comptabilise, dans la colonne D du fichier "Tableau de bord en cours" en face de chaque nom de fichier, le nombre de cellules avec MFC rouges et en E le nombre de cellules avec MFC oranges.
Si vous pouvez me proposer quelque chose qui tient la route (et surtout qui fonctionne
idéalement le souhait serait de ne pas générer de macro dans le fichier "C Test" ; uniquement dans le fichier "Tableau de bord en cours" - mais si ce n'est pas possible on s'adaptera
Merci d'avance pour votre indulgence pour l'existant qui n'est certainement pas parfait et pour votre aide.
A +
Bonsoir,
le plus simple d'après moi serait d'utiliser les mêmes formules que celles utilisées pour les MFC, par exemple à droite du tableau dans "c-test" avec une colonne par cas (couleur).
Il faudrait aussi éviter de faire ;
- des cellules fusionnées
- de multiplier les MFC ; une par couleur doit suffire pour tout le tableau.
Bonjour Doux Rêveur, merci pour ton retour mais pour la réduction des MFC et le fait d'éviter les cellules fusionnées, cela me semble difficile.
Concernant la solution proposée pourquoi pas mais comment faire ?
Merci.
Bonjour,
votre cas cumule pas mal de challenges ; plusieurs sources, 2 couleurs dans la même zone qui proviennent de plusieurs MFC et des cellules fusionnées !
Je viens de galérer 2 heures avec l'aide d'une IA, tout seul je n'y serais pas arrivé.
3 codes en tout, le 1er à mettre dans un module du fichier source (donc à sauver en xlsm, même code pour les autres fichiers source) ;
Function CompterCouleurS(plage As Range, codeCouleur As Long) As Long
Dim cell As Range, total As Long
' On parcourt chaque cellule de la plage définie
For Each cell In plage
' Vérification : est-ce une cellule unique OU le coin supérieur gauche d'une fusion ?
' Cela évite de compter les cellules "invisibles" des fusions qui faussent le calcul
If cell.MergeCells = False Or (cell.Address = cell.MergeArea.Cells(1, 1).Address) Then
' On vérifie la couleur réelle affichée (DisplayFormat)
' On utilise On Error Resume Next car DisplayFormat peut échouer
' si la cellule est temporairement inaccessible
On Error Resume Next
If cell.DisplayFormat.Interior.Color = codeCouleur Then
total = total + 1
End If
On Error GoTo 0
End If
Next cell
CompterCouleurS = total
End FunctionLe 2ème, toujours dans le fichier source, à mettre sur la feuille où se trouve le tableau avec les couleurs ("Phase unique") qui fera apparaître les totaux en I2 et J2 ;
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' 1. On définit la plage à analyser
Dim zoneAnalyse As Range
Set zoneAnalyse = Me.Range("C6:J37")
' 2. On appelle la fonction et on écrit le résultat dans les cellules voulues
' Le code 255 = Rouge, 49407 = Orange
Me.Range("I2").Value = CompterCouleurS(zoneAnalyse, 255)
Me.Range("J2").Value = CompterCouleurS(zoneAnalyse, 49407)
End SubLe 3ème à mettre dans un module du fichier récap ;
Sub TotauxCoul()
Dim appSource As Object
Dim wbSource As Workbook
Dim fichiers As Variant, f As Variant
Dim totalRouge As Long, totalOrange As Long
fichiers = Array("C:\xls\c-test.xlsm")
' Création d'une instance Excel invisible pour lire les fichiers
Set appSource = CreateObject("Excel.Application")
appSource.Visible = False
For Each f In fichiers
' On ouvre en lecture seule, sans mettre à jour les liens (pour éviter les blocages)
Set wbSource = appSource.Workbooks.Open(Filename:=f, ReadOnly:=True, UpdateLinks:=False)
' On lit les valeurs calculées localement
totalRouge = totalRouge + wbSource.Sheets(1).Range("I2").Value
totalOrange = totalOrange + wbSource.Sheets(1).Range("J2").Value
wbSource.Close SaveChanges:=False
Next f
appSource.Quit
Set appSource = Nothing
' Écriture finale
Range("D9").Value = totalRouge
Range("E9").Value = totalOrange
End SubJ'ai laissé les commentaires de l'IA.
Ce qui donne ;
et ;
Vous pouvez bien sûr remplacer les références (I2, J2, plage sources ...) et quand il y a plusieurs fichiers source, on rajoute les adresses à la ligne fichiers = Array("C:\xls\c-test.xlsm", "C:\xls\c-test 2.xlsm", ...).
Il y a aussi des méthodes pour ouvrir tous les fichiers d'un dossier ou cibler tous ceux comportant un mot spécifique.
Au départ l'IA m'avait pondu un seul code pour tout faire sur la feuille de récap mais chez moi ça ne marchait pas, peut-être dû à une limite d'Excel 2019.
crosspost
Visiblement les solutions que vous avez apportés ne lui conviennent pas
Bonjour Doux Rêveur, merci pour ton aide constructive.
Je viens de tester (en mode copier/coller sans regarder en détail .... je n'ai pas trop le temps aujourd'hui) et la macro TotauxCoul () se bloque sur la ligne juste en dessous du lancement de la boucle "For Each...."
Je regarderai cela lorsque j'aurais un temps libre car le code est peut-être à adapter un peu....
Je reviens vers toi, quand j'aurais eu le temps de regarder en détail.
Merci beaucoup pour ton aide
A très vite
Nain porte koi, le sujet a été posté sur un autre forum car en regardant hier en début d'après-midi je n'avais pas vu de réponse au post initial. (et j'ai donc posté sur un autre site le même post lorsque j'avais du temps en fin de journée)
Heureusement qu'il y a des utilisateur tels que Doux Rêveur qui eux sont constructifs dans leur réponses et ne sont pas sur ce type de site pour apporter des réponses sans intérêt. il n'y a qu'a regarder le détail de votre profil et la quantité de commentaires du même style que ceux dans cette conversation pour savoir à qui on a affaire.
@Chris77400 je ne vous ai strictement rien dit, je ne m'abaisserait même pas à ça avec des gens comme vous qui prennent les bénévoles pour des larbins, j'ai simplement signalé à ceux qui vous répondait que visiblement vous n'étiez pas satisfait des réponses car, en contradiction avec la chartre de ce forum et de quasiment tous les autres, vous faisiez du cross post. Je cite la chartre que vous avez forcément lu et accepté avant de posté : "Ne postez pas la même question sur un autre forum pour éviter de faire perdre bêtement du temps aux membres sur un problème qui peut être déjà résolu sur l'autre forum. L'inverse est également valable, si vous avez déjà posé votre question sur un autre forum, ne créez pas un doublon sur ce forum (à moins d'avoir clôturé le sujet sur l'autre forum)."
Heureusement qu'il n'y a pas que des des gens aigris et détestable comme vous sur les forums.
Re, Doux Rêveur
Je viens de prendre le temps et en lisant en détail le code et tes commentaires, j'ai adapté le code à mon cas et cela fonctionne, je te remercie
Seul hic je n'arrive pas à renseigner automatiquement la fonction Array avec le chemin d'accès général définit en case C6 suivi des différents noms de fichiers repris en colonne à partir de la case C9.
Ce n'est peut-être pas la direction a prendre pour obtenir le résultat ; il existe certainement une autre méthode mais encore une fois je bloque. Désolé je n'ai vraiment que les bases en VBA....
Je continue mes recherches en attendant de voir qi quelqu'un peut m'aiguiller
Encore merci
P.S. Je laisse le sujet ouvert pour la gestion du Array
Bonjour,
vous avez mis le chemin dans une cellule ? Dans quel fichier ?
Bonjour c'est dans le fichier "Tableau de bord en cours".
Mais merci j'ai trouvé la solution en me creusant la tête.
Je vous joins mes fichiers corrigés en PJ
Et je clos donc le sujet.
Merci pour votre aide
Hello,
En espérant donc que vous clôturerez l'autre sujet ouvert dans l'(les ?) autre(s?) forum(s) afin que d'autres arrêtent de se casser la tête (bénévolement faut-il le rappeler ?) si la solution est trouvé ailleurs, et que ceux ayant le même problème aient eux aussi la solution.