Nombre de valeurs dans des cellules fusionnées

Dixtit Messages postés 18 Statut Membre -  
 gérard -
Bonjour,

Je cherche à savoir s'il est possible de compter les cellules fusionnées selon ce qu'elles contiennent ?
Je vous joins un fichier, ce sera peut-être plus explicite !!! En vert c'est ce que j'aimerais obtenir.

http://www.cjoint.com/c/GIBo1sHCUYG

Merci d'avance,

7 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonsoir, quel programme permet d'ouvrir le fichier que tu as joint?
    0
  2. gérard
     
    Bonjour Dixtit,

    Fichier Excel 2007 : https://mon-partage.fr/f/IyV8C3N7/

    Si besoin, tu peux me demander une adaptation.
    Merci de me dire si ça te convient.

    Cordialement
     
    0
  3. Dixtit Messages postés 18 Statut Membre
     
    Bonjour,

    yg_be : c'est un fichier excel avec macro

    gérard : merci beaucoup. J'essaye de comprendre : tu vas chercher le nombre de cellule selon leurs couleurs ?
    0
    1. gérard
       
       
      Bonjour Dixtit,

      Oui, c'est bien ça : c'est le nombre de cellules selon les couleurs ;
      j'ai mis dans le code tous les commentaires utiles ; Alt F11 pour
      voir la fonction NbCells(), puis Alt F11 pour revenir sur Excel.

      Tous les commentaires sont après la ligne « Option Explicit » et
      avant la ligne « Function NbCells(...) As Byte » (ils sont en vert).

      Je ne vais pas réécrire ces commentaires mais si besoin, tu peux
      me demander plus d'infos.

      -------------------------------------------

      Pour que cette méthode marche comme il faut, tu dois seulement
      utiliser les mêmes couleurs que jusqu'à présent, ce pour chaque
      type RECUP, RTT, ou CP ; la fonction est appelée avec 1, 2 ou 3
      selon ces 3 cas (précédé du n° de ligne) pour cette raison :

      C'est plus simple que de transmettre directement le n° couleur,
      et si tu changes de couleur par la suite, tu devras changer les
      codes couleurs dans le code de la fonction, sans avoir besoin
      de changer les formules de la feuille.

      -------------------------------------------

      J'avais vu le problème que tu as rencontré avec cptFusion(),
      c'est pourquoi je n'ai pas utilisé cette fonction ; je l'ai donc
      supprimée du module de mon fichier Excel.

      Cordialement
       
      0
    2. Dixtit Messages postés 18 Statut Membre
       
      J'ai vu après tes commentaires !

      Par contre cela ne s'actualise pas, ca te fais pareil ?
      Je suis un peu exigeante, mais il n'est pas possible de plutôt paramétrer des contenus "RTT", "CA"... plutôt que des couleurs ?

      J'ai allégé le fichier vu que j'ai environ 10 codes différents pour plus de 2000 personnes !
      0
    3. Dixtit Messages postés 18 Statut Membre > gérard
       
      Et merci !!!!
      0
    4. gérard > Dixtit Messages postés 18 Statut Membre
       
       
      Je n'ai pas fait selon les contenus RECUP, RTT, ou CP car ce contenu n'est que
      dans la 1ère cellule d'un groupe de cellules fusionnées.

      Comme tu as 10 codes différents, tu auras un n° de 1 à 10 pour chaque code,
      auquel il faudra associer le code couleur correspondant ; dans le code VBA,
      il y a ces 2 lignes :

        If n = 0 Or n > 3 Then Exit Function
        couleur = Choose(n, 12, 6, 38)
      

      mettre à la place :

        If n = 0 Or n > 10 Then Exit Function
        couleur = Choose(n, 12, 6, 38, x, x, x, x, x, x, x)
      

      Après 38, à la place des 7 x, met le code couleur correspondant à
      la couleur que tu as choisie pour les 7 autres types de contenu.
       
      0
    5. Dixtit Messages postés 18 Statut Membre > gérard
       
      Question (peut-être bête, voir sûrement) comment tu sais quel nombre correspond à quelle couleur ?

      Encore mille merci du temps passé !
      0
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    il me semble que cela fonctionne bien:
    =cptFusion(4:4) retourne bien la valeur 10.
    0
    1. Dixtit Messages postés 18 Statut Membre
       
      Oui mais cela ne fait pas la distinction entre RTT-CP.
      Je veux qu'il additionne les cellules (fusionnées ou non) selon ce qu'elles contiennent.
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Dixtit Messages postés 18 Statut Membre
         
        peut-être souhaites-tu simplement une fonction que tu pourrais appeler ainsi:
        =cptFusion($B3:$AM3;"RTT")
        ?
        0
      2. Dixtit Messages postés 18 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        J'ai essayé mais je n'y suis pas encore arrivé ! Je lâche pas...

        Merci
        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Dixtit Messages postés 18 Statut Membre
         
        suggestion:
        Function cptFusion2(plage As Range, valeur As String) As Long
            Dim c As Range
            Dim i As Range
            Dim compterfusion As Boolean
            
            Set i = Intersect(plage, plage.Parent.UsedRange)
            Application.Volatile
            For Each c In i
                If c.MergeCells Then
                    If c.Value = valeur Then
                        cptFusion2 = cptFusion2 + 1
                        compterfusion = True
                    ElseIf c.Value = Empty Then
                        If compterfusion Then
                            cptFusion2 = cptFusion2 + 1
                        End If
                    Else
                        compterfusion = False
                    End If
                Else
                    If c.Value = valeur Then
                        cptFusion2 = cptFusion2 + 1
                    End If
                End If
            Next c
        End Function

        comme tu peux le voir, cela utilise le fait que la première cellule fusionnée contient la valeur, les autres ne contenant rien.
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    ou ceci, peut-être un peu plus clair:
    Function cptFusion2(plage As Range, valeur As String) As Long
        Dim c As Range
        Dim i As Range
        Dim compterfusion As Boolean
        
        Set i = Intersect(plage, plage.Parent.UsedRange)
        Application.Volatile
        For Each c In i
            If c.Value = valeur Then
                cptFusion2 = cptFusion2 + 1
                If c.MergeCells Then
                    compterfusion = True
                End If
            ElseIf c.MergeCells And (c.Value = Empty) And compterfusion Then
                    cptFusion2 = cptFusion2 + 1
            Else
                compterfusion = False
            End If
        Next c
    End Function
    0
    1. Dixtit Messages postés 18 Statut Membre
       
      J'avoue être novice de VBA !
      Mais du coup je ne vois pas où tu spécifie la valeur recherchée ?

      Merci encore
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Dixtit Messages postés 18 Statut Membre
         
        par exemple, en AR2, tu mets:
        =cptfusion2($B2:$AM2;AR$1)
        0
  7. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    mes propositions ne fonctionnent pas correctement si tu as des cellules vides fusionnées.
    ceci sera meilleur:
    Function cptFusion2(plage As Range, valeur As String) As Long
        Dim c As Range
        
        cptFusion2 = 0
        Application.Volatile
        For Each c In Intersect(plage, plage.Parent.UsedRange)
            If c.MergeCells Then
                If c.MergeArea.Cells(1, 1).Value = valeur Then
                    cptFusion2 = cptFusion2 + 1
                End If
            Else
                If c.Value = valeur Then
                    cptFusion2 = cptFusion2 + 1
                End If
            End If
        Next c
    End Function
    0
  8. gérard
     
    Bonjour Dixtit,

    Fichier Excel n° 1 : https://mon-partage.fr/f/ngTLRf8c/
    Fichier Excel n° 2 : https://mon-partage.fr/f/HE3acaD0/

    Tu connais déjà le fichier 1 ; j'ai juste amélioré les commentaires
    du code VBA, mais regarde-les quand même (Alt F11) ; tout le
    reste est identique.

    Le fichier 2 est nouveau : c'est une autre façon de faire où tu dois
    transmettre le n° de ligne et le code couleur ; dans un sens, c'est
    plus facile, mais si tu dois changer de couleur ensuite, tu devras
    modifier la fonction puis l'étirer vers le bas sur toute la colonne ;
    c'est donc moins souple => je t'ai d'abord proposé l'autre façon,
    mais choisis celle que tu préfères.

    ----------------------------------------

    Rappel : avec la 1ère méthode, en cas de changement de couleur,
    l'appel des fonctions n'a pas besoin d'être modifié : laisse tel que
    car c'est seulement 2 lignes du code VBA qui doivent être mises
    à jour (j'ai déjà indiqué lesquelles auparavant).

    ----------------------------------------

    Même avec ce que j'ai écris, lis quand même mon message précédent :

    https://forums.commentcamarche.net/forum/affich-34893977-nombre-de-valeurs-dans-des-cellules-fusionnees#18

    À te lire pour avoir ton avis.
     
    0
    1. Dixtit Messages postés 18 Statut Membre
       
      On s'y perdrait presque !!!

      J'ai lu tous tes messages et vu tout tes fichiers !
      J'ai bien coché en automatique le mode du classeur, cela vient peut-être du fichier qui est très lourd : 2130 lignes et plus de 200 colonnes.

      Quoiqu'il en soit, afin de tester ton fichier n°2 je voulais comprendre ; les numéros de couleur n'apparaissent dans le code qu'en tant que commentaires ?
      0
      1. gérard > Dixtit Messages postés 18 Statut Membre
         
         
        Dans le fichier 2, le numéro de couleur est transmis en 2ème paramètre lors de
        l'appel de la fonction (c'est-à-dire par la formule de la feuille) ; exemple en AP2 :
        =NbCells(LIGNE();38) => dans le code VBA, ce n° de couleur est : codX

        ⚠  Dans mes 2 fichiers, les colonnes jours vont de B à AM => dans le code VBA :
        For col = 2 To 39 ; ces 2 nombres en gras sont à adapter dans ton vrai fichier !

        Petite rectification pour ce que j'avais écris précédemment : si tu as une couleur
        hors palette, tu n'es pas obligée d'utiliser la fonction RGB(), mais il faudra quand
        même utiliser .Interior.Color au lieu de .Interior.ColorIndex

        Le problème du calcul automatique est plus gênant car en fait, ce n'est pas selon
        un changement de valeur de cellule mais selon une couleur de remplissage ;
        je vais essayer de trouver une solution à ça, mais ce serait plus facile si tu joins
        ton fichier Excel sans données confidentielles via mon-partage.fr => dans le
        classeur joint, mets uniquement la 1ère feuille (celle avec le Planning).

        À te lire pour la suite.
         
        0
      2. gérard > gérard
         
         
        Ajout : regarde aussi ce fichier : https://mon-partage.fr/f/y6seCLpi/

        Pour la plage AN2:AP4 il n'y a plus de formules ; fais comme d'habitude :
        fusionne les cellules à colorer, applique la couleur de remplissage ;
        sélectionne une cellule jour sur la même ligne => mise à jour des stats
        de la ligne (colonnes AN à AP de la même ligne).

        Alt F11 pour voir le code VBA, puis revenir sur Excel

        ⚠  J'ai supprimé Module1 qui contenait la fonction NbCells() car j'ai utilisé
        une méthode différente : le code que tu vois est celui de Feuil1 ; de plus,
        tu peux voir qu'au lieu de .Interior.ColorIndex, j'ai utilisé .Interior.Color

        ⚠  N'oublie pas que la mise à jour des stats de la ligne se fait seulement
        si tu sélectionnes une autre cellule jour de cette ligne (colonnes B à AM).
         
        0