Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Nombres de lignes dans une plage non-contigües

33 réponses
Avatar
Apitos
Bonjour =E0 tous,

J'ai la plage nomm=E9e "Limite" suivante :

=3DFeuil1!$G$13:$L$13;Feuil1!$G$17:$L$17



Quand je voudrais compter le nombre de lignes de cette plage, j'aurais touj=
ours 1, or il y a bien deux lignes :

'-------------------------------
Sub test0()
Dim x As Long

x =3D Range("Limite").Rows.Count
Debug.Print "Lignes =3D " & x

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


Merci.

10 réponses

1 2 3 4
Avatar
GL
Le 24/02/2015 20:09, isabelle a écrit :
bonjour Patrick,

si tu fait une selection, le résultat est 2

Range("Limite").Select
Debug.Print Selection.Areas.Count

isabelle



Oui mais là vous comptez le nombre d'Areas, pas le nombre
de lignes.

Genre : Range("A1:C3,A1:A3,C1:C3").Areas.Count
vaut 3.

Et: Union(Range("A1:C3,A1:A3,C1:C3"), _
Range("A1:C3,A1:A3,C1:C3")).Areas.Count
vaut 1, car Union a réuni des Areas.


Donc le nombre d'Areas, sauf s'il est déterminé par vous-même
pour une cause particulière, est non significatif.

Bref, l'"objet" Range (qui n'est pas un objet au sens conceptuel)
est un merde en 5 lettres.

Bonne soirée.
Avatar
isabelle
ps/

ce n'est pas le nombre de lignes qui est compté mais le nombre de groupe de ligne,
fait le test avec 2 groupe de 1 ligne ou 2 groupes de 2 lignes, le résultat est
le même

Range("Limite").Select
Debug.Print Selection.Areas.Count

donc pas moyen de compter les lignes sans boucle,

Set Rng = Range("Limite")
For Each r In Rng.Rows
rws = rws + 1
Next
Debug.Print "Lignes : " & rws

isabelle

Le 2015-02-24 14:09, isabelle a écrit :
bonjour Patrick,

si tu fait une selection, le résultat est 2

Range("Limite").Select
Debug.Print Selection.Areas.Count

isabelle

Le 2015-02-24 11:38, Patrick a écrit :
Je me disais quen en sélectionnant le range "limite" et demandant rows.count
ça irait , mais non ...

c'est pourquoi je demande si c'est un bug ?



"DanielCo" a écrit dans le message de news:
54eca88a$0$2994$
Et on peut faire plus complet si les plages distinctes risquent d'avoir
des lignes communes.
Daniel





---
L'absence de virus dans ce courrier electronique a ete verifiee par le
logiciel antivirus Avast.
http://www.avast.com

Avatar
GL
Le 24/02/2015 20:44, DanielCo a écrit :
Le code "à l'épreuve des balles" serait donc (sous réserve) :
Sub test2()
With [Limite]
For i = .Areas(1).Row To .Areas(.Areas.Count).Row +
.Areas(.Areas.Count).Rows.Count - 1
If Not Intersect([Limite], Rows(i)) Is Nothing Then
Ctr = Ctr + 1
End If
Next i
End With
Debug.Print "Lignes : " & Ctr
End Sub
Daniel



Et non : les Areas ne sont pas ordonnées : essayer avec

Set Limite = Range("A10:C10,A1:C3")

et vous avez Ctr = 0 lignes comme résultat !

L'idée c'est de créer d'abord l'Union des lignes entières contenues
dans Limite et ensuite de les dénombrer :

Sub test2()
Dim Limite As Range, A As Range, R As Range

Set R = Limite.Areas(1).Rows.EntireRow
For Each A In Limite.Areas: Set R = Union(R, A.Rows.EntireRow):Next A

Debug.Print "Lignes : " & R.Rows.Count

End Sub

Là l'union des EntireRow va automatiquement annuler les lignes en
doublon...

Cordialement.
Avatar
isabelle
oups,
n'avions pas vu votre message -(

isabelle

Le 2015-02-24 14:45, DanielCo a écrit :
Bonsoir Isabelle,
Ca te donne le nombre de sous-plages, pas forcément le nombre de lignes :
Sheets("Feuil1").Range("$G$13:$L$13,$G$17:$L$18").Name = "Limite"
Range("Limite").Select
Debug.Print Selection.Areas.Count
Daniel


bonjour Patrick,

si tu fait une selection, le résultat est 2

Range("Limite").Select
Debug.Print Selection.Areas.Count

isabelle

Le 2015-02-24 11:38, Patrick a écrit :
Je me disais quen en sélectionnant le range "limite" et demandant rows.count
ça irait , mais non ...

c'est pourquoi je demande si c'est un bug ?



"DanielCo" a écrit dans le message de news:
54eca88a$0$2994$
Et on peut faire plus complet si les plages distinctes risquent d'avoir
des lignes communes.
Daniel





---
L'absence de virus dans ce courrier electronique a ete verifiee par le
logiciel antivirus Avast.
http://www.avast.com
Avatar
DanielCo
T'as tout faux, je trouve 3.
Daniel
Avatar
GL
Le 24/02/2015 21:08, DanielCo a écrit :
T'as tout faux, je trouve 3.
Daniel



Non c'est juste : obligatoirement puisque c'est logique.
J'ai seulement oublié de sommer les nombres de lignes,
car l'Union est elle même composée de plusieurs Areas
(mais qui sont toutes disjointes, par la grace de Union) :


En reprenant l'exemple original d'Apitos (1er post) :

Sub test2()
Dim Limite As Range, A As Range, R As Range, Ctr&

Set Limite = Range("$G$13:$L$13,$G$17:$L$17") ' Exemple original

Set R = Limite.Areas(1).Rows.EntireRow
For Each A In Limite.Areas: Set R = Union(R, A.Rows.EntireRow): Next A

' Maintenant on peut sommer les lignes :

For Each A In R.Areas: Ctr = Ctr + A.Rows.Count: Next

Debug.Print "Lignes : " & Ctr

End Sub



Cordialement.
Avatar
elatlas
Bonjour à tous,

Je vois qu'il y a discussion sur le sujet.

Bon ce que j'ai retenues ainsi ce que j'aurais pu tester :


For Each Ar In Range("Limite").Areas
x = x + Ar.Rows.Count
Range(PlageNommée).Areas(x).Copy .Range("A" & L)
L = L + 1
Next Ar

Puisque ma PlageNommée contient deux Areas() (x=2), chacune une contien t une ligne, j'ai voulu copier chaque Areas() à part.

Pour la première Areas(1), la ligne est exécutée sans erreur :


Range(PlageNommée).Areas(1).Copy .Range("A" & L)


Mais cette deuxième ligne génère une erreur :


Range(PlageNommée).Areas(2).Copy .Range("A" & L)


Erreur définie par l'application ou par l'objet
Avatar
GL
Le 24/02/2015 23:08, a écrit :
Bonjour à tous,

Je vois qu'il y a discussion sur le sujet.

Bon ce que j'ai retenues ainsi ce que j'aurais pu tester :


For Each Ar In Range("Limite").Areas
x = x + Ar.Rows.Count
Range(PlageNommée).Areas(x).Copy .Range("A" & L)
L = L + 1
Next Ar

Puisque ma PlageNommée contient deux Areas() (x=2), chacune une contient une ligne, j'ai voulu copier chaque Areas() à part.

Pour la première Areas(1), la ligne est exécutée sans erreur :


Range(PlageNommée).Areas(1).Copy .Range("A" & L)


Mais cette deuxième ligne génère une erreur :


Range(PlageNommée).Areas(2).Copy .Range("A" & L)


Erreur définie par l'application ou par l'objet




Je pense que ça vient de votre x : x = x + Ar.Rows.Count
puis : .Areas(x) x est "out of range"

Mais je ne vois pas ce que vous voulez faire avec .Copy : sur Excel,
quand vous sélectionnez une plage de plusieurs zones p.ex. votre
G13:L13, G17:L17
initial (en utilisant la souris et CTRL) et que vous faites
copier/coller, le collage résultant est bien sur deux lignes
adjacentes...

Au départ, vous vouliez le nombre de lignes...

Cdt.
Avatar
Patrick
belle discution quand même qui a peut être éclairé certains lecteurs :)

P.

"GL" a écrit dans le message de news:
54ecaef1$0$3185$
Le 24/02/2015 17:18, Patrick a écrit :
Bonjour,

est ce un bug ou pas ?

Patrick



Un bug de plus ? Microsoft vous expliquera que non, c'est une /feature/.

Cependant : Range("$G$13:$L$13,$G$17:$L$17").Rows est une collection
d'objets Range qui contient deux éléments (comme on peut le voir avec
un For Each par exemple), par conséquent :

Range("$G$13:$L$13,$G$17:$L$17").Rows.Count

devrait renvoyer le nombre l'éléments de la collection (à savoir 2).

C'est le design même d'Excel qui est en cause : l'objet Range étant une
merde absolue (désolé pour les 5 lettres, mais c'est mérité), l'objet
Range(...).Rows

est en fait l'objet Range(...) agrémenté d'un flag "Rows" qui sera
interprété différemment selon que le contexte est .Count, For Each etc.

En principe, Range(...).Rows devrait être l'objet Range avec des Areas
re-dessinnée de sorte que chaque Area soit une ligne. Mais ce n'est
évidemment pas le cas (pour des raisons, sans doute, d'optimisation,
car, comme on sait, VBA, c'est tellement ultra rapide... no comment).

Cordialement.





---
L'absence de virus dans ce courrier electronique a ete verifiee par le logiciel antivirus Avast.
http://www.avast.com
Avatar
Jacquouille
Hello Isabelle, Daniel, ... et les autres, trop nombreux à citer,

Cas 1 - Si j'ai une plage A1:C5 et une seconde E3:F10 ... (plages séparées)
quid du nb de lignes ?
Cas 2 - Si A1:C5 et une seconde B3:F10 ... (plages imbriquées) quid du nb
de lignes?

Peut-on faire ce jeux avec les colonnes?
-----------
cas 1: x lignes et y colonnes
cas 2: x lignes et y colonnes
------------
De quel calibre sont tes balles ? -))

Jacquouille, pas vraiment compétent sur ces Areas

" Le vin est au repas ce que le parfum est à la femme."


"DanielCo" a écrit dans le message de groupe de discussion :
mcikbf$map$

Le code "à l'épreuve des balles" serait donc (sous réserve) :
Sub test2()
With [Limite]
For i = .Areas(1).Row To .Areas(.Areas.Count).Row +
.Areas(.Areas.Count).Rows.Count - 1
If Not Intersect([Limite], Rows(i)) Is Nothing Then
Ctr = Ctr + 1
End If
Next i
End With
Debug.Print "Lignes : " & Ctr
End Sub
Daniel


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
http://www.avast.com
1 2 3 4