OVH Cloud OVH Cloud

compter Nombre de cellule dans une zone

19 réponses
Avatar
Emcy
Bonjours,

je voudrais compter le nombre de cases qu'il y a dans une zone (ex: A1:D10).
Il faut que le cellule fusionnées ne compte que pour une case. quelqu'un
a-t-il une solution ?

Remarque : mes cellules fusionnées sont toujour sur la même ligne ( je n'ai
pas pas de cellule fusionnée qui sont sur des lignes différentes)

9 réponses

1 2
Avatar
Rv
Salut,

Quand je vois cela, j'ai l'impression d'avoir proposé un rouleau
compresseur...

A+

Rv

"Daniel.M" a écrit dans le message de
news:
Bonsoir,

Il y a aussi cela:

'================= Compte Non-Fusionnées Daniel M.
Function CNF(MaSelection As Range) As Long
Dim i As Long, C As Range
i = 0
For Each C In MaSelection
If C.MergeCells Then
If C.Address <> C.MergeArea(1, 1).Address Then
i = i + 1 ' pas la première, on la soustraiera du total
End If
End If
Next C
CNF = MaSelection.Cells.Count - i
End Function
' ================= Fin du code

Comme les autres, elle a le défaut de ne pas être directement reliée au
moteur

de calcul/recalcul d'Excel.

Salutations,

Daniel M.



Avatar
AV
Salut Daniel,

Soit la plage A1:B3
Les cellules A1 et B1 sont fusionnées
La formule =CNF(A1:B3) ne devrait-elle pas renvoyer 5 et non 6 comme elle le
fait ?

AV
Avatar
AV
Quand je vois cela, j'ai l'impression d'avoir proposé un rouleau
compresseur...


Ben peut-être un peu mais elle (ta solution) a le mérite de fonctionner (ou
alors il s'agit de réponses à des questions différentes ) !

;-)
AV

Avatar
michdenis
Bonjour,

J'ai fait une légère correction pour que la procédure n'affiche le résultat
seulement l'usager sélectionne une des cellules de la plage A1:A10 et
ajoutant cette ligne de code à la procédure initiale :

If Not Intersect(Target, Range("A1:D10")) Is Nothing Then



Ceci semble fonctionner normalement jusqu'à preuve du contraire ;-))
'-----------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range, X As Integer, R As Double

If Not Intersect(Target, Range("A1:D10")) Is Nothing Then
Set Rg = Union(Target, Range("A1:D10"))
If Not Intersect(Rg, Target) Is Nothing Then
For Each c In Rg
If c.MergeCells Then
X = Intersect(c.MergeArea, Rg).Cells.Count
R = R + 1 / X
Else
R = R + 1
End If
Next
MsgBox R
End If
End If
Set Rg = Nothing
End Sub
'-----------------------------------


Salutations!








"michdenis" a écrit dans le message de news:
Bonsoir Emcy,

Tu peux copier ceci dans la feuille module où l'action se déroule, et à chaque fois que tu cliqueras dans la plage
A1:D10, tu auras un message t'indiquant le nombre de cellules dans cette zone.

'-----------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range, X As Integer, R As Double

Set Rg = Union(Target, Range("A1:D10"))
If Not Intersect(Rg, Target) Is Nothing Then
For Each c In Rg
If c.MergeCells Then
X = Intersect(c.MergeArea, Rg).Cells.Count
r = r + 1 / X
Else
r = r + 1
End If
Next
MsgBox r

End If
Set Rg=Nothing
End Sub
'-----------------------------


Salutations!







"Daniel.M" a écrit dans le message de news:
Bonsoir,

Il y a aussi cela:

'================= Compte Non-Fusionnées Daniel M.
Function CNF(MaSelection As Range) As Long
Dim i As Long, C As Range
i = 0
For Each C In MaSelection
If C.MergeCells Then
If C.Address <> C.MergeArea(1, 1).Address Then
i = i + 1 ' pas la première, on la soustraiera du total
End If
End If
Next C
CNF = MaSelection.Cells.Count - i
End Function
' ================= Fin du code

Comme les autres, elle a le défaut de ne pas être directement reliée au moteur
de calcul/recalcul d'Excel.

Salutations,

Daniel M.

"Rv" wrote in message
news:On%
Salut Emcy,

Non en effet ce n'est pas si important que ça! Mais c'est quand même un peu
plus "propre".
Ce n'est pas si important car la fonction gère explicitement la borne min du
tableau avec 1 pour minimum dans:

For lngIndTabRange = 1 To lngMaxIndTabRange


For lngIndTabRange = lbound(lngTabRange) To lngMaxIndTabRange

Il pourrait y avoir des soucis...


Et puis il est en effet beaucoup plus naturel d'utiliser cette macro en
fonction!

A+

Rv




"Emcy" a écrit dans le message de
news:%
Merci, ça à l'air de marcher

tu es sure qu'il faut mettre Option Base 1 ? ça a l'air de marcher sans

j'utilise plustot cette macro en fonction voila le code si ça t'interesse
:

Function CompteNombreCellules(MaSelection As Range) As Integer 'macro très
fortement inspirée d'une macro de Rv

Dim objCell As Range
Dim objRange As Range
Dim lngTabRange() As Range
Dim lngMaxIndTabRange As Long
Dim lngIndTabRange As Long

Dim lngNbrCell As Long
Dim booTrouve As Boolean

' Init
lngMaxIndTabRange = 0
lngNbrCell = 0

' Récup de la sélection
'Set objRange = Application.Selection

' Parcours des cellules de la sélection

For Each objCell In MaSelection

' Si on est sur une cellule fusionnée
If objCell.MergeCells Then

' On recherche dans le tableau des fusions si la zone existe
déjà
booTrouve = False
For lngIndTabRange = 1 To lngMaxIndTabRange
If objCell.MergeArea.Address > > lngTabRange(lngIndTabRange).Address Then
booTrouve = True
Exit For
End If
Next

' Si on ne trouve pas cette zone dans le tableau des zones
fusionnées
If Not booTrouve Then
' On ajoute la zone au tableau
lngMaxIndTabRange = lngMaxIndTabRange + 1
ReDim Preserve lngTabRange(lngMaxIndTabRange)
Set lngTabRange(lngMaxIndTabRange) = objCell.MergeArea
' On augmente de 1 le nombre de cellules
lngNbrCell = lngNbrCell + 1
End If
' Si on est pas sur une cellule fusionnée
Else
' On augmente de 1 le nombre de cellules
lngNbrCell = lngNbrCell + 1
End If
Next

'MsgBox "Résultat : " & lngNbrCell
CompteNombreCellules = lngNbrCell

End Function








Avatar
michdenis
plage A1:D10 évidemment


Salutations!


"michdenis" a écrit dans le message de news:
Bonjour,

J'ai fait une légère correction pour que la procédure n'affiche le résultat
seulement l'usager sélectionne une des cellules de la plage A1:A10 et
ajoutant cette ligne de code à la procédure initiale :

If Not Intersect(Target, Range("A1:D10")) Is Nothing Then



Ceci semble fonctionner normalement jusqu'à preuve du contraire ;-))
'-----------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range, X As Integer, R As Double

If Not Intersect(Target, Range("A1:D10")) Is Nothing Then
Set Rg = Union(Target, Range("A1:D10"))
If Not Intersect(Rg, Target) Is Nothing Then
For Each c In Rg
If c.MergeCells Then
X = Intersect(c.MergeArea, Rg).Cells.Count
R = R + 1 / X
Else
R = R + 1
End If
Next
MsgBox R
End If
End If
Set Rg = Nothing
End Sub
'-----------------------------------


Salutations!








"michdenis" a écrit dans le message de news:
Bonsoir Emcy,

Tu peux copier ceci dans la feuille module où l'action se déroule, et à chaque fois que tu cliqueras dans la plage
A1:D10, tu auras un message t'indiquant le nombre de cellules dans cette zone.

'-----------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range, X As Integer, R As Double

Set Rg = Union(Target, Range("A1:D10"))
If Not Intersect(Rg, Target) Is Nothing Then
For Each c In Rg
If c.MergeCells Then
X = Intersect(c.MergeArea, Rg).Cells.Count
r = r + 1 / X
Else
r = r + 1
End If
Next
MsgBox r

End If
Set Rg=Nothing
End Sub
'-----------------------------


Salutations!







"Daniel.M" a écrit dans le message de news:
Bonsoir,

Il y a aussi cela:

'================= Compte Non-Fusionnées Daniel M.
Function CNF(MaSelection As Range) As Long
Dim i As Long, C As Range
i = 0
For Each C In MaSelection
If C.MergeCells Then
If C.Address <> C.MergeArea(1, 1).Address Then
i = i + 1 ' pas la première, on la soustraiera du total
End If
End If
Next C
CNF = MaSelection.Cells.Count - i
End Function
' ================= Fin du code

Comme les autres, elle a le défaut de ne pas être directement reliée au moteur
de calcul/recalcul d'Excel.

Salutations,

Daniel M.

"Rv" wrote in message
news:On%
Salut Emcy,

Non en effet ce n'est pas si important que ça! Mais c'est quand même un peu
plus "propre".
Ce n'est pas si important car la fonction gère explicitement la borne min du
tableau avec 1 pour minimum dans:

For lngIndTabRange = 1 To lngMaxIndTabRange


For lngIndTabRange = lbound(lngTabRange) To lngMaxIndTabRange

Il pourrait y avoir des soucis...


Et puis il est en effet beaucoup plus naturel d'utiliser cette macro en
fonction!

A+

Rv




"Emcy" a écrit dans le message de
news:%
Merci, ça à l'air de marcher

tu es sure qu'il faut mettre Option Base 1 ? ça a l'air de marcher sans

j'utilise plustot cette macro en fonction voila le code si ça t'interesse
:

Function CompteNombreCellules(MaSelection As Range) As Integer 'macro très
fortement inspirée d'une macro de Rv

Dim objCell As Range
Dim objRange As Range
Dim lngTabRange() As Range
Dim lngMaxIndTabRange As Long
Dim lngIndTabRange As Long

Dim lngNbrCell As Long
Dim booTrouve As Boolean

' Init
lngMaxIndTabRange = 0
lngNbrCell = 0

' Récup de la sélection
'Set objRange = Application.Selection

' Parcours des cellules de la sélection

For Each objCell In MaSelection

' Si on est sur une cellule fusionnée
If objCell.MergeCells Then

' On recherche dans le tableau des fusions si la zone existe
déjà
booTrouve = False
For lngIndTabRange = 1 To lngMaxIndTabRange
If objCell.MergeArea.Address > > lngTabRange(lngIndTabRange).Address Then
booTrouve = True
Exit For
End If
Next

' Si on ne trouve pas cette zone dans le tableau des zones
fusionnées
If Not booTrouve Then
' On ajoute la zone au tableau
lngMaxIndTabRange = lngMaxIndTabRange + 1
ReDim Preserve lngTabRange(lngMaxIndTabRange)
Set lngTabRange(lngMaxIndTabRange) = objCell.MergeArea
' On augmente de 1 le nombre de cellules
lngNbrCell = lngNbrCell + 1
End If
' Si on est pas sur une cellule fusionnée
Else
' On augmente de 1 le nombre de cellules
lngNbrCell = lngNbrCell + 1
End If
Next

'MsgBox "Résultat : " & lngNbrCell
CompteNombreCellules = lngNbrCell

End Function








Avatar
michdenis
Bonjour,

Si certains préfèrent une présentation sous forme de fonction ....

'----------------------------
Sub NbCellFusionner()
'Appel de la fonction
MsgBox NombreCellsFusionner(Range("A1:D10"))

End Sub
'----------------------------

Cela fonctionne que la fusion des cellules soit horizontale ou verticale
'---------------------
Function NombreCellsFusionner(rg As Range)
Dim X As Integer, R As Double
For Each c In rg
If c.MergeCells Then
X = Intersect(c.MergeArea, rg).Cells.Count
R = R + 1 / X
Else
R = R + 1
End If
Next
CellsFusionner = R
End Function
'---------------------


Salutations!








"michdenis" a écrit dans le message de news:
Bonjour,

J'ai fait une légère correction pour que la procédure n'affiche le résultat
seulement l'usager sélectionne une des cellules de la plage A1:A10 et
ajoutant cette ligne de code à la procédure initiale :

If Not Intersect(Target, Range("A1:D10")) Is Nothing Then



Ceci semble fonctionner normalement jusqu'à preuve du contraire ;-))
'-----------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range, X As Integer, R As Double

If Not Intersect(Target, Range("A1:D10")) Is Nothing Then
Set Rg = Union(Target, Range("A1:D10"))
If Not Intersect(Rg, Target) Is Nothing Then
For Each c In Rg
If c.MergeCells Then
X = Intersect(c.MergeArea, Rg).Cells.Count
R = R + 1 / X
Else
R = R + 1
End If
Next
MsgBox R
End If
End If
Set Rg = Nothing
End Sub
'-----------------------------------


Salutations!








"michdenis" a écrit dans le message de news:
Bonsoir Emcy,

Tu peux copier ceci dans la feuille module où l'action se déroule, et à chaque fois que tu cliqueras dans la plage
A1:D10, tu auras un message t'indiquant le nombre de cellules dans cette zone.

'-----------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Rg As Range, X As Integer, R As Double

Set Rg = Union(Target, Range("A1:D10"))
If Not Intersect(Rg, Target) Is Nothing Then
For Each c In Rg
If c.MergeCells Then
X = Intersect(c.MergeArea, Rg).Cells.Count
r = r + 1 / X
Else
r = r + 1
End If
Next
MsgBox r

End If
Set Rg=Nothing
End Sub
'-----------------------------


Salutations!







"Daniel.M" a écrit dans le message de news:
Bonsoir,

Il y a aussi cela:

'================= Compte Non-Fusionnées Daniel M.
Function CNF(MaSelection As Range) As Long
Dim i As Long, C As Range
i = 0
For Each C In MaSelection
If C.MergeCells Then
If C.Address <> C.MergeArea(1, 1).Address Then
i = i + 1 ' pas la première, on la soustraiera du total
End If
End If
Next C
CNF = MaSelection.Cells.Count - i
End Function
' ================= Fin du code

Comme les autres, elle a le défaut de ne pas être directement reliée au moteur
de calcul/recalcul d'Excel.

Salutations,

Daniel M.

"Rv" wrote in message
news:On%
Salut Emcy,

Non en effet ce n'est pas si important que ça! Mais c'est quand même un peu
plus "propre".
Ce n'est pas si important car la fonction gère explicitement la borne min du
tableau avec 1 pour minimum dans:

For lngIndTabRange = 1 To lngMaxIndTabRange


For lngIndTabRange = lbound(lngTabRange) To lngMaxIndTabRange

Il pourrait y avoir des soucis...


Et puis il est en effet beaucoup plus naturel d'utiliser cette macro en
fonction!

A+

Rv




"Emcy" a écrit dans le message de
news:%
Merci, ça à l'air de marcher

tu es sure qu'il faut mettre Option Base 1 ? ça a l'air de marcher sans

j'utilise plustot cette macro en fonction voila le code si ça t'interesse
:

Function CompteNombreCellules(MaSelection As Range) As Integer 'macro très
fortement inspirée d'une macro de Rv

Dim objCell As Range
Dim objRange As Range
Dim lngTabRange() As Range
Dim lngMaxIndTabRange As Long
Dim lngIndTabRange As Long

Dim lngNbrCell As Long
Dim booTrouve As Boolean

' Init
lngMaxIndTabRange = 0
lngNbrCell = 0

' Récup de la sélection
'Set objRange = Application.Selection

' Parcours des cellules de la sélection

For Each objCell In MaSelection

' Si on est sur une cellule fusionnée
If objCell.MergeCells Then

' On recherche dans le tableau des fusions si la zone existe
déjà
booTrouve = False
For lngIndTabRange = 1 To lngMaxIndTabRange
If objCell.MergeArea.Address > > lngTabRange(lngIndTabRange).Address Then
booTrouve = True
Exit For
End If
Next

' Si on ne trouve pas cette zone dans le tableau des zones
fusionnées
If Not booTrouve Then
' On ajoute la zone au tableau
lngMaxIndTabRange = lngMaxIndTabRange + 1
ReDim Preserve lngTabRange(lngMaxIndTabRange)
Set lngTabRange(lngMaxIndTabRange) = objCell.MergeArea
' On augmente de 1 le nombre de cellules
lngNbrCell = lngNbrCell + 1
End If
' Si on est pas sur une cellule fusionnée
Else
' On augmente de 1 le nombre de cellules
lngNbrCell = lngNbrCell + 1
End If
Next

'MsgBox "Résultat : " & lngNbrCell
CompteNombreCellules = lngNbrCell

End Function








Avatar
Daniel.M
Salut Alain,

J'obtiens 5 (Excel 2000). Micro-climat? :-)

Plus sérieusement, qu'arrive-t-il si tu changes la valeur de (mettons) A2,
déclenchant ainsi le recalcul? En effet, cette fonction, comme toutes celles qui
sont basées sur des formats, ne bénéficie pas du recalcul automatique.

C'était juste au alternative à celle publiée par Emcy mais qui avait les mêmes
restrictions/problèmes au niveau du recalcul.

Salutations,

Daniel M.


"AV" wrote in message
news:OsAcb4$
Salut Daniel,

Soit la plage A1:B3
Les cellules A1 et B1 sont fusionnées
La formule =CNF(A1:B3) ne devrait-elle pas renvoyer 5 et non 6 comme elle le
fait ?

AV





Avatar
AV
...Micro-climat? :-)
Ok vu.....!

Comme il n'y a pas "Application.volatile", je m'escrimais en vain sur le
F9.....!

Pfff
AV

Avatar
AV
Application.Volatile !!!
tout le monde sait ça !!!
;-pfff...f9....

-----Message d'origine-----
...Micro-climat? :-)
Ok vu.....!

Comme il n'y a pas "Application.volatile", je
m'escrimais en vain sur le

F9.....!

Pfff
AV


.




1 2