[VBA-Excel] Détermination de la plage des lignes masquées

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 18 sept. 2011 à 10:29
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 19 sept. 2011 à 14:06
Bonjour,
Avec VBA/Excel :
Je vais profiter d'un dimanche pluvieux (là où je suis) pour tenter de coder un mécanisme rapide de détermination de la plage B des lignes masquées au sein d'une plage A spécifiée.
L'inverse, en quelque sorte, de ce que donne l'utilisation de SpecialCells(xlCellTypeVisible).

J'entends par "mécanisme rapide" un mécanisme autre que celui (pénalisant) d'une boucle sur toutes les lignes de la plage A pour déterminer leur propriété Hidden et de l'utilisation de la méthode Union pour constituer la plage B.

Je me dis toutefois que quelqu'un d'autre aurait pu s'être déjà penché sur ce problème et avoir trouvé une solution rapide et satisfaisante.

C'est la raison de l'ouverture de la présente discussion.
Si l'un d'entre vous aurait trouvé une solution "rapide", je lui serais reconnaissant de l'indiquer ici et de me permettre ainsi d'économiser mon énergie.
Merci d'avance


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

6 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
18 sept. 2011 à 11:57
Pour que l'on comprenne mieux pourquoi je tente la chose :

Voilà un petit code pour masquer une ligne sur 15 dans un range de 60000 lignes (les 60000 premières d'une feuille de calcul)
 Application.ScreenUpdating = False
 For i = 1 To 60000
   If i Mod 15 0 Then Rows(i).Hidden True
 Next
 Application.ScreenUpdating = True
 MsgBox "fait"


et (pour rappel) la méthode par boucle :

Private Sub CommandButton5_Click()
  Dim pm As Range, debut As Double
  debut = Timer
  Set pm = par_boucle(Range("A1:s60000"))
  MsgBox "fait en " & Timer - debut & " secondes"
End Sub

Private Function par_boucle(ByVal pt As Range) As Range
  Dim r As Range
  For Each r In pt.Rows
    If r.Hidden = True Then
      If par_boucle Is Nothing Then
        Set par_boucle = r
      Else
        Set par_boucle =  Union(par_boucle, r)
      End If
    End If
  Next
End Function


Environ une minute de traitement sur ma machine !
et si, au lieu de masquer une ligne sur 15, on en masque une sur deux (essayez donc), cela va prendre un tel temps que vous pourrez allez faire vos courses (et sans vous presser) et revenir !

Je suis pour l'instant parvenu_ à diviser par deux ce temps, mais c'est encore trop long.
Le but est d'y parvenir en au moins 20 fois moins de temps.
J'essaye encore ...

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
18 sept. 2011 à 18:38
Bon.
J'en suis à déterminer en moins de 1 seconde la plage masquee B dans une plage totale de 10000 lignes dont une sur deux est masquée, ce qui est un progrès considérable.

Mais je me heurte à un problème annexe qui me gêne assez pour aller au-delà. Le voici :
Excel/VBA n'est pas capable de traiter une plage trop "complexe" (ici dans A) , c'est-à-dire une plage composée de plus d'un certain nombre d' "aires" (areas).
Ce nombre parait à première vue osciller autour de 5000 areas.
Question : Quelqu'un connait-il cette limite exacte ?

Tout ce que je trouve sur l'aide VBA à ce propos me montre que je vais devoir tenter de "fractionner" la plage A en "morceaux" de taille acceptable, sans toutefois avoir la certitude de ce que je ne vais pas rencontrer un problème de même nature pour ce qui est du nombre d'areas de la plage masquée B.
Dans tous les cas de figure et dans cette perspective, il me serait diablement utile de déterminer la limite objet de la question mise en souligné gras ci-dessus.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
18 sept. 2011 à 20:14
Bonjour ucfoutu,

Dans une sheet, j'ai inséré une valeur en colonne A une ligne sur 2.
En testant ce code, je constate que le nombre d'aréas maxi ressort à 8192 (16384 dans la constante Y).
Au delà, on obtient 1 aréa.
Sub test()
Dim Rg As Range
Dim X As Range, A As Long, Adr As String
Const Y As Integer = 16384
Set Rg = Range("A1:A" & Y)
Set X = Rg.SpecialCells(xlCellTypeConstants, 1)
A = X.Areas.Count
MsgBox A
End Sub

Je ne sais pas si ça répond à ta question, car tu parles d'une valeur de 5000 environ.

Cordialement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
18 sept. 2011 à 20:44
Merci GG72,
Oui, cela répond à ma question.
Je viens d'ailleurs d'arriver à la même limite, avec specialcells (celles-ci ou d'autres).
La limite est celle du nombre d'areas.
Avec l'exemple de une sur deux, cela conduit bien sûr au double, en nombre de lignes, mais c'est bien le nombre d' areas qui est une limite.
Je viens également de tester d'une autre manière (pas par specialcells) la composition d'une plage composée de nombreuses "areas" ==>> et là ===>> pas de limite encore ! ===>> ce qui, à la fois :
- montre que seules les plages obtenues par spécialcells ont cette limite
- va me conduire à continuer ma démarche, en décomposant/fractionnant puis en joignant les "bouts" (ce sera un exercice un peu acrobatique, mais non sans réel espoir).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
18 sept. 2011 à 21:34
J'ai le grand plaisir de faire maintenant savoir que ma gymnastique est apparemment concluante et payante.
J'attends demain matin pour faire des tests/grattages à tête reposée et y ajouter les cas particuliers (tout masqué et rien masqué)
Si tests tous bons ===>> je dépose demain un source ou un snippet (ce sera à voir, car le snippet risquerait de ne pas être suffisamment clair sur certains points).
Bonne nuit


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
19 sept. 2011 à 14:06
Pour ceux que cela intéresserait :
Code déposé à l'instant ICI
Vous y verrez (avec l'exemple choisi) qu'il n'y "a pas photo" en matière de comparaison de temps de traitement.

Discussion terminée en ce qui me concerne.
Amitiés

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0