Icône de la ressource
Bonjour,
Vous trouverez une version 3.4 qui a fait totalement peau neuve concernant l'interface utilisateur.
Les boutons dans les onglets ont été abandonnés au profit d'un ruban.
Ayant connu des déboires avec les versions 2007 et 2010 je me suis réconcilié.
Bon tout n'est pas encore parfait mais la version 1.9 de l'UIRibbon apporte quelques satifactions.
1750185504281.png


Voici le ruban
1750185469311.png


Codification XML de ce dernier
XML:
<!-- ===================== -->
<!-- RibbonUI LIBMAC       -->
<!-- Auteur  : OGURUMA     -->
<!-- Date    : 16/06/2025  -->
<!-- Version : 3.4         -->
<!-- ===================== -->

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="LIBMAC_onLoad">
    <!--On masque les onglets par défaut-->
    <ribbon startFromScratch="false">
        <tabs>
            <tab id="customTab" label="Modules VBA - PowerQuery" insertAfterMso="TabHome">
                
                <!-- Groupe inventaire des fichiers -->
                <!-- ============================== -->
                <group id="InvGroup" label="Inventaire des fichiers">
                    
                <!-- Fonctions concernant l'inventaire des fichiers -->
                <!-- ============================================== -->                   
                    <button id="InvActualiser"   label="Inventorier"    size="normal" onAction="RibbonInvActualiser"      image="actualiser10"    supertip="Recherche les fichiers à traiter via une requête PowerQuery"           />
                    <button id="InvExtraire"     label="Extraire"       size="normal" onAction="RibbonInvExtraire"        image="inventaire10"    supertip="Extrait les macros VBA, les requêtes PowerQuery, les fonctions LAMBDA" />
                    <button id="InvEffacer"      label="Effacer"        size="normal" onAction="RibbonInvEffacer"         image="eraser10"        supertip="Efface le contenu du tableau"                                          />
                    <button id="InvExporter"     label="Exporter CSV"   size="normal" onAction="RibbonInvExporterCSV"     image="csv10"           supertip="Exporte le contenu du tableau dans un fichier .csv"                    />       
                    <button id="InvDossiers"     label="Dossiers"       size="normal" onAction="RibbonInvChoisirDossiers" image="dossier10"       supertip="Sélection des dossiers à inventorier"                                  />       
                    <button id="InvDefaut"       label="Défaut"         size="normal" onAction="RibbonInvDefautDossier"   image="default10"       supertip="Dossier par défaut"                                                    />       
                    <button id="InvRazFiltres"   label="Raz filtres"    size="normal" onAction="RibbonInvRazFiltres"      image="reinit210"       supertip="Efface les filtres du tableau"                                         />
                    
                    <!-- Gestion des critères et effacement -->
                    <!-- ================================== -->   
                    <menu id="menuRazParams"     label="Raz paramètres" size="normal"                                     image="poub10" >
                        <button id="InvRazParams"  label="Tous"                       onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface tous les paramètres de recherche des fichiers"  />
                        <button id="InvRazType"    label="Type fichiers"              onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère type de fichiers"                    />
                        <button id="InvRazDateCre" label="Date de création"           onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère date de création"                    />
                        <button id="InvRazDateMod" label="Date de modification"       onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère date de modification"                />
                        <button id="InvRazDateAcc" label="Date de dernier accès"      onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère date de dernier accès"               />
                        <button id="InvRazTri1"    label="Critère de tri 1"           onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère de tri n°1"                          />
                        <button id="InvRazTri2"    label="Critère de tri 2"           onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère de tri n°2"                          />
                        <button id="InvRazName"    label="Name"                       onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère Name"                                />
                        <button id="InvRazFolder"  label="Folder"                     onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface le critère Folder"                              />                       
                        <button id="InvRazDossier" label="Dossiers à explorer"        onAction="RibbonInvRazParams"       image="poub10"          supertip="Efface la liste des dossiers à examiner"               />                       
                    </menu>
                        
                    <!-- Rétention -->
                    <!-- ========= -->                           
                    <button id="InvRazSelection" label="Raz rétention"  size="normal" onAction="RibbonInvRazSelection"    image="croixroige10"    supertip="Efface la sélection des fichiers" />                                                                               
                    
                    <separator id="sep1"/>   
                    
                    <!-- Options -->
                    <!-- ======= -->
                    <checkBox id="chkInvBoxSousDossier" label="Sous-sossiers"         onAction="RibbonInvChkBoxSousDossiers"  getPressed="RibbonInvChkBoxSousDossiers_getPressed" enabled="true" />
                    <checkBox id="chkInvBoxLog"         label="Log"                   onAction="RibbonInvChkBoxLog"        />                   
                    <checkBox id="chkInvRetention"      label="Rétention"             onAction="RibbonInvChkRetention"     />
                    <checkBox id="chkInvBoxAutofit"     label="Autofit"               onAction="RibbonInvChkAutofit"       />
                    
                    <!-- Liste de choix sur le mode d'extraction souhaité -->
                    <!-- ================================================ -->
                    <dropDown id="dropMode"       label="Mode : "            onAction="dropMode_onAction"      getSelectedItemID="dropMode_SelectedItemID" >
                        <item id="ModeItemRempl"  label="REMPLACEMENT"  />
                        <item id="ModeItemAjout"  label="AJOUT"         />
                    </dropDown>
                
                    <!-- Liste de choix sur le type d'extraction souhaitée -->
                    <!-- ================================================= -->
                    <dropDown id="dropExtraction" label="Extraction : "      onAction="dropExtraction_onAction" getSelectedItemID="dropExtraction_SelectedItemID" >
                        <item id="ModeItemMacros" label="MACROS"      image="vb10"      />
                        <item id="ModeItemPwq"    label="POWERQUERY"  image="requete10" />
                        <item id="ModeItemLambda" label="LAMBDA"      image="lambda10"  />
                    </dropDown>                   
                    
                </group> 
                                      
                 <!-- Groupe choix des onglets -->
                <!-- ======================== -->
                 <group id="WksGroup" label="Navigation">
                    <splitButton id="SplitWks" size="normal">
                    <button id="WksBtn_btn1" imageMso="AnimationGallery" label="Fonctionnalités" supertip="Onglets des fonctionnalités" onAction="WksBtn_onAction"            />                 
                    <menu id="splitBtn_menu" itemSize="large">
                        <button id="WksBtn_INV" image="inventaire10"     label="Inventaire"           onAction="WksBtn_onAction" description="Liste des fichiers inventoriés" />
                        <button id="WksBtn_MAC" image="vb10"             label="Macros"               onAction="WksBtn_onAction" description="Liste des Maros VBA"            />
                        <button id="WksBtn_PWQ" image="requete10"        label="Powerquery"           onAction="WksBtn_onAction" description="Liste des Requêtes Powerquery"  />
                        <button id="WksBtn_LBD" image="lambda10"         label="Fonctions Lambda"     onAction="WksBtn_onAction" description="Liste des fonctions Lambda"     />
                        <button id="WksBtn_BIB" image="bib10"            label="Bibliothèque"         onAction="WksBtn_onAction" description="Contenu de la bibliothèque"     />
                        <button id="WksBtn_QRY" image="loupe210"         label="Recherches de Macros" onAction="WksBtn_onAction" description="Recherches de modules Macros"   />                       
                    </menu>                     
                    </splitButton>
                </group>
                        
                 <!-- Menu -->
                 <!-- ==== -->
                <group id="grp_menu" label="Gestion">                                       
                    <!-- Gestion des modules VBA -->
                    <!-- ======================= -->
                    <menu id="menuVBA" label="VBA"         size="large"                                               image="vb10" >
                        <button id="VBA_ExportCSV"         label="Export CSV"                 onAction="VBA_onAction" image="csv10"               supertip="Exporter le tableau vers un fichier .csv"     />
                        <button id="VBA_Extract2Dossier"   label="Extraire vers dossier"      onAction="VBA_onAction" image="extraire2dossier10"  supertip="Extraire les modules vers le dossier Excel"   />
                        <button id="VBA_Extract2Biblio"    label="Extraire vers biblio "      onAction="VBA_onAction" image="bib10"               supertip="Extraire les modules vers la bibliothèque"    />
                        <button id="VBA_Actualiser"        label="Actualiser"                 onAction="VBA_onAction" image="actualiser10"        supertip="Actualiser le tableau"                        />
                        <button id="VBA_EffacerTab"        label="Effacer le tableau"         onAction="VBA_onAction" image="eraser10"            supertip="Effacer le tableau"                           />
                        <button id="VBA_EffacerFlt"        label="Effacer les filtres"        onAction="VBA_onAction" image="reinit210"           supertip="Effacer les filtres"                          />
                        <button id="VBA_SelectAll"         label="Sélectionner tout"          onAction="VBA_onAction" image="cocheverte10"        supertip="Tout sélectionner"                            />
                        <button id="VBA_DelSelect"         label="Supprimer la sélection"     onAction="VBA_onAction" image="croixroige10"        supertip="Effacer la sélection"                         />
                    </menu>
                        
                    <!-- Gestion des modules PWQ -->
                    <!-- ======================= -->
                    <menu id="menuPWQ" label="Powerquery"  size="large"                                               image="requete10" >
                        <button id="PWQ_ExportCSV"         label="Export CSV"                 onAction="PWQ_onAction" image="csv10"              supertip="Exporter le tableau vers un fichier .csv"     />
                        <button id="PWQ_Extract2Dossier"   label="Extraire vers dossier"      onAction="PWQ_onAction" image="extraire2dossier10" supertip="Extraire les modules vers le dossier Excel"   />
                        <button id="PWQ_Extract2Biblio"    label="Extraire vers biblio "      onAction="PWQ_onAction" image="bib10"              supertip="Extraire les modules vers la bibliothèque"    />
                        <button id="PWQ_Actualiser"        label="Actualiser"                 onAction="PWQ_onAction" image="actualiser10"       supertip="Actualiser le tableau"                        />
                        <button id="PWQ_EffacerTab"        label="Effacer le tableau"         onAction="PWQ_onAction" image="eraser10"           supertip="Effacer le tableau"                           />
                        <button id="PWQ_EffacerFlt"        label="Effacer les filtres"        onAction="PWQ_onAction" image="reinit210"          supertip="Effacer les filtres"                          />
                        <button id="PWQ_SelectAll"         label="Sélectionner tout"          onAction="PWQ_onAction" image="cocheverte10"       supertip="Tout sélectionner"                            />
                        <button id="PWQ_DelSelect"         label="Supprimer la sélection"     onAction="PWQ_onAction" image="croixroige10"       supertip="Effacer la sélection"                         />
                    </menu>                         

                    <!-- Gestion des modules LBD -->
                    <!-- ======================= -->
                    <menu id="menuLBD" label="Lambda"      size="large"                                               image="lambda10" >
                        <button id="LBD_ExportCSV"         label="Export CSV"                 onAction="LBD_onAction" image="csv10"              supertip="Exporter le tableau vers un fichier .csv"   />
                        <button id="LBD_Actualiser"        label="Actualiser"                 onAction="LBD_onAction" image="actualiser10"       supertip="Actualiser le tableau"                      />
                        <button id="LBD_EffacerTab"        label="Effacer le tableau"         onAction="LBD_onAction" image="eraser10"           supertip="Effacer le tableau"                         />
                        <button id="LBD_EffacerFlt"        label="Effacer les filtres"        onAction="LBD_onAction" image="reinit210"          supertip="Effacer les filtres"                        />
                    </menu>
                        
                    <!-- Gestion des modules BIB -->
                    <!-- ======================= -->
                    <menu id="menuBIB" label="Biblio"      size="large"                                               image="bib10" >
                        <button id="BIB_ExportCSV"         label="Export CSV"                 onAction="BIB_onAction" image="csv10"              supertip="Exporter le tableau vers un fichier .csv"   />
                        <button id="BIB_Actualiser"        label="Actualiser"                 onAction="BIB_onAction" image="actualiser10"       supertip="Actualiser le tableau"                      />
                        <button id="BIB_EffacerTab"        label="Effacer le tableau"         onAction="BIB_onAction" image="eraser10"           supertip="Effacer le tableau"                         />
                        <button id="BIB_EffacerFlt"        label="Effacer les filtres"        onAction="BIB_onAction" image="reinit210"          supertip="Effacer les filtres"                        />
                        <button id="BIB_ExportHtml"        label="Export HTML"                onAction="BIB_onAction" image="html04"             supertip="Exporter le tablleau au format HTML"        />
                        <button id="BIB_ExportXml"         label="Export XML"                 onAction="BIB_onAction" image="xml05"              supertip="Exporter le tablleau au format XML"         />
                        <button id="BIB_ExportJson"        label="Export JSON"                onAction="BIB_onAction" image="json05"             supertip="Exporter le tablleau au format JSON"        />
                    </menu>
                        
                    <!-- Gestion des modules QRY -->
                    <!-- ======================= -->
                    <menu id="menuQRY" label="Recherches"  size="large"                                               image="loupe210" >
                        <button id="QRY_ExportCSV"         label="Export CSV"                 onAction="QRY_onAction" image="csv10"              supertip="Exporter le tableau vers un fichier .csv"   />
                        <button id="QRY_Actualiser"        label="Actualiser"                 onAction="QRY_onAction" image="actualiser10"       supertip="Actualiser le tableau"                      />
                        <button id="QRY_EffacerFlt"        label="Effacer les filtres"        onAction="QRY_onAction" image="reinit210"          supertip="Effacer les filtres"                        />
                        <button id="QRY_RazParams"         label="Raz paramètres"             onAction="QRY_onAction" image="poub10"             supertip="Efface les paramètres de recherche"         />
                    </menu>                           
                </group>
                    
                 <!-- Groupe configuration et infos  -->
                <!-- ============================== -->
                <group id="CfgGroup" label="Configuration">
                    <button id="CfgVersion"   label="Version"    size="normal" onAction="Cfg_onAction"  image="information10" supertip="Version de l'application"       />
                    <button id="CfgLOV"       label="LOV"        size="normal" onAction="Cfg_onAction"  image="lov10"         supertip="Liste des valeurs automatiques" />
                    <button id="CfgMessages"  label="Messages"   size="normal" onAction="Cfg_onAction"  image="message10"     supertip="Messages dialogue utilisateur"  />
                    <button id="CfgParams"    label="Paramètres" size="normal" onAction="Cfg_onAction"  image="param10"       supertip="Paramètres de l'application"    />       
                    <button id="CfgInv"       label="Inventaire" size="normal" onAction="Cfg_onAction"  image="lib05"         supertip="Retour à l'onglet inventaire"   />       
                </group> 
                    
            </tab>
        </tabs>
    </ribbon>
</customUI>

Au passage vous remarquerez :
- fichier commenté (ce qui est assez rare)
- des balises et propriétés alignées (ce qui est aussi assez rare, bien souvent c'est un peu fouilli)

Attention
'* : /!\ Attention : il arrive que les DropBox dans le ruban perdent leurs valeurs quand on change de d'onglets ou de rubans
'* : JE NE CORRIGERAI PAS ! j'ai bien codé quelques tentatives sans succès que je laisse en l'état. Elles n'ont aucune incidence.
'* : Pour ma part c'est un Bug dans le cache où les valeurs sont perdues. C'est le JOB de Microsoft pas le bien !
'* : C'était déjà le cas dans les 1ères versions de l'UIRibbon. Microsoft ne l'a jamais corrigé !
'* : Je refuse de partir dans des appels d'API abracadabra pour conserver le pointeur du ruban en mémoire cache.
'* : Les API oui c'est bien et NON ! ça limite la portabilité de votre code bien qu'il y ait des variables de compilation qui permettent de tenir compte de l'OS (WIN/MAC) et la version du VBA !
'* : Ca vous rend tributaire des évolutions de Windows. Microsoft a totalement le loisir de modifier les appels au hwnd. C'est déjà arrivé !
'* : Donc je n'entre pas dans ce bricolage.
'* : Il serait bien que Microsoft mette à disposition une propriété dans son XML du style preservedropdowncache="yes/no:defaut no" afin de maintenir et afficher les valeurs sélectionnées quand on navigue dans les onglets ou dans les ruban
'* : Un peu en conflit là-dessous dans les versions 2007, 2010.. je reste un peu déçu !
Bonjour Le Forum XLD,
Cette version 3.3 apporte les nouvelles fonctionnalités majeures :
  • Construction d'une bibliothèque dans laquelle seront déposés les modules VBA des Macros et les requêtes PowerQuery
  • La possibilité de renseigner plusieurs dossiers afin de construire l'inventaire des fichiers Excel à examiner
En supplément de ces nouvelles fonctionnalités :
  • Allègement, factorisation et optimisation du code
  • Correction de quelques bugs mineurs
  • Une reformulation des types pour les modules .bas, les feuilles, les classes, les frm (MACROS)
  • Une légère réorganisation des icônes
  • Changement de la barre de progression
  • Allègement de la log. Celle-ci se libère tout les 100 lignes dans le fichier log
L'utilisation n'a pas été modifié. Rappel :
  1. Réalisation de l'inventaire des dossiers à explorer
  2. Extraction des Macros
  3. Extraction des requêtes PowerQuery
  4. Extraction des fonctions LAMBDA
  5. Utilisation des fonctions de recherches une fois les extractions réalisées
  6. Et petite nouveauté construction de la bibliothèque sur disque et recherches dans celle-ci
Scénario d'utilisation
  • Choix d'un ou plusieurs dossiers via ce bouton
    1749161968701.png
1749162066327.png

  • Pour ajouter un dossier cliquer à nouveau sur l'icône dossier
1749162152443.png


Par défaut le séparateur des noms de dossiers est ";". Il est paramétrable dans l'onglet Params mot clé DEFAUT_SEP_DOSSIERS
  • Recherche des fichiers et actualisation de l'inventaire via ce bouton
    1749162324849.png
    dans l'onglet PARAM_INVENTAIRE
  • Sélectionner le type d'extraction souhaitée et son mode
    1749162525184.png
    puis lancer l'extraction via ce bouton
    1749162554011.png
    et pour chaque type d'extraction renouveler cette opération
1749162616775.png


Dans cet exemple les 3 types d'extractions ont été réalisés.
  • En ce qui concerne la bibliothèque son emplacement se déclare dans les paramètres. Les traitements vérifient la bonne syntaxe du nom de dossier.
1749162781491.png


Il n'est pas nécessaire de créer les dossiers et les sous-dossiers. Ceux-ci seront créés automatiquement pendant l'extraction des modules et requêtes via une fonction dans le code nommée MakeDirP (pour ceux qui connaissent Linux j'ai reconduis la fonction mkdir -p qui permet de créer une arborescence de répertoires si ceux-ci n'existent pas.

Le nom est affiché dans l'onglet PARAM_INVENTAIRE
1749163189465.png


  • Les onglets MACROS et POWERQUERY disposent désormais d'une icône
    1749163279006.png
    permettant d'exporter dans la bibliothèque les objets voulus qui sont toujours à marquer par une croix une "X" dans la colonne EXTRACTION.
  • L'extraction des objets dans le dossier qui héberge le classeur Excel a été conservée
    1749163457915.png
    • vous avez donc le choix ; elle reste présente à des fins de compatibilité et pour ceux qui souhaitent dans l'ancien mode.
    • La bibliothèque apporte l'avantage de ne pas éparpiller les objets et extraits. Ainsi il est plus facile de les retrouver quand ils sont centralisés.

1749163711670.png


1749163727970.png


  • Voici comment cela présente sur le disque
1749163849157.png


  • A la racine de l'emplacement de la bibliothèque le dossier MODULES.BASa été automatiquement créé
    • Dans ce dossier on y retrouve les dossiers correspondants aux dossiers de l'inventaire et de l'extraction
    • Pour chaque classeur Excel un dossier est créé au nom du classeur Excel (un nettoyage des caractères parasites dans le nom du classeur est automatiquement effectué pour éviter tous plantages.
    • Les modules sont ensuite déposés dans le dossier au nom du classeur Excel
1749164197758.png


Un lien Windows est automatiquement créé afin d'ouvrir le fichier Excel et de le retrouver dans son emplacement d'origine
1749164263837.png


  • Concernant l'extraction des requêtes POWERQUERY le principe d'extraction est identique
1749164475436.png


  • Un dossier REQUETES.PQ est automatiquement créé
  • Le rangement des objets suit les mêmes règles que les modules Macros
1749164570951.png


  • Dans cet exemple nous avons deux liens car à l'origine nous avons deux classeurs Excel

  • Exploitation de la bibliothèque construite via l'application LIBMAC
    • Aller dans l'onglet BIBLIO
    • Mettre à jour la bibliothèque via le bouton
      1749164797760.png
1749164848229.png


1749164870065.png
A des fins éventuelles d'utilisations externes vous avez les onglets qui permettent une extraction aux formats XML, HTML, JSON, CSV

  • Je vous invite aussi aller voir le code Powerquery permettant d'explorer les dossiers en boucle avec la fonction List.Accumulate certes un peu complexe à manipuler pour les débutants mais très puissante.
PowerQuery:
let
    Source = "",
    tmp_NOM_DOSSIER = Excel.CurrentWorkbook(){[Name="NOM_DOSSIER"]}[Content]{0}[Column1],
    sSep = fnGetParameter("TB_PARAMS","DEFAUT_SEP_DOSSIERS"),
    LST_Dossiers=Text.Split(tmp_NOM_DOSSIER,sSep),

    LstCombine=List.Accumulate(
            LST_Dossiers,            // Initialisation de la boucle sur la liste � traiter
            #table({},{}),       // Initialisation de l'accumulateur sur une table vide
            (state,current) =>   // Boucle de traitement pour combiner les fichiers un � un
                let
                    Source = fnExtractFiles(current),     // Importation de la table en cours
                    Combine = if Table.IsEmpty(Source) then Table.Combine( {state , #table({},{})})  else Table.Combine( {state , Source})  // Combinaison de la table
                in                          
                    Combine   // Ensemble des tables combin�es
            ),

            STR_crit1=Excel.CurrentWorkbook(){[Name="LB_CRIT_TRI_1"]}[Content]{0}[Column1],
            STR_crit2=Excel.CurrentWorkbook(){[Name="LB_CRIT_TRI_2"]}[Content]{0}[Column1],

            crit1=if STR_crit1="<AUCUN>" then null else STR_crit1,
            crit2=if STR_crit2="<AUCUN>" then null else STR_crit2,

            pcrit1=if crit1 is null then null else "{{""" & crit1 & """, 0}}",
            pcrit2=if crit2 is null then pcrit1 else if pcrit1 is null then "{{""" & crit2 & """, 0}}" else "{{""" & crit1 & """, 0}" & ", {""" & crit2 & """, 0}}",
            evCritTri=if pcrit2 is null then null else Expression.Evaluate(pcrit2),

            TBL_TRI = if evCritTri is null then LstCombine else Table.Sort(LstCombine,evCritTri)
in
    TBL_TRI

  • REMARQUE : Les tests de robustesse ont été effectués sur plus de 5000 fichiers créés pour l'occasion et répartis dans divers dossiers. Certes les traitements d'inventaires et d'extractions prennent un peu de temps mais Excel n'a pas "freezé" en fin de traitement. Bon il faut dire que j'ai une bête de course, un I7 avec 12 Go de mémoire et disque flash interne de 1 Go.
    • Pour un gain optimal il faudrait pouvoir extraire les objets sans devoir ouvrir les fichiers Excel par VBA et réussir peut-être à passer par l'OLE (je n'ai pas essayé). Je ne suis pas certain que ADO qui fonctionne très bien pour extraire des données de l'extérieur puissent fournir les mêmes résultats pour les modules VBE, les requêtes PowerQuery ou les noms pour les fonctions LAMBDA. Personnellement je n'ai pas tenté la manoeuvre. Si quelqu'un a une idée ? Je suis preneur

Pièces jointes

  • 1749162009684.png
    1749162009684.png
    1.7 KB · Affichages: 66
Bonjour Le Forum XLD,
Une nouvelle version qui embarque les nouveautés suivantes :
- la possibilité de mettre en place une log des traitements
- traçabilité des modules exécutés et l'affichage de pile des modules concernés par l'erreur
- les traitements d'exportation des modules et requêtes se font uniquement sur les lignes visibles
- les exports .csv se font aux aussi sur les lignes visibles
- les boutons de l'interface utilisateur sont remplacés par des icônes
- optimisation et factorisation du code


1. Les logs de traitements
Il est possible d'activer cette log via cette case à cocher
1746895912828.png

Quand celle-ci est activée un fichier log est créé de la manière suivante :
1746895983782.png


En fin de traitement ce message est affiché
1746896038068.png


Exemple de contenu :
1746896087547.png


La gestion de cette log est assurée par la classe VBA
VB:
Public oLog As Cls_LogFile
...
...
Set oLog = New Cls_LogFile
...
...
...

oLog.AddLogLine "Début traitements : " & vAppel


2. Suivi de la pile d'exécution

En cas d'erreur - exemple ci-dessous :

1746895543356.png


Cette pile est gérée par la classe
Code:
Public oStack As Cls_StackModule

empilement..
PUSH_STACK "MAIN()"

dépilement
POP_STACK "MAIN()"

3. Exports .csv et codes sur les lignes visibles

Exemple sans filtre
1746896620636.png

1746896657501.png


Exemple avec filtre
1746896690356.png

1746896720467.png


4. Refonte de l'interface

Fichiers - PARAM_INVENTAIRE
1746896844058.png

1746896855952.png
==> Recherche les fichiers (appel de PowerQuery)
1746896890487.png
==> Lance l'extraction des macros, des requêtes powerquery, des fonctions Lambda
1746896933914.png
==>Exportation .csv
1746896957521.png
réinitialise et efface le tableau
1746896982745.png
==> efface les critères powerquery pour la recherche des fichiers à traiter
1746897020834.png
==> efface les filtres
1746897052801.png
==> onglet Params

MACROS
1746897113160.png

1746897127108.png
==> extraction du code
1746953204377.png
==> Relance l'extraction des macros, des requêtes powerquery, des fonctions Lambda

POWERQUERY
1746897161141.png

LAMBDA

1746897185131.png


QUERIE
1746897207942.png


1746897216501.png
==> Retour à l'onglet PARAM_INVENTAIRE
1746953154503.png
==> Lance la recherche

5. Optimisation du code

Dans les versions précédentes les objets traités pendant les phases d'extraction des macros, des requêtes powerquery et des fonctions Lambda étaient mémorisés dans des tableaux VARIANT. Leur dimension à chaque nouvel élémént était gérée par des REDIM PRESERVE... UBOUND() etc. etc.
En cas de fortes volumétries ces instructions sont assez coûteuses en mémoire. Les tableaux ont donc été abandonnés au profit des collections qui sont plus performantes. Il n'est nullement nécessaire de retailler le tableau en cas d'ajout d'un élément. Voir les classes suffixées *Define qui définissent les propriétés des objets traités. Pour la collection en elle-même nous avons la classe Collection de VBA.
Enfin, certaines parties de codes étaient redondantes, elles ont été factorisées et la déclaration des variables DIM a été "aérée" dans certaines procédures ou fonctions.

Pour conclure sur cette Saga 🙂 une V4 est en réflexion afin d'apporter une navigation dans les fonctionnalités via une personnalisation du ruban et donc l'abandon des icônes. L'ajout de ce ruban personnalisé demande une petite analyse et une restructuration peut-être de certaines parties de code.
Cette réflexion est en chantier actuellement et beaucoup trop "jeune" pour être publiée. En revanche je reste preneur d'idées pour l'organisation de ce ruban suite aux tests que vous auriez réalisés avec cet outil depuis sa première version. Merci le forum XLD.
Dans cette V4 il y aura certainement la création d'une bibliothèque centrale regroupant les codes des macros, les codes des requêtes powerquery et les codes des fonctions Lambda. Actuellement c'est "dispatché" dans les répertoires respectifs où sont hébergés les classeurs. Ceci pourrait devenir peu pratique pour effectuer des recherches.
La structure pourrait être la suivante
<NOM_DE_LA_BIBILIOTHEQUE> (Répertoire au choix au moment de la création de la bibliothèque)
<DOSSIER_DU_CLASSEUR_1> (dossier au nom du fichier EXCEL)
<MODULES.BAS>
...
...
...
<REQUETES.PQ>
...
...
<LAMBDA>
...
...
<DOSSIER_DU_CLASSEUR_(n)>
<MODULES.BAS>
...
...
...
<REQUETES.PQ>
...
...
<LAMBDA>
...
...

Cette hiérarchie sur disque pour donner lieu à la création d'un fichier .XML afin d'embarquer un mini moteur de recherche fondé sur ce fichier .XML


DONC IL Y A ENCORE DU BOULOT SUR CE PROJET
Bonsoir,
une nouvelle version qui boucle certainement la boucle.
En effet il manquait l'inventaire des fonctions personnelles développées avec LAMBDA().
C'est donc chose faite.
La liste déroulante EXTRACTION propose ceci
1745435645820.png

A ce titre le bouton d'inventaire des objets a été renommé :
1745435689558.png


Concernant le paramétrage de l'inventaire des fichiers sur disque rien n'a changé.

Les fonctions LAMBDA détectées sont dans l'onglet LAMBDA.
La liste des valeurs dans l'onglet LOV a été adaptées ainsi que les l'onglets Params et Messages.

La recherche des fonctions LAMBDA est effectuée via le paramètre
1745435866938.png

La "(" dans la clef de recherche renforce le fait de trouver une fonction personnalisée LAMBDA.
Voir le code pour plus de compréhension (pour les avertis en VBA).

L'onglet LAMBDA se présente comme suit
1745435991672.png


On peut constater qu'il a été simplifié. La fonction EXTRACTION d'une fonction sur disque n'a pas été reprise. Je n'y voyais pas trop d'intérêts. Le double-clic sur la ligne permet toujours d'ouvrir le fichier.

Nous avons deux colonnes de scripts
1745436107311.png


SCRIPT : formules avec les fonctions "anglaises"
SCRIPT_LOCAL : formules avec les fonctions en langue de votre version.
Avantage : cela vous permet de trouver les correspondances entre les fonctions Anglaises et les fonctions locales.

L'export sur disque crée un fichier dans le répertoire de l'application :
1745436261319.png


1745436286400.png


A noter : afin que ce fichier soit compatible avec Excel en cas d'ouverture avec ce dernier les ";" du script local ont été remplacés par des ","... ça évite la multiplication de colonnes... en effet ";" c'est le séparateurs de cellules... (selon la config de votre Excel)... à modifier si besoin et éventuellement le code pour y mettre un autre séparateur selon votre installation d'Excel
Correction concernant Autofit et la largeur automatique des colonnes désormais paramétrable
Autofit
1745057981642.png
ne doit pas être activé pour l'extraction des macros et des requêtes

correction sur le positionnement des shapes... qui sont toujours galère avec les largeurs de colonnes

1745057953992.png


Il y a réglage systématique dans l'onglet querie à l'issue de la recherche
Bonjour Le Forum,

Suite à une utilisation plus personnelle sur mes fichiers Macro et PowerQuery je me suis rendu compte qu'il manquait certaines choses et que le mode de stockage des objets devait être revu. C'est l'une des évolutions majeures.
Autre évolution majeure : extraction sur disque des composants VBA (module.bas)
Enfin cette nouvelle version a bénéficié de quelques fonctionnalités supplémentaires.


Evolution de la liste de choix des fichiers à sélectionner
1744998999043.png


Sélectionner les composants des fichiers à extraire dans la colonne
1744999531718.png


puis cliquer sur
1744999186743.png

1744999580900.png
Valider
1744999610750.png


7 sélections ont été traitées mais seulement deux modules ont été exportés. En effet il y a des objets qui appartiennent au même ficher, il est donc inutile de récréer le module étant donné qu'il a déjà été créé.
Les modules sont enregistrés dans un sous-dossier dans le dossier qui héberge fichier. Ce dossier est dans les paramètres
1744999807244.png


exemple
1744999897787.png


Nouveau bouton que l'on retrouvera dans tous les onglets
1744999964252.png
Il permet de réinitialiser les filtres posés dans les colonnes du tableau.

1745000007459.png
Ces boutons agissent uniquement que sur les lignes visibles, pratique quand on filtre sur les colonne du tableau pour extraire des composants.
Ces boutons fonctionnent de la même manière dans les autres onglets.
Conseil : préparer vos sélections dans les colonnes et appuyer sur le bouton
1745000157312.png
pour embarquer votre sélection uniquement.

Concernant les extractions des requêtes elles sont aussi déposées dans un sous-dossier du dossier qui héberge le fichier Excel.
Exemple de compte rendu en fin de traitement
1745000324259.png

En effet il est possible que l'on retrouve le même nom de requête dans plusieurs fichiers. Afin de ne pas écraser la requête existante déjà exportée, la nouvelle est renommée avec le fichier du fichier en préfixe.
Le dossier
1745000420839.png


exemple :
1745000452790.png



Dans l'onglet QUERIE il est aussi désormais possible d'extraire les modules VBA.

Pièces jointes

  • 1744999309204.png
    1744999309204.png
    6.6 KB · Affichages: 86
  • 1744999338443.png
    1744999338443.png
    7.6 KB · Affichages: 85
Bonjour,
vous trouvez une nouvelle version qui réalise aussi l'inventaire des requêtes PowerQuery.

Inventaire des requêtes PowerQuery - L'onglet paramétrage

Ajout d'un mode Extraction :
1744834304363.png


Le paramètre type de fichier tient compte désormais des fichiers .XLSX
1744834410064.png


Exemple de paramétrage
1744834610555.png

Le libellé permettant de réaliser l'inventaire des objets macros et requêtes a été adapté.
Le mode ajout/remplacement fonctionne de la même manière que les macros.
Rappel ! le remplacement ne se fait (effacement) que pour les tableaux macros et requêtes

Présentation de l'onglet POWERQUERY

1744834799442.png


On retrouve déjà les fonctionnalités de base de l'onglet macros.
Colonne SCRIPT : Présentation non formatée du script de la requête - les retours chariots on été supprimés pour ne pas alourdir la cellule. On retrouve son contenu comme ceci :
1744834929834.png


Cependant pour une meilleure lisibilité par un double-ci dans la colonne REQUETE la requête est affichée comme suit :
1744835001321.png

1744835019175.png


C'est donc plus présentable.
1744835045999.png
cliquer sur la [X] pour fermer la fenêtre.


Un Double-Clic dans la colonne FICHIER exportera la requête sur disque
1744835152871.png

1744835165234.png

1744835178062.png


Construction du nom de fichier :
TBL_CONSO_GAZ => nom de la requête
__ => séparateur
LAB_GROUPER_PAR_V1.004.xlsm ==> nom du fichier Excel
.pq ==> extension pour PowerQuery

Par défaut elle est exportée dans le dossier de l'outil et dans le dossier EXPORT_REQUETES (voir le paramétrage). Si à la 1ère utilisation il n'est pas créé il le sera pas l'outil.

Si la requête a déjà été exportée il y aura une demande confirmation...
1744835419055.png


Les extractions peuvent être faites soit :
- de manière unitaire (cas ci-dessus)
- de manière sélective en marquant par une [X] la requête dans la colonne EXTRACTION
1744835519991.png
quelque soit la casse du X. Un compteur des fichiers marqués est automatiquement calculé. Pour les extraire :
1744835597703.png
puis confirmer
- de manière totale par ce bouton
1744835637839.png
Toutes les requêtes seront marquées par une [X] et relancer l'opération Extraire les requêtes.

1744835698044.png
Efface le marquage

Un double-Clic dans les autres colonnes ouvrira le fichier comme pour les Macros.

L'export au format .csv est aussi disponible :
1744835893364.png


Nouvelle fonctionnalité que l'on retrouvera aussi dans l'onglet Macros :
1744835817952.png


Enfin cette nouvelle version a été aussi l'occasion de corriger quelques petites coquilles mineures de la version 1.0

Je rappelle une nouvelle fois : le code est ouvert. Les fonctionnalités sont adaptables à vos besoins.
Retour