[Pubblichiamo un estratto di Business Intelligence con Excel dedicato all’estrazione dei dati dal web in maniera semiautomatica; attività con utilizzi potenziali promettenti per una piccola impresa o una startup.]
Vogliamo scaricare dal web alcune informazioni utili a creare un elenco di ristoranti con indirizzo e numero di telefono attraverso una macro, ossia costruendo una procedura con l’aiuto del linguaggio Visual Basic, Application Edition (VB) che può essere eseguita direttamente da Excel. Tra i file degli esempi disponibili online per Business Intelligence con Excel è presente la cartella ImportazioneWebMacro.xlsm che contiene il foglio con i dati scaricati e una macro già preparata, ma con un nome differente, per evitare sovrapposizioni con quanto spiegato nel resto del paragrafo. La cartella utilizza l’estensione .xlsm secondo lo standard di Microsoft per i file di Excel che contengono macro o codice VB.
La cartella contiene il foglio DatiScaricati, con tutti i dati presi da Internet. Si dovrà inserire il nuovo foglio Ristoranti dove la macro scriverà i dati man mano che verranno estratti dal foglio dei dati grezzi; nella prima riga del foglio inserire i titoli dei campi come è mostrato nella prossima figura, porre il carattere in grassetto, allineare al centro in orizzontale e verticale.
Selezionare tutte le celle del foglio facendo clic sul quadratino all’intersezione delle intestazioni di riga e colonna (seconda figura dell’articolo), selezionare il comando Testo a capo e sul riquadro Celle della scheda Home fare clic su Formato e poi su Adatta altezza righe. Allargare le colonne in modo che possano contenere nomi lunghi anche se suddivisi su più righe; stringere le colonne destinate a contenere pochi caratteri (cap, provincia). Il foglio Ristoranti è pronto per l’uso.
Per ridurre il numero di istruzioni da far eseguire al programma, ma soprattutto per semplificarlo e rendere più leggibile il codice VB, abbiamo pensato di ricorrere a un piccolo trucco utile per i lettori con poca dimestichezza con la programmazione. Si dovrà inserire una nuova riga al fondo della tabella dei dati scaricati nella quale scrivere la stringa XXXXX (cinque “X” di fila); questa stringa verrà utilizzata per eseguire in modo semplificato il test sulla fine delle righe della tabella (come nella figura qui sotto).
Il diagramma di flusso
Prima di scrivere le istruzioni, i programmatori disegnano un diagramma di flusso che descriva il percorso logico per leggere e trattare i dati, utilizzando dei test in grado di scegliere le azioni da eseguire a seconda del tipo di dato e di separare le singole componenti dei dati letti per inserirle nei campi predisposti sul foglio Ristoranti. Il percorso logico che la macro svolgerà sarà esattamente lo stesso che è stato seguito per risolvere l’esercizio all’inizio del capitolo. Il diagramma di flusso è riportato nella prossima figura.
Prima di commentarlo brevemente, occorre fornire qualche elemento per facilitarne la lettura: sul diagramma semplificato che viene presentato sono presenti rombi e rettangoli, legati da frecce che indicano il flusso logico o meglio, il percorso da seguire. Il percorso è unico, ma in presenza di un rombo (che rappresenta sempre una domanda o un test), il percorso si biforca a seconda della risposta da dare al test: SI (VERO) o NO (FALSO). Se la risposta al test logico è SI (VERO) l’esecuzione del programma seguirà quella strada, altrimenti la risposta non può che essere NO (FALSO) e quindi si seguirà la strada alternativa.
I rettangoli riassumono le azioni da eseguire, azioni che andranno tradotte in istruzioni informatiche, come si vedrà nel paragrafo di commento al programma. Il flusso del programma è semplice da illustrare: partendo dall’ovale di inizio della macro, seguendo la freccia verso il basso verranno inserite le istruzioni per leggere una riga della tabella (più propriamente si parla di un record) ed eseguire subito il primo test: si è letto l’ultimo record della tabella, quello con XXXXX?
Sì, no, vero, falso
Se la risposta sarà SI (VERO) il percorso andrà verso la fine della macro. In alternativa (risposta NO) verrà eseguito un secondo test: il record appena letto contiene quei caratteri (ricordate, il punto e lo spazio) che permettono di contraddistinguerlo come la riga del nome del ristorante? Anche qui vi sono due alternative: se la risposta sarà negativa, seguendo la freccia, la macro leggerà la riga successiva ricominciando nuovamente il ciclo per ripeterlo fino a quando non verrà letto un record con il nome.
Se invece sarà un record con il nome, allora verranno eseguite in successione: le istruzioni per estrarre il nome e la ragione sociale e scriverla sul foglio Ristoranti, le istruzioni per leggere la quinta riga successiva con il o i numeri di telefono e scriverla nel campo dedicato sempre sul foglio Ristoranti. Infine si leggerà la terza riga per eseguire l’ultimo test: la riga letta contiene i caratteri (ricordate, il trattino e la parentesi aperta) che permettono di contraddistinguerla come l’indirizzo del ristorante? Se la risposta sarà affermativa, dal record letto verranno estratti indirizzo, CAP, città e provincia e scritti sul foglio Ristoranti. In caso contrario l’indirizzo sarà scritto nella quarta riga e quindi dopo averla letta si procederà con le stesse istruzioni di prima.
Terminate queste istruzioni il programma ripartirà dall’inizio con la lettura di un nuovo record. Il ciclo verrà percorso tante volte quante saranno le righe della tabella da leggere e terminerà quando verrà letta la riga con le X. Questo flusso logico può essere tradotto in un qualsiasi linguaggio di programmazione (Visual Basic, C, PHP, Java e così via), ma utilizzando Excel la scelta obbligata cadrà su VB. Di seguito viene mostrato il codice della macro, esattamente come andrà scritto nell’ambiente di sviluppo di Visual Basic.
Public Sub Estrai_Informazioni ()
Dim NumRigaDati As Long
Dim Temp As String
Dim RigaElenco As Long
Dim InizioRagioneSociale As Integer
Dim FineRagioneSociale As
Dim DatiSeparati As Variant
RigaElenco = 1
For NumRigaDati = 1 To 100000
Temp = Sheets("DatiScaricati").Cells(NumRigaDati, 1)
If Temp = "XXXXX" Then Exit For
If InStr(1, Temp, ". ") = 2 Or InStr(1, Temp, ". ") = 3 Then
RigaElenco = RigaElenco + 1
InizioRagioneSociale = InStr(1, Temp, " ")
FineRagioneSociale = InStr(1, Temp, "Voto") + InStr(1, Temp, "Scrivi")
Sheets("Ristoranti").Cells(RigaElenco, 1) = _
Mid$(Temp, InizioRagioneSociale + 1, FineRagioneSociale -
(InizioRagioneSociale + 1) - 1)
Sheets("Ristoranti").Cells(RigaElenco, 2) = ¬
Sheets("DatiScaricati").Cells(NumRigaDati + 4, 1)
If InStr(1, Sheets("download").Cells(NumRigaDati + 2, 1), "(") > 0 _
And InStr(1,Sheets("download").Cells(NumRigaDati+2,1), ")") > 0 Then
Temp = Sheets("download").Cells(NumRigaDati + 2, 1)
Else
Temp = Sheets("download").Cells(NumRigaDati + 3, 1)
End If
DatiSeparati = Split(Temp, "-")
Sheets("Ristoranti").Cells(RigaElenco, 3) = Trim$(DatiSeparati(0))
Temp = Trim$(DatiSeparati(1))
Sheets("Ristoranti").Cells(RigaElenco, 4) = Left$(Temp, 5)
Sheets("Ristoranti").Cells(RigaElenco, 5) = Mid$(Temp, 7, Len(Temp) -7 -3)
Sheets("Ristoranti").Cells(RigaElenco, 6) = Mid$(Temp, Len(Temp) - 2, 2)
End If
Next NumRigaDati
MsgBox "Estrazione dati terminata con successo"
End Sub