
Dalla nostalgia al Visual Basic for Application (VBA)
Sul mio primo pc, tutto tutto mio, avevo una cartella preziosissima. Conteneva tutte le foto digitali provenienti dal Ray Tracing. L’immagine sopra ne è un esempio. Visualizzare su un computer una immagine come quella sopra, 35 anni fa, appariva una specie di magia (l’immagine proviene dal sito nel link). Internet per me aveva lo stesso valore di una frittella cucinata da Batman. Esisteva, ma francamente non conoscevo nessuno che utilizzasse eccetto mio padre. Per quale uso, non me lo sono mai neanche chiesto. Era un luogo mistico dalle caratteristiche a me ignote. Parliamo del 1990 e questo per dire che tutto il materiale che si aveva su hard disk proveniva da scambi su floppy tra “aventi un pc” e cd o floppy allegati a riviste; poi non ricordo altre possibili fonti. Quella mia magica cartella conteneva una sessantina di immagini digitali. Futuristiche anche per una scheda grafica a 16 mln di colori. Per aprire una picture a 16 mln di colori, mi pare di ricordare, ci volevano qualcosa come una cinquantina di secondi per iniziare a visualizzarsi qualcosa, poi con calma, molta calma, comparivano riga per riga. Mi sembrava velocissimo se penso che il primo pc a cui ho visto rappresentare una fotografia a video aveva una scheda 256 colori ed era un Intel 386DX 25mhz della Compaq. Macchine d’altri tempi.
Il mio primo pc (assemblato) lo ricordo benissimo, era un 133mhz, così usciva scritto sulla composizione di 3 display a 7 segmenti, 4mb RAM, scheda video S3 trio 2mb RAM. Il mio, perché era il primo ad essere tutto mio, inclusa la libertà di salvare sull’hard disk tutto il mio, e solo mio, mondo digitale. Aveva un lettore Philips 2x e un paio di casse audio che pesavano quanto una cassetta di melanzane. Mouse 2 tasti, nessuna rotella, e tastiera marca IBM. Una accoppiata che costò qualcosa come 180 mila lire.
Inventariare tra controllo e creatività
E insomma avevo un problema. Non potevo lasciare che il contenuto di quelle cartelle fosse casuale e non opportunamente inventariato e stampato con la mitica stampante ad aghi Epson. Li c’era il mio mondo. Immagini evocative e non solo, c’erano file di testo con scritti i titoli dei mie nastri, dischi e cassette. L’inventario degli attrezzi in garage. Il file con le spese mensili. Mentre scrivo, in questo momento, mi sta venendo in mente che quelle cartelle sono arrivate indenni al mio primo masterizzatore e che quei dischi sono da qualche parte sepolti. Sento già l’odore dei pop-corn mentre battezzo una domenica di pioggia, freddo, e famiglia (bimbi inclusi) dalla mamma di Lei, all’insegna archeologia informatica. Tornando dal mondo dei sogni, le prime versioni di Access di Microsoft incentravano le demo dei loro programmi sull’inventariare di tutto, dalla collezione di dischi, ai numeri di giornali.
Le riviste di informatica, quelle che insegnavano cose, dedicavano pagine intere a software, che nei casi più fortunati erano allegati alle riviste in formato floppy disk.

Bastava aprire una cartella per conoscerne il contenuto. Tuttavia all’epoca le prime versioni di organizzazione di spazi digitali che immaginavo avessero un senso, passavano attraverso mille tentativi. Mi piaceva l’idea di inventariare (mi piace anche oggi), quindi tra i crucci dell’epoca c’era l’inventariare il contenuto delle directory in cui erano contenuti diversi inventari oltre le mie preziose immagini. Il tempo e la lettura dei manuali mi hanno insegnato che poche righe di codice, magari anche in Dos, la maggior parte delle volte sistemano le cose.
Nel corso degli anni e dei molteplici problemi da risolvere che mi si sono presentati davanti, la lettura del contenuto di una directory e l’uso di quel contenuto mi hanno semplificato molti compiti lavorativi che sarebbero stati in alternativa molto lunghi e fastidiosi.
Ieri come oggi, automatizzare al lavoro
Proprio qualche giorno fa mi è arrivata sulla scrivania una richiesta la cui risoluzione era parte di un PDCA. Per svolgere il lavoro richiesto dovevo gestire una replica strutturata di una cartella contenente una notevole quantità di sottocartelle diversificate in altrettanti annidamenti con nomi, tra l’altro, discretamente assurdi. Il PDCA richiedeva che si automatizzasse la creazione di uno frame di cartelle la cui radice, la root folder, avesse un nome specifico costituito da una serie di input che, sequenzializzati diventassero il nome della cartella. Una parte di quella sequenza doveva ripetersi all’interno di ogni annidamento, o sottocartella, fino al terzo livello. Dal terzo al settimo livello di annidamento non era necessario serializzare le cartelle. Il frame originale era da modificare pesantemente poiché lo schema padre fino al terzo livello era composto da una serie di nomi fittizi, necessari per far solo capire di quanti caratteri fossero le sigle che andavano applicate. Come sempre, di fronte ad un lavoro che quota 10 ore, ne spendo mezza a riflettere come automatizzare il lavoro, 3 ore a programmarlo e pochi secondi a lasciar fare il resto al pc. E niente, è una forma di pigrizia, mi dicono.
Il PDC che?
Giustamente ti stai domandando cosa sia un PDCA. Molto sinteticamente il PDCA è un metodo analitico che si utilizza per rilevare un problema e risolverlo attraverso attraverso un ciclo di miglioramento continuo composto da quattro fasi:
- Plan (Pianificare): definire obiettivi, analizzare il problema, progettare soluzioni.
- Do (Eseguire): implementare il piano su scala controllata.
- Check (Verificare): misurare i risultati, confrontarli con gli obiettivi.
- Act (Agire): standardizzare ciò che funziona, correggere ciò che non funziona, e ripartire.
È uno strumento fondamentale per la gestione della qualità, l’ottimizzazione dei processi e la risoluzione strutturata dei problemi. Lo utilizziamo per scrivere in un ambiente condiviso, i problemi che qualcuno ha e che magari qualcun altro è in grado di risolvere. Oppure diversamente può essere un metodo analitico per approcciare a difficoltà che hanno bisogno di essere affrontate e risolte. Ne parleremo molto in futuro. E’ parte del mio mondo, non che il mio lavoro. In azienda adottare la metodica del PDCA è parte di un percorso di miglioramento fatto di azioni, che richiedono una strutturazione seria e attenta, e che tuttavia rendono molto ma molto di più di quanto ci si investe. Se sei interessato a saperne di più scrivimi.

Leggere una directory con Excel e VBA
Uno dei colleghi di lavoro e compagno di passioni che adoro più di tutti è Microsoft Excel, che per me rappresenta uno dei monumenti digitali all’intelligenza umana.
Parlo in questo articolo solo di come ho letto la cartella, trascritto in celle Excel la struttura. Partiamo con il leggere i contenuto della cartella e naturalmente con il chiarire che Excel non ha una funzione nativa bella e pronta, quindi occorre scrivere crearla con qualche riga di codice. Visual Basic for Application ci aspetta.
Cominciamo con l’aprire il nostro foglio Excel, e come prima cosa, per non incorrere in fastidi successivi salviamolo subito con il nome che ci interessa e, “importantissimo” modificando al nostro file l’estensione a .xlsm, ovvero file Excel con supporto per le macro abilitate. Poi pigiamo Alt+f11 per aprire l’applicativo VB.
Cerchiamo il menu inserisci e clicca su modulo. Comparirà un ambiente di scrittura vuoto e bianco, è li che scriveremo il blocco: (Copia e incolla il codice sotto)
Sub ViewElenco_Recursive()
'Definisce variabili per la finestra di dialogo, il percorso selezionato, il foglio di lavoro e il nome 'della cartella
Dim dlg As FileDialog, path As String
Dim ws As Worksheet, folderName As String
'1. Mostra finestra per selezionare la cartella da analizzare
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
If dlg.Show <> -1 Then Exit Sub ' Se l'utente annulla, esce dalla macro
path = dlg.SelectedItems(1) ' Salva il percorso selezionato
'2. Crea un nuovo foglio di lavoro
Set ws = ThisWorkbook.Sheets.Add
'3. Ottiene il nome della cartella e lo "sanifica" grazie alla Function Sanitize per usarlo come nome del 'foglio
folderName = SanitizeSheetName(CreateObject("Scripting.FileSystemObject").GetFolder(path).Name)
'4. Imposta il nome del foglio (max 31 caratteri, gestisce eventuali errori)
On Error Resume Next
ws.Name = Left(folderName & "_albero", 31)
On Error GoTo 0
'5. Scrive intestazioni nel foglio
ws.Cells(1, 1).Value = "Struttura gerarchica: " & path
ws.Cells(2, 1).Value = "Percorso"
ws.Cells(2, 2).Value = "Tipo"
ws.Cells(2, 3).Value = "Nome"
' 6. Avvia la funzione ricorsiva per popolare il foglio
ListTree path, ws, 3
End Sub
Private Sub ListTree(ByVal basePath As String, ByRef ws As Worksheet, ByVal startRow As Long)
' Definisce oggetti per il file system, cartelle, file e riga corrente
Dim fso As Object, folder As Object, subf As Object, file As Object
Dim r As Long
'1. Inizializza FileSystemObject e ottiene la cartella corrente
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(basePath)
r = startRow
'2. Scrive la cartella corrente nel foglio
ws.Cells(r, 1).Value = folder.Path
ws.Cells(r, 2).Value = "DIR"
ws.Cells(r, 3).Value = folder.Name
r = r + 1
'3. Elenca tutti i file nella cartella corrente
For Each file In folder.Files
ws.Cells(r, 1).Value = folder.Path
ws.Cells(r, 2).Value = "FILE"
ws.Cells(r, 3).Value = file.Name
r = r + 1
Next
'4. Per ogni sottocartella, scrive la cartella e richiama ricorsivamente ListTree
For Each subf In folder.SubFolders
ws.Cells(r, 1).Value = folder.Path
ws.Cells(r, 2).Value = "DIR"
ws.Cells(r, 3).Value = subf.Name
r = r + 1
' Chiamata ricorsiva per esplorare la sottocartella
ListTree subf.Path, ws, r
' Aggiorna riga corrente dopo la ricorsione
r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
Next
End Sub
Function SanitizeSheetName(ByVal s As String) As String
Dim i As Long
Dim invalidChars As Variant
invalidChars = Array("/", "\", "?", "*", "[", "]", ":", Chr(0))
For i = LBound(invalidChars) To UBound(invalidChars)
s = Replace(s, invalidChars(i), "_")
Next i
SanitizeSheetName = Left(s, 31)
End Function
Nota bene che il codice è commentato per aiutarti a comprendere cosa siano i vari passaggi.
Slava la macro scritta e torna al foglio Excel

Ora l’operazione successiva è trasformare la tua macro in un qualcosa che funziona al tuo comando. Quindi dobbiamo immaginare di usare un bel bottone. Puoi usare un bottone tra i componenti di Excel che hanno la bontà di apparire esteticamente come componenti windows veri e propri. Se hai abilitato il menu sviluppo è sufficiente andare nel menu e cercare “inserisci” (icona della cassetta degli attrezzi) e tra i componenti scegliere “Pulsante (controllo modulo)”. Oppure un via più graziosa e colorata si avvale dell’utilizzo delle forme.
Vai su “inserisci”→ “illustrazioni”→ “forme” e scegli una forma che ti piaccia. Io ho scelto rettangolo con angoli arrotondati. Disegnala sul foglio in una posizione che ti piace, e potrai sempre spostarlo in un secondo momento.
Dopodiché scrivi l’indicazione o il nome della funzione, che vuoi sia letta sul pulsante, come in foto. Ti basterà cliccare al centro della forma per far comparire il cursore e scrivere. Infine, tasto destro sulla forma e, importantissimo passaggio, seleziona la voce “assegna macro”. Ti comparirà una finestra in cui potrai sceglie la macro “ViewElenco_Recursive”. Senza questo passaggio la forma non si comporterà come un pulsante e la tua preziosa istruzione non funzionerà.
Ora, se hai seguito tutte le istruzioni ti basterà cliccare sul pulsante e verificare cosa accade. Prima di scrivere la frase precedente ho personalmente ripercorso ed eseguito tutti i passaggi e non ho riscontrato errori. Se tuttavia tu ne riscontrassi scrivi nei commenti e sarò lieto di aiutarti.
Grazie del tuo prezioso tempo
L.C.



Lascia un commento