«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo

giovedì 29 agosto 2013

L'uomo che sussurrava a Excel

L'inizio di questo pezzo è Youtube e una sua fastidiosa politica. Quando un video musicale per qualsiasi motivo viene rimosso, nelle collezioni che lo contenevano rimane un “buco”. Non ci sarebbe niente di male se al suo posto rimanesse un avviso del tipo “Il video Viva la Vida è stato rimosso perché ...”. Invece no, appare solo la scritta che “un” video non c'è più: in questa maniera mi è impossibile sostituirlo perché, ovviamente, non ricordo cosa c'era al posto del “buco”

Questo fino a qualche mese fa. All'ennesima moria di video mi sono deciso a fare una copia della lista delle mie collezioni su Youtube in un foglio di calcolo. Niente di complicato: numero del video, autore e titolo della canzone. In questa maniera, quando un brano è rimosso, posso controllare la mia lista ed eventualmente ricercare un'altra versione della canzone eliminata.

Col tempo si è però manifestato un problema inizialmente non troppo appariscente: ogni volta che cancello il numero d'ordine di un brano devo aggiornare tutti i seguenti. Siccome col tempo si formano tanti “buchi” non posso fare una “strisciata” unica sulla relativa colonna del foglio di calcolo ma devo aggiornare separatamente ogni intervallo di brani consecutivi; considerando che ormai i miei brani sono quasi 400 (su due diverse collezioni) questo lavoretto di aggiornamento stava diventando piuttosto impegnativo.

Così pochi giorni fa mi sono deciso ad affrontare il problema alla radice: trovare una formula da sostituire alla mia semplice lista di numeri. Intuivo che questo esercizio non fosse particolarmente complicato ma, vista la mia scarsa conoscenza del programma, non sapevo come risolverlo.

Comunque ho iniziato a cercare in rete e alla fine ho trovato qualcosa di simile al mio problema: ovvero “Find Last non empty cell in a column” (“Trova l'ultima cella non vuota in una colonna”) con la seguente formula proposta come soluzione:

=MAX((NOT(ISBLANK($A$1:$A$100))*ROW($A$1:$A$100)))
use Ctrl+Shift+Invio to enter the formula.

Notare la postilla. Inizialmente l'ignoravo e infatti non funzionava niente. Alla fine ho fatto qualche ricerca e ho scoperto che inserendo la formula con la combinazione di tasti Ctrl+Shift+Invio si hanno le cosiddette “array formula”: non entro nei dettagli ma in questa maniera funzionava...

Comunque ancora non ero che a metà dell'opera: a me non bastava trovare l'ultima cella vuota ma mi serviva il suo contenuto incrementato di uno. Inoltre il mio intervallo su cui effettuare la ricerca non era fisso sulle prime cento celle della colonna A ma era variabile: ovvero tutte le celle precedenti alla cella corrente!

Dopo molti esperimenti avevo risolto il primo problema adattando la formula iniziale nel seguente modo e inserendola in modalità “array”:
=MAX(ISNUMBER($A$1:$A$100)*INDEX($A$1:$A$100))+1
Il problema di referenziare la cella corrente per rendere l'intervallo variabile mi faceva però impazzire: stranamente non sembrava esistere nessuna funzione per indicare la cella in uso.
La funzione CURRENT(), ad esempio, fa tutt'altro...
Non voglio dilungarmi sui miei esperimenti ma passo dopo passo avevo scoperto che: ROW() e COLUMN() restituiscono la riga e colonna corrente; così ho iniziato a usare cose del tipo INDIRECT(ADDRESS(ROW();COLUMN()))...e ho scoperto la necessità di attivare un'impostazione per permettere i riferimenti circolari!
Comunque alla fine la mia complicatissima formula non funzionava perché l'innaturale costruzione dell'intervallo non veniva accettata.
Questo è uno dei tanti esperimenti (e nemmeno il più complesso) che avevo fatto:
=MAX(ISNUMBER($A$1:INDIRECT(ADDRESS(ROW();COLUMN())))*INDEX($A$1:INDIRECT(ADDRESS(ROW();COLUMN()))))+1

Dopo quasi un'ora di prove sempre più frustranti mi sono rivolto a un amico noto al mondo come “l'uomo che sussurra a Excel” e gli ho spiegato il mio problema. Già per telefono mi ha indicato una soluzione alternativa che rendeva banale, sebbene non automatico, l'aggiornamento del progressivo della mia lista di canzoni. Dopo poco mi ha mandato un'e-pistola con la soluzione che volevo: una bella formula semplice e chiara!
La formula è questa (per la cella A10):
=MAX($A$1:A9)+1

E non c'è bisogno di “array formula”...
Davvero molto istruttivo: mi sono reso conto che il problema sul quale sbattevo la testa era in realtà banale: per indicare la cella corrente basta usare il nome della cella stessa! Ci pensa poi il foglio di calcolo ad aggiornare tale nome ogni volta che copiamo la formula in una nuova cella...

Conclusione: la soluzione era banale, ne conoscevo già tutti gli elementi eppure non mi era riuscito rimettere tutto insieme. Soprattutto il mio tentativo di referenziare la cella corrente mi stava portando fuori strada...
Volendo vedere il bicchiere mezzo pieno ho almeno capito cosa sono le “array formula” e non credo che le userò mai più!

Conclusione alternativa (filosofica e faceta): è importante conoscere se stessi ed essere spontanei altrimenti non si viene capiti. Ad esempio, se si è una cella in un foglio di calcolo, non ci dobbiamo presentare agli altri in maniera complessa e indiretta, ma semplicemente essendo noi stessi ovvero con un “Ciao io sono la cella GB71...”

Nessun commento:

Posta un commento