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.
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
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
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
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
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
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.
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...
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.
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
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
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
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
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.
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
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.
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
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 :
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
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.
Le 24/02/2015 23:08, elatlas@gmail.com 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...
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.
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
belle discution quand même qui a peut être éclairé certains lecteurs :)
P.
"GL" <gouailles@gmail.com> a écrit dans le message de news:
54ecaef1$0$3185$426a74cc@news.free.fr...
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
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
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
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$1@speranza.aioe.org...
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
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