Newsgroup: it.comp.appl.access
Titolo: Come realizzare un cleaner per il codice vba?

Vorrei realizzare il 'mio' cleaner per dare una ripulita ad alcuni 
progetti Access particolarmente voluminosi
Il primo obiettivo e' individuare nei moduli le sub/function che non 
vengono usate in nessuna parte del programma, le orfane per capirci, e 
consentire all'operatore di eliminarle
Stessa sorte tocchera' alle costanti/variabili, a vedro' dopo
 
Allora supponendo che dentro un ciclo scorra tutti i moduli
Che per ogni modulo scorra le sub/funzioni presenti
Come fare per capire se la sub/funzione corrente e' usata nel programma?
Perche' andare di forza bruta mi sembra estremamente impegnativo
C'e' qualche trucco che possa usare per capire se una data sub/funzione 
viene usata all'interno del programma (senza scorrere tutti gli altri 
moduli e form e report)?

Io avevo fatto una cosa simile qualche anno addietro... le cose non sono così semplici.
 
Le Funzioni possono essere richiamate non solo nel VBA ma nel Generatore di Espressioni, quindi trovartele in Properties degli oggetti come DefaultValue, o anche Eventi.
Ci sono poi le Public Function delle Form che possono essere usate, o anche le Public Property delle Form ma anche delle Classi.
 
Ovviamente a questo vanno aggiunte le dichiarazioni Public delle Variabili che possono essere richiamate ovunque nei moduli di VBA... 
 
La cosa che avevo pensato dopo varie prove e che mi pareva più più funzionale era individuare con VBE inserendo la Lib per accedere al codice, tutte le Function/Sub/Property e le ho registrate, poi ho ESPORTATO Form/Report/Moduli in formato Testo ma con la Funzione Nascosta SaveAsText, in quanto esporta la struttura della Form/Report inclusi gli Oggetti e le Proprietà, nelle quali si può annidare la chiamata a Function.
 
Purtroppo poi ci sono le MACRO EMBEDDED pessima invenzione di MS.... che sono una rottura di scatole terribile per le quali serve un codicillo a parte.
Di fatto poi apri i file di Testo con FSO e cerchi tutte le parole salvate come FUNCTION ecc... e le conti se il COUNTER=1 non è usata...
 
Ho semplificato e banalizzato molto, ma il lavoro da fare è discretamente complesso.
 
@Alex
 
 


Mi sembra di capire che dai una 'spazzolata' iniziale, memorizzi, e poi 
  usi per capire se una certa Sub/Funzione e' presente nell'archivio 
raccolto
Si, ottima idea, non avevo pensato all'archivio coi nomi degli oggetti
Ma una volta trovato il codice orfano, supponiamo sia
 
Public Function Apri_File(byval nom_fil as string) as long
 
dentro il modulo  "modFunzioniGlobali", come faresti poi ad eliminare la 
funzione dal codice (nell'ipotesi di voler attivare l'automatismo)?
 

 funzione dal codice (nell'ipotesi di voler attivare l'automatismo)?
 
Io in automatico AZIONI di CANCELLAZIONE non ne farei MAI... motivo per cui non le  avevo previste.
Nel mio giochetto avevo fatto un sistema che mi scannerizzasse tutto, mi facesse vedere la cosa, e sfruttanto una RichText evidenziavo la corrispondenza dei TOKEN trovati con la lista all'interno degli oggetti.
 
Procederei con la cancellazione Manuale, e la riscannerizzazione, da fare attenzione che, la Funzione deve essere l'ultima cosa da CANCELLARE, altrimenti protresti avere un sacco di chiamate nel codice senza la destinazione, ovviamente il DEBUG lo segna ma lo SCANNER potrebbe essere ingannato.
 
@Alex


Si, in realta' anch'io pensavo di procedere a manina, ma sapere come 
fare a cancellare in automatico e' comunque un obiettivo che vorrei 
raggiungere
Questa sotto invece non l'ho capita
 
"..la Funzione deve essere l'ultima cosa da CANCELLARE, altrimenti 
protresti avere un sacco di chiamate nel codice senza la destinazione.."
 
Se la funzione
 
Public Function Apri_File(byval nome_del_file as string) as long
 
la trovo SOLO dentro al modulo dove lei alberga, supponiamo 
modFunzioniPubbliche , vuol dire che nessuno la usa, e quindi volendo 
puo' essere cancellata da dove sta ora
Se dentro altre form, moduli, report, query quella funzione non appare, 
di quali 'un sacco di chiamate' stai parlando?

 di quali 'un sacco di chiamate' stai parlando?
 
Ragionavo in ottica di AUTOMATISMO... quando andrai a cancellare, eventualmente lo farai, la funzione che è oggetto di ricerca deve essere l'ultima cosa da Cancellare...!
Questa affermazione non è banale... in quanto se cerchi [Apri_File] a meno di REGEX, se riesci a farlo funzionare, trovi anche la funzione stessa e non solo le chiamate... 
Quindi se ad esempio cancelli parzialmente, poi riesegui lo scanner rischi di non trovare più la Funzione ma di avere le chiamate.
 
@Alex

Le chiamate sono quelle alla Sub/Funzione...
 
Call NomeFunzione(...)
 
Se Cancelli prima la Funzione, Scannerizzi, sparisce dall'elenco la Funzione ma il Call NomeFunzione no...!
 
Dipende da come gestisci il tutto... era un ragionamento embrionale...
 
@Alex


Ah adesso ho capito, tu ipotizzi di poter cancellare una funzione che 
nel codice viene anche usata, e quindi le X chiamate sono una roba 
mentre la definizione di funzione e' altra roba
Diciamo che e' il caso generale
 
Mentre io parto dal sottoinsieme del caso generale, prevedo si possa 
cancellare la funzione unicamente se NON viene mai chiamata nel codice

 cancellare la funzione unicamente se NON viene mai chiamata nel codice
 
Ok allora è più semplice, in questo caso la puoi anche cancellare in modo abbastanza banale...
Usando la Lib VBIDE con i Riferimenti a Microsoft Visual Basic For Application Extensibility 5.3(questa è la mia versione) puoi velocizzare.
Da quì sai da che riga parte ed a che riga Finisce, quindi puoi usare il metodo DeleteLines dell'oggetto VBIDE.CodeModule per cancellare dalla riga di Inizio Funzione/sub alla riga fine.
 
Esempio semplice:
    Sub DeleteProcedureFromModule(ModuleName as String, ProcNameAs String)
        Dim CodeMod As VBIDE.CodeModule
 
        Set CodeMod = app.VBE.ActiveVBProject.VBComponents(ModuleName).CodeModule
        CodeMod.DeleteLines CodeMod.ProcStartLine(ProcName, vbext_pk_Proc), CodeMod.ProcCountLines(ProcName, vbext_pk_Proc)
    End Sub
 
Io mi ero fatto un Tool come dicevo con 2 Classi che mappavano tutto ed esponevano i Metodi di DeleteProcedure/AddProcedure/ReplaceProcedure etc...!
 
Ciao
@Alex


Si, era quel che mi mancava, grazie

Ciao, ormai da oltre 15 anni che uso MZTools e ha proprio la funzione che serve a te, e lavora anche sulle variabili/costanti non utilizzate.
Prima veniva distribuita gratuitamente la versione 3 per VB5, VB6 e VBA (32bit).
Ora è a pagamento. Ma ti assicuro che ne vale la pensa spendere qualche decina di euro per un tool che ti risolve tanti problemi.
Io mi trovo benissimo con questo tool. Lo uso ancora con VB6 per la manutenzione di vecchi software.
Con la versione .NET (v8) hanno implementato tante funzioni.
 
Comunque, se serve la cerco, da qualche parte dovrei avere la versione 3 a per VBA.
 
Saluti
Efisio


Si, grazie, lo so
Come  sicuramente moltissimi qua dentro, uso MzTools per alcune 
funzionalita' e conosco anche lo 'scova-orfani'
Ma sfido chiunque ad eliminare 2K variabili non utilizzate cliccandoci 
sopra e cancellandole a manina, ci vorrebbero delle ore
Pur nella propria funzionale essenzialita', non e' quel che vorrei 
avere, anche se quello del riconoscimento orfani e' ovviamente il nucleo 
di quanto sto cercando
Vorrei un sistema con un maggior controllo sulla visualizzazione del 
risultato ricerca e sulle possibili azioni da intraprendere


Agli interessati a questi argomenti, segnalo questo link che contiene 
informazioni preziose sulle richieste poste nei messaggi precedenti
 
http://www.cpearson.com/excel/vbe.aspx#:~:text=You%20can%20write%20code%20in,VBA%20modules%20and%20code%20procedures
.

 risultato ricerca e sulle possibili azioni da intraprendere
 
In occasione del mio primo intervento spero di non fare subito danni con quote o altro.
Esiste il gratuito Rubberduck 
https://github.com/rubberduck-vba/Rubberduck
 con la release stable e 
quelle di sviluppo 
https://github.com/rubberduck-vba/Rubberduck/releases
 che solitamente vanno piuttosto bene, in queste cose. Se non ricordo male la versione di sviluppo permette di fare un'installazione caricando di default un numero di analisi molto ridotto rispetto al solito. La paperella potrebbe avere bisogno di parecchio tempo per fare tutte le sue analisi e personalmente attivo la componente aggiuntiva da VBE solo quando mi serve.
Evidenzia di certo le variabili non usate, per i casi particolari non rilevati o per i quali si vorrebbe un comportamento diverso si può creare un issue, poi ci sono quelli che ci capiscono davvero che valutano tempi e modi.
Come si dice in questi casi, DISCLAIMER: la traduzione in italiano è opera mia (quindi si accettano anche suggerimenti su correzioni e miglioramenti) ma non ho interessi economici in ballo.