Vba/excel : détermination d'une plage des lignes masquées

Soyez le premier à donner votre avis sur cette source.

Vue 5 012 fois - Téléchargée 491 fois

Description

Bonjour,

Excel/VBA permet la détermination d'une plage de lignes visibles au sein d'une plage spécifiée, à l'aide de specialcells(xlCellTypeVisible).
Rien n'y est par contre prévu pour déterminer la plage de celles (les lignes) qui s'y trouvent masquées.
Pour y parvenir, existe évidemment le recours possible à une boucle sur toutes les lignes et à l'utilisation de la propriété hidden et de la méthode Union.
Si cela est généralement satisfaisant dans de nombreux cas, ça ne l'est plus du tout lorsque, à la fois, la plage traitée est pléthorique et que le nombre des lignes qui y sont masquées est élevé ===>> dans un tel cas, en effet, le traitement devient à la fois très lourd et très lent.

Vous allez me dire que vous ne voyez pas les circonstances dans lesquelles on pourrait être intéressé par la détermination, au sein d'une plage A, de la plage B des lignes qui s'y trouveraient masquées ! Ce sera là votre seule affaire (les plus avertis sauront pourquoi, dans certaines circonstances, il est utile de connaître cette plage et de s'en servir adroitement).
Mais le propos n'est certes pas ici de faire l'inventaire des cas où cette détermination est utile, mais tout simplement la manière de faire cette détermination dans le temps le plus court possible.

Dans le fichier de démonstration ci-joint, un tel traitement, fait par boucle "traditionnelle", prend beaucoup plus de 1 h 30 (je ne sais combien exactement car j'ai abandonné en chemin au bout de 1 h 30). La méthode que je propose fait le même traitement en moins de 10 secondes (6,94 sur ma machine). En rappelant que je traite 60000 lignes dont environ une sur deux sont masquées !
Il n'y a donc "pas photo", n'est-ce-pas ?

Un petit mot, avant de passer au fichier/démo :
- je me suis heurté à une difficulté de taille du fait de certaines limites d'Excel/VBA en ce qui concerne le nombre maximum des "areas" d'une plage résultat de l'utilisation de specialcells.
- cette difficulté n'existe cependant pas lorsque l'on détermine une plage à l'aide de la méthode Union et ce : quel que soit le nombre total des "areas" de la plage finale.
- j'ai donc décidé de traiter par "tranches" (ce qui m'a permis d'éviter la limite de specialcells) et de conjuguer avec Union ==)=>> avec ce résultat (la demo).

- je classe ce source au niveau "débutant", car le code qui est utilisé est simple. J'ai hésité pour ce classement; pourquoi ? ===>> parce que la démarche n'était pas évidente et que j'ai travaillé un jour entier (avec d'autres démarches) avant de décider celle-ci.

Pour voir :
Ouvrir le fichier ===>> lancer la préparation (de lignes masquées) ===>> choiri la méthode ici proposée ou la méthode traditionnelle ===>>> Constater l'énorme différence de temps de traitement.
Amitiés

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215 -
Bonjour Eric (je ne pensais pas te retrouver là et suis très heureux de te retrouver).

Mille merci pour ce rapport de test, qui fait que je vais enfin pourvoir cesser de surveiller cette discussion.

Bon ===>> marche donc pour toutes les versions supérieures ou égales à 97
pijaku
Messages postés
12254
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 décembre 2019
7 > ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour,

Je relance après quelques années. Un test sur Excel 2010 révèle deux choses :
- Pas de souci d'exécution, en moins de 8 secondes la plage est correctement déterminée,
- Il n'existe plus de limitation de 16384 "areas".
Je suppose, Jacques, que tu as intégré un traitement par "tranches" de 15000 en raison de cette limitation. Cela n'a plus lieu d'être depuis Excel 2010 (j'ai testé en ne touchant pas au code mais en modifiant par : Dim tranche As Long et tranche = 60000).
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215 > pijaku
Messages postés
12254
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 décembre 2019
-
Bonjour, Franck,
Je n'ai pas Excel2010 (je n'ai que la version 2007).
Le rapport de ton observation est donc bienvenu.
Reste que si l'on à l'intention de distribuer le projet et que l'on veut "bénéficier" de tranches plus importantes, il va tout simplement falloir spécifier la taille de ces tranches en fonction de la version.(extractible par Application.Version).
Merci.
cs_Frederic45
Messages postés
60
Date d'inscription
vendredi 26 octobre 2007
Statut
Membre
Dernière intervention
30 mars 2010
-
Bonsoir à tous

J'ai retrouvé un excel 97 au fond d'un tiroir.

Pour VIKING30 :
" Quoique pour la version 1997 il risque d'y avoir un souci car je ne me rappelle pas si elle gérait déjà 65536 lignes ou 32768 lignes ! ? "
si, si, il y a bien 65536 lignes

Pour UCFOUTU :
Merci pour ce code : 6,16 (sous win7)

Eric (edelweisseric)
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215 -
salut, VIKING30

"autant je ne suis pas certain d'en comprendre toute l'utilité puisque il est possible de sélectionner toutes les lignes et de faire clic droit ==> afficher"

l'affichage n'est dans la démo que pour permettre de contrôler que la plage a bien été constituée et qu'on peut s'en servir comme on l'entend ! Ici, pour le démontrer, on a attribué une couleur (qu'elle n'avait pas) aux lignes de la plage. Ce n'est qu'un exemple et ce n'est pas un but.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.