OutIdx. Macro complémentaire, modules de classe et indexation

Dranreb

XLDnaute Barbatruc
Fichier disponible dans l'espace de téléchargement : Excel Downloads - OutIdx

Bonjour à tous.
Allez, c'est décidé, je me lance.
Je propose mon classeur de macro complémentaire OutIdx.
C'est aussi le nom de son projet VBA afin que sa référence se repère aisément.
Choisissez lui un répertoire de résidence stable avant de l'ajouter aux références d'un classeur utilisateur.
Ce qui n'est d'ailleurs indispensable que pour utiliser ses fonctionnalités VBA.
Il n'y a pas encore de classeur utilisateur de démonstration. Mais si certains d'entre vous ont envie de participer à son élaboration ou souhaitent en creuser certains aspects, qu'ils me soumettent leur classeur comportant la feuille et/ou l'userform qui en illustrerait cette utilisation. Si ça entre dans le cadre de quelque chose que le classeur peut apporter, je me ferais un plaisir de compléter ça de ce qu'il faudra pour répondre entièrement à la question "comment".
Par ailleurs certain d'entre vous souhaitent discuter modules de classes. Cette discussion est dans le sujet, puisqu'il y en a 5 dans ce classeur, dont 3 sont même conçus pour décréter des évènements. Les procédures pour les gérer peuvent tout à fait être implantées à l'aide des deux liste déroulantes qui surmontent la fenêtre de code, à condition de ne pas oublier le mot clé WithEvents dans leur déclaration.
Les composants les plus importants ont été pas mal testés dans divers classeurs de demandeurs. Mais pas encore avec succès comme objets définis hors du projet VBA utilisateur, dans un classeur de macro complémentaire.
On ne peut pas tout savoir. J'ai veillé depuis à mettre mes classe PublicNotCreatable et ai ajouté les procédures nécessaires à leur procurer une instance depuis OutIdx. J'espère que ça ira.
Le but est d'avoir à faire à quelque chose d'aussi simple à utiliser que ça puisse paraître complexe à l'intérieur.
Encore faudra-t-il des exemples concrets de cette simplicité.
Amicalement,
À +


5Ajout de la méthode DernierDico et de la fonction LignesDico, toujours en vue de récupérer certaines possibilités de ComboBoxLiés.ven, 20 juil 2012
4Ajout des méthodes NouvelIndex et PremierVide à ComboBoxCasc en vue de récupérer certaines possibilités de ComboBoxLiés.jeu, 12 juil 2012
3Ajout d'une méthodes DicArbo à ComboBoxCasc pour pouvoir éventuellement gérer d'autres sources.jeu, 05 juil 2012
2Remplacement de la procédure Parer (inopérante) par les fonctions CbxCasc, CbxLiés, CbxMembre, RapStruc et TabIdx à utiliser avec des Set.dim, 08 juil 2012
1Découverte de la nécessité de déclarer les modules de classe PublicNotCreatable, et création d'une procédure Parer pour créer les instances.mar, 03 juil 2012
 

Pièces jointes

  • DémoOutIdx.xls
    567 KB · Affichages: 496
  • OutIdx.xls
    582 KB · Affichages: 460
  • OutIdx.xls
    582 KB · Affichages: 488
  • OutIdx.xls
    582 KB · Affichages: 511
Dernière modification par un modérateur:

Staple1600

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonsoir à tous, Bonsoir Dranreb

Merci pour le partage de ce bel ouvrage ;)

Un vrai régal, rien qu'à lire le code VBA :)

Whaouh ;)

Bon ,par contre, il va me falloir un peu de temps pour en comprendre toute la substantifique moelle.

Merci en tout cas et chapeau bas, Dranreb.

bravo-7.gif
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Cher ami Dranreb,

Tu as de nombreuses foi prouvé tes compétences en VBA, je ne mettrais pas en cause ces compétences
Cependant, une question me brûle les lèvres, ce qui pourrait mettre en cause une autre de tes compétences (pédagogie ?), et bien que je m'intéresse aux modules de classes (sans les maîtriser), l'ouverture de ton classeur ne m'a pas permis d'y répondre : à quoi ça sert ?
J'apprécie la documentation mise en place, mais elle est pour le moins cryptique pour le béotien que je suis

Merci à toi
 

Dranreb

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

à quoi ça sert ?
Si j'ajoutais en dessous : "Ce classeur apporte des facilités dans la gestion des ComboBox enchaînés, l'établissement de listes récapitulatives sans doublons, et toute autre application également susceptible de mettre à profit des classements en mémoires, ou l'utilisation de dictionnaires arborescents." ?
C'est ajouté, ce sera joint à la prochaine version.
À +
 

Jam

XLDnaute Accro
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Salut Dranreb, Tototiti, Staple (que du beau monde ici :))

Je peux faire quelques remarques, pas méchantes, c'est juste que je veux comprendre:
- Comme Tototiti, j'ai pas compris à quoi cela pouvait vraiment servir, mais bon ça c'est éventuellement accessoire (enfin pour moi, hein).
- Concernant le code j'ai plusieurs commentaires: il en manque pour bien le comprendre et l'indentation est pas facile à suivre. Je trouve que tu abuses des 2 points ':' ce qui, à mon sens, rend le code difficile à lire à défaut de le rendre plus efficace.

Allez, je prend juste un (tout petit bout) exemple (Feuille Aide, Procédure FollowHyperlink)
Code:
For J = 0 To 3
            L = Code.ProcBodyLine(Nom, J)
            If Err = 0 Then
               If L < LDéb Then LDéb = L
            Else
               Err.Clear: End If
            Next J
Perso, j'ai donc du mal à comprendre (indentation, pas de commentaire et le If : End If que tu lis machinalement If...Else...Next...hum en fait non j'ai raté un embranchement :p). Ton code est super compact en général ce qui le rend difficile à lire pour qui veut mettre le nez dedans.
Pardonne-moi si tu me trouve bien difficile ou un peu dur dans la critique.

En tout cas merci pour ce partage, car en fouillant bien j'aurai certainement beaucoup de chose à y apprendre.
Et par exemple ce snippet m'intrigue beaucoup:
Code:
'Feuille Aide, Private Sub Filtrer
With Intersect(Me.[A1:AidDescr], Me.[AidFeui:AidVM].EntireRow)
      Me.Range(.Rows(0), .Rows(.Rows.Count)).AutoFilter: End With

Et si tu éclaires encore un peu plus ma (notre) lanterne, alors ce ne sera que mieux.

Bonne nuit.
 

Dranreb

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Ben quoi ? Ça installe les flèches du filtre automatique au dessus d'une plage rectangulaire défini par l'intersection entre les colonnes allant de la A jusqu'à celle de AidDescr et des lignes allant de celles de AideFeuill à AidVM, soit toute la partie où on pourrait avoir envie de chercher quelque chose plus la A dont le filtre est piloté par les deux cases à cocher, l'une pour afficher ou non les fournitures de cette feuille Aide elle même, et l'autre les plages système. Quoi d'anormal ? Pas absolument sûr que ça puisse s'écrire plus court, mais possible après tout…
Cette programmation ne fait pas partie des fournitures à étudier liées à l'exploitation du classeur: elle est propre à la feuille Aide qui à sa propre programmation indépendante. Un peu comme les mitochondries des cellules, qui ont leur propre ADN, lequel ne fait pas partie du génome humain. Bon d'accord, là je m'égare !

Quand à mon indentation, celle là tu ne me la changeras pas. Elle part du principe que la dernière instruction qui ferme toute forme de bloc fait encore partie de ce bloc. Visuellement c'est plus l'indentation très rigoureusement appliquée de ma part aux instructions exécutables qui fait foi. C'est plus lisible: Les End If à l'indentation du niveau plus global alourdissent inutilement celui ci au détriment des seules instructions vraiment utiles à son fonctionnement et à sa compréhension, tandis que le niveau interne terminé par elle ne peut plus s'en trouver alourdi.

Bonne nuit toi aussi.
 

david84

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonjour,
Merci Dranreb d'avoir ouvert cette discussion qui devrait permettre de nous initier aux modules de classe et merci pour ce fichier.
Pour ma part, je n'en ai jamais utilisé mais le sujet m'intéresse. Je n'en ai donc qu'une connaissance livresque et basique.

Ce type de module, c'est un peu la boîte noire pour les uns et la pierre philosophale pour les autres :

- on peut très bien monter des applications très sympa sans les utiliser, d'où la question récurrente : à quoi cela sert ?

- ceux qui les utilisent respectent plus ou moins (et quelquefois pas du tout) les préconisations d'encapsulation des modules de classe (c'est à dire qu'à aucun moment, une classe ne doit avoir besoin de données externes pour fonctionner) -d'où ma question posée sur le fil de Tototiti- voir même pas du tout, d'où mon interrogation...

J'en suis venu à la conclusion qu'il existe différents types de modules de classe :

- ceux qui ne servent simplement qu'à mutualiser des procédures afin de ne pas les multiplier dans un module classique : c'est le cas par exemple de l'initialisation de plusieurs contrôles de même type dans un UserForm

- les véritables modules de classe, dont le but est d'être exportable dans un autre fichier et qui eux doivent normalement répondre à l'exigence d'encapsulation.

Est-ce cela ?

L'ouverture de cette discussion est l'occasion pour moi de (re)lire des totoriels sur le sujet : je serai donc amené à te poser des questions sûrement basiques pour ne pas dire plus...

je vais également regarder les modules que tu nous as concoctés et te poserai des questions dessus.

Attention : il va falloir y aller doucement et que m'expliques les choses simplement, "comme si j'avais 4 ans" (dixit Denzel Washington dans Philadelphia) !

A+
 

Dranreb

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonjour.
Je ne vois pas pour l'instant à quel danger ou limitation technique réelle correspondent les rubriques parlant d'encapsulation dans l'article de Fauconnier. C'est peut être une exigence au sein des classes réalisées par Microsoft mais c'est tout. Si encore il était plus simple de fabriquer des fichiers d'aides .hlp je dirais pas mais là c'est tellement imbitable et payant cette organisation standard là… Et puis je n'ai pas besoin que le texte du message d'erreur soit traduit dans toutes les langues.
Cordialement.
 

david84

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Re
Je ne vois pas pour l'instant à quel danger ou limitation technique réelle correspondent les rubriques parlant d'encapsulation dans l'article de Fauconnier. C'est peut être une exigence au sein des classes réalisées par Microsoft mais c'est tout. Si encore il était plus simple de fabriquer des fichiers d'aides .hlp je dirais pas mais là c'est tellement imbitable et payant cette organisation standard là… Et puis je n'ai pas besoin que le texte du message d'erreur soit traduit dans toutes les langues.
Ok, c'est bon à savoir.
Merci et A+
 

Jam

XLDnaute Accro
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Salut
Dranreb​
,​

Ça installe les flèches du filtre automatique au dessus d'une plage rectangulaire...
Effectivement, c'est une belle composition syntaxique :cool:. Bravo.

Cette programmation ne fait pas partie des fournitures à étudier (...)
Certes, mais comme je suis curieux, ben j'ai pas pu m'empêcher de regarder :D.

Quand à mon indentation, celle là tu ne me la changeras pas.
Bien loin de moi de vouloir te changer :eek:, nous avons tous nos petites manies. Néanmoins je ne peux m'empêcher de penser que cela rend ton code beaucoup moins lisible, surtout s'il est mis à dispo du public/béotien.

Cordialement,
 

MJ13

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonjour à tous

Félicitations Dranreb :) pour ce fichier exceptionnel (comme d'habitude). Comme mes petits camarades, je n'ai pas tout compris, mais rien que le click et on atteind le code, ça déménage dèja :eek:. J'ai même pas compris le principe :confused:.

Je vais suivre avec impatience les prochains post :).
 

Dranreb

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonsoir à tous.

Bien, bien.
Ça ne se bouscule pas vraiment pour me proposer des feuilles pouvant s'insérer dans le classeur de démo.
J'espère ne pas m'être mal fait comprendre: le but n'était pas de vous faire appliquer la doc pour l'utiliser.
Évidemment puisque j'estimais qu'il fallait un classeur de démo, c'est que j'estimais que la doc ne suffisait pas pour que vous puissiez le faire !
La vérité c'est que je manquais de jeu de données attrayants sur quoi baser les exemples.
Mais j'en ai quand même commencé un, joint au premier post. Le OutIdx a aussi un peu évolué: les procédures d'instanciations ne marchaient pas. Le classeur de démo est aussi fait pour mettre au point OutIdx. Les essais récents de Tototiti2008 m'ont aussi incité à y intégrer de quoi classer un tableau de Variant sur certaines colonnes en croissant ou décroissant.
Pour éviter de trop s'embêter avec les liaisons impossibles vers des répertoires inconnus, résultant inévitablement des mises en pièces jointes puis récupérations, DémoOutIdx.xls est équipé d'automatismes dans son ThisWorkbook qui devrait faciliter le rétablissement des liaisons avec OutIdx.xls, surtout si ce dernier est encore ouvert après avoir été préalablement sauvegardé sur un bon dossier.
Par la suite OutIdx est ouvert d'office quand on ouvre DémoOutIdx car il est référencé par son projet VBA.

À +
 

david84

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonjour,
Désolé mais je ne suis pas très présent en ce moment.
Ça ne se bouscule pas vraiment pour me proposer des feuilles pouvant s'insérer dans le classeur de démo
Pour l'instant, cela ne se bouscule pas tout court, mais il faut du temps du lancer un fil de ce type (cela a fait la même chose pour la discussion qui touche au RegExp initiée par JNP).
Comme le fichier OutIdx est très riche, il est difficile de le décrypter et d'en comprendre son utilisation (pas évident le mode d'emploi !).
Il faudrait des exemples concrets permettant de comprendre l'utilité de chaque module.
Peut-être mettre notamment en lien les fichiers que tu avais produits concernant le tri sur plage multicolonne et les listes en cascade afin que les personnes puissent voir des applications concrètes (et d'autres s'il y en a).

Comme je l'ai dit dans mon message précédent, on peut très bien monter des applications très sympa sans utiliser de module de classe : il faudrait peut-être que tu expliques quel est l'intérêt d'utiliser un module de classe plutôt qu'un module classique (c'est peut-être basique comme question mais si tu veux que les personnes puissent s'intéresser à cette discussion, il faut sûrement commencer par la base).

Concernant l'utilisation du fichier Démo, cela plante lorsque j'active une feuille :
Code:
Private Sub UserForm_Initialize()
Set Plage = OutIdx.PlgUti(Exemple1.[A2]) ' Définit Plage comme étant la plage utilisée à partir de la cellule A2.
Set Casc = OutIdx.CbxCasc("Avec couleurs") ' Procure une instance à la variable Casc. Le paramètre X peut être soit omis, soit n'importe quoi.
Casc.Add Me.CbxLettre, Plage.Columns("H") ' Ajoute le ComboBox CbxLettre, à garnir selon la colonne H de Plage.
Casc.Add Me.CbxMot, Plage.Columns("D") ' Ajoute le ComboBox CbxMot, à garnir selon la colonne D de Plage.
Casc.Actualiser ' Le fait jouer avec ça, c'est tout ! (remarque: refaire juste Actualiser si le code change le contenu de Plage).
End Sub
à cette ligne
Code:
Set Casc = OutIdx.CbxCasc("Avec couleurs")
("erreur de compilation : membre de méthode ou de données introuvables").
Ou est mon erreur ?
A+
 

Dranreb

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonjour.

As tu la dernière version de OutIdx ? C'est une fonction récente. À l'origine c'était une procédure "Parer" qui devait s'en charger, mais elle n'était pas opérationnelle parce qu'elle devait servir à plusieurs objets, or leur type n'était pas reconnaissable avant d'obtenir l'instance.

L'avantage principal du module de classe c'est de n'avoir pas besoin de déclarer, avec tous les risques d'erreurs que cela comporte, de variables qui vont interagir avec la ou les procédures: L'objet est équipé des propriétés qui en font office.

Edit: Je ne vois pas comment on pourrait écrire autrement un système capable d'indexer n'importe quoi sans être obligé de réécrire et mettre au point toute une entière procédure quick-sort différente pour chaque façon différente d'effectuer les comparaisons dont on a besoin. Là on n'a à s'occuper que des comparaisons, et si on ne veut plus non plus trop s'en occuper pour les plus courantes on peut écrire pour chacune une procédure qui renvoie une TableIndex prête à l'emploi. Dans OutIdx il y a ainsi TbIdxTV et TbIdxTVcd. Le 1er permet d'indexer un tableau de Variant sur les colonnes de tête uniquement en ordre croissant, mais est entouré de procédures qui permettent de construire ce tableau facilement à partir de plages de différentes colonnes et de tables de Variant. Le second m'a été inspiré par Tototiti et permet de classer un tableau brut sur certaines colonnes en ordre croissant ou décroissant (c'était une lacune de ne pouvoir le faire, bien que l'organisation soit suffisamment modulaire pour pouvoir inverser le signe des valeurs d'une colonne avant de procéder à l'indexation).
Et, j'allais oublier, dans la procédure CalculerRécap du module MRécapituler, il y a une troisième indexation, interne celle là, sur un seul argument mais avec possibilité de fusionner deux tables (utilisable par la Sub MàJRécap, non par la Function Récap)

Avec la possibilité de déclencher des évènements, un module de classe peut en plus complètement délocaliser la complexité la plus pointue.

Cordialement
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : OutIdx. Macro complémentaire, modules de classe et indexation

Bonjour,
As tu la dernière version de OutIdx ? C'est une fonction récente.
J'ai enregistré les OutIdx et DémoOutIdx, non pas en tant que macros complémentaires, mais en les plaçant dans un répertoire à ton nom.
Lorsque j'ouvre le classeur Démo, OutIdx s'ouvre automatiquement.
Lorsque je suis sur le classeur Démo et que je veux passer d'une feuille à l'autre, cela plante à l'endroit que je t'ai indiqué.
Comme je suis en version Excel 2010 64 bits, je testerai sur une version 2007 32 bits pour voir.

Dans OutIdx il y a ainsi TbIdxTV et TbIdxTVcd. Le 1er permet d'indexer un tableau de Variant sur les colonnes de tête uniquement en ordre croissant, mais est entouré de procédures qui permettent de construire ce tableau facilement à partir de plages de différentes colonnes et de tables de Variant. Le second m'a été inspiré par Tototiti et permet de classer un tableau brut sur certaines colonnes en ordre croissant ou décroissant (c'était une lacune de ne pouvoir le faire, bien que l'organisation soit suffisamment modulaire pour pouvoir inverser le signe des valeurs d'une colonne avant de procéder à l'indexation).
Et, j'allais oublier, dans la procédure CalculerRécap du module MRécapituler, il y a une troisième indexation, interne celle là, sur un seul argument mais avec possibilité de fusionner deux tables (utilisable par la Sub MàJRécap, non par la Function Récap)
Le plus simple, si tu veux que l'on comprenne à quoi cela sert, est de placer un petit fichier exemple dans lequel les différentes possibilités seraient montrées et la procédure de mise en oeuvre expliquée et visualisée concrètement.
Exemple pour les différentes possibilités de tri :
- le tableau de départ non trié (x lignes sur 4 colonnes par exemple)
- comment faire pour le trier en ordre croissant
- comment faire pour le trier en ordre décroissant
- comment faire pour le transposer
- etc.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa