Nombre de valeurs dans des cellules fusionnées

Fermé
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022 - 27 sept. 2017 à 16:54
 gérard - 1 oct. 2017 à 18:36
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

yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473
27 sept. 2017 à 17:48
bonsoir, quel programme permet d'ouvrir le fichier que tu as joint?
0
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
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 09:01
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
gérard
28 sept. 2017 à 14:28
 
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
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 14:48
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
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022 > gérard
28 sept. 2017 à 14:48
Et merci !!!!
0
gérard > Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 15:20
 
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
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022 > gérard
28 sept. 2017 à 15:26
Question (peut-être bête, voir sûrement) comment tu sais quel nombre correspond à quelle couleur ?

Encore mille merci du temps passé !
0
yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473
28 sept. 2017 à 10:59
il me semble que cela fonctionne bien:
=cptFusion(4:4) retourne bien la valeur 10.
0
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 13:13
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
yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473 > Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 14:41
peut-être souhaites-tu simplement une fonction que tu pourrais appeler ainsi:
=cptFusion($B3:$AM3;"RTT")
?
0
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022 > yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024
28 sept. 2017 à 14:48
J'ai essayé mais je n'y suis pas encore arrivé ! Je lâche pas...

Merci
0
yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473 > Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 15:02
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473
28 sept. 2017 à 15:14
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
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 15:27
J'avoue être novice de VBA !
Mais du coup je ne vois pas où tu spécifie la valeur recherchée ?

Merci encore
0
yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473 > Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
28 sept. 2017 à 18:57
par exemple, en AR2, tu mets:
=cptfusion2($B2:$AM2;AR$1)
0
yg_be Messages postés 22857 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 6 juin 2024 1 473
Modifié le 28 sept. 2017 à 19:49
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
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
Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
29 sept. 2017 à 15:39
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
gérard > Dixtit Messages postés 16 Date d'inscription mercredi 27 septembre 2017 Statut Membre Dernière intervention 12 mai 2022
Modifié le 29 sept. 2017 à 16:56
 
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
gérard > gérard
1 oct. 2017 à 18:36
 
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